/*
- * Copyright (C) 2005-2013 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005 Andre Noll <maan@tuebingen.mpg.de>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
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(). */
&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);
+ &period_time, NULL);
if (ret < 0)
goto fail;
return -E_ALSA;
}
-static void alsa_write_pre_select(struct sched *s, struct task *t)
+static void alsa_write_pre_select(struct sched *s, void *context)
{
struct pollfd pfd;
- struct writer_node *wn = container_of(t, struct writer_node, task);
+ struct writer_node *wn = context;
struct private_alsa_write_data *pad = wn->private_data;
int ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF);
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",
free(pad);
}
-static int alsa_write_post_select(__a_unused struct sched *s,
- struct task *t)
+static int alsa_write_post_select(__a_unused struct sched *s, void *context)
{
- struct writer_node *wn = container_of(t, struct writer_node, task);
+ struct writer_node *wn = context;
struct private_alsa_write_data *pad = wn->private_data;
struct btr_node *btrn = wn->btrn;
char *data;
snd_pcm_sframes_t frames;
int ret;
- ret = task_get_notification(t);
+ ret = task_get_notification(wn->task);
if (ret < 0)
goto err;
again: