aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Grossman <johngro@google.com>2011-07-21 10:59:55 -0700
committerSimon Wilson <simonwilson@google.com>2011-07-27 14:59:56 -0700
commit3bb114a6459c78ea4e7d2f84568361430f26ff20 (patch)
treec70ebb8db726110287cf163dcbe55e982fab73dd
parentee99f213b29297b1016bc6210c16085c0b3068de (diff)
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.
-rw-r--r--include/tinyalsa/asoundlib.h12
-rw-r--r--pcm.c16
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");