]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - alsa_write.c
Merge branch 't/cpsi_improvement'
[paraslash.git] / alsa_write.c
index 358b6346581dc813815419592823046231eab61f..3759306ec2215f0732bba5fcc76d18d011db41e1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2013 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2014 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -50,7 +50,7 @@ struct private_alsa_write_data {
        snd_pcm_format_t sample_format;
        /* The number of channels, again determined like \a sample_rate. */
        unsigned channels;
-       /* time until buffer underrun occurs, in microseconds */
+       /* time until buffer underrun occurs, in milliseconds */
        unsigned buffer_time;
        struct timeval drain_barrier;
        /* File descriptor for select(). */
@@ -114,19 +114,15 @@ static int alsa_init(struct private_alsa_write_data *pad,
                &pad->sample_rate, NULL);
        if (ret < 0)
                goto fail;
-       msg = "unable to get buffer time";
-       ret = snd_pcm_hw_params_get_buffer_time_max(hwparams, &pad->buffer_time,
-               NULL);
-       if (ret < 0 || pad->buffer_time == 0)
-               goto fail;
-       /* buffer at most 500 milliseconds */
-       pad->buffer_time = PARA_MIN(pad->buffer_time, 500U * 1000U);
+       /* alsa wants microseconds */
+       pad->buffer_time = conf->buffer_time_arg * 1000;
        msg = "could not set buffer time";
        ret = snd_pcm_hw_params_set_buffer_time_near(pad->handle, hwparams,
                &pad->buffer_time, NULL);
        if (ret < 0)
                goto fail;
-       period_time = pad->buffer_time / 4;
+       pad->buffer_time /= 1000; /* we prefer milliseconds */
+       period_time = pad->buffer_time * 250; /* buffer time / 4 */
        msg = "could not set period time";
        ret = snd_pcm_hw_params_set_period_time_near(pad->handle, hwparams,
                &period_time, 0);
@@ -223,7 +219,7 @@ static void alsa_write_pre_select(struct sched *s, struct task *t)
                return;
        }
        /* wait at most 50% of the buffer time */
-       sched_request_timeout_ms(pad->buffer_time / 2 / 1000, s);
+       sched_request_timeout_ms(pad->buffer_time / 2, s);
        ret = snd_pcm_poll_descriptors(pad->handle, &pfd, 1);
        if (ret < 0) {
                PARA_ERROR_LOG("could not get alsa poll fd: %s\n",