From 3bb114a6459c78ea4e7d2f84568361430f26ff20 Mon Sep 17 00:00:00 2001 From: John Grossman Date: Thu, 21 Jul 2011 10:59:55 -0700 Subject: pcm: add control for ASLA thresholds to pcm_open Add the ability to explicitly set start, stop and silence thresholds during tinyalsa's pcm_open. Setting any of these values to 0 in your pcm_config structure will cause the system to use its old defaults. --- include/tinyalsa/asoundlib.h | 12 ++++++++++++ pcm.c | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/include/tinyalsa/asoundlib.h b/include/tinyalsa/asoundlib.h index 8395766..2e8c3e0 100644 --- a/include/tinyalsa/asoundlib.h +++ b/include/tinyalsa/asoundlib.h @@ -59,6 +59,18 @@ struct pcm_config { unsigned int period_size; unsigned int period_count; enum pcm_format format; + + /* Values to use for the ALSA start, stop and silence thresholds. Setting + * any one of these values to 0 will cause the default tinyalsa values to be + * used instead. Tinyalsa defaults are as follows. + * + * start_threshold : period_count * period_size + * stop_threshold : period_count * period_size + * silence_threshold : 0 + */ + unsigned int start_threshold; + unsigned int stop_threshold; + unsigned int silence_threshold; }; /* Mixer control types */ diff --git a/pcm.c b/pcm.c index 341c214..300def5 100644 --- a/pcm.c +++ b/pcm.c @@ -427,11 +427,21 @@ struct pcm *pcm_open(unsigned int card, unsigned int device, sparams.tstamp_mode = SNDRV_PCM_TSTAMP_ENABLE; sparams.period_step = 1; sparams.avail_min = 1; - sparams.start_threshold = config->period_count * config->period_size; - sparams.stop_threshold = config->period_count * config->period_size; + + if (!config->start_threshold) + sparams.start_threshold = config->period_count * config->period_size; + else + sparams.start_threshold = config->start_threshold; + + if (!config->stop_threshold) + sparams.stop_threshold = config->period_count * config->period_size; + else + sparams.stop_threshold = config->stop_threshold; + sparams.xfer_align = config->period_size / 2; /* needed for old kernels */ sparams.silence_size = 0; - sparams.silence_threshold = 0; + sparams.silence_threshold = config->silence_threshold; + if (ioctl(pcm->fd, SNDRV_PCM_IOCTL_SW_PARAMS, &sparams)) { oops(pcm, errno, "cannot set sw params"); -- cgit v1.2.3-70-g09d2