summaryrefslogtreecommitdiffstats
path: root/src/modules/alsa-util.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2007-08-03 23:48:52 +0000
committerLennart Poettering <lennart@poettering.net>2007-08-03 23:48:52 +0000
commit95fab184d5448bff9f262589390c7374fb1370c8 (patch)
treecf4ef1071c62bfa5492655243d105972494867a4 /src/modules/alsa-util.c
parenta6c44c0e508ede5c25ebac534642d93d101be21e (diff)
Don't stop hardware on buffer underruns. Instead continue playing to guarantee that our time function stays as linear as possible.
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1566 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src/modules/alsa-util.c')
-rw-r--r--src/modules/alsa-util.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/src/modules/alsa-util.c b/src/modules/alsa-util.c
index dd9ac79e..dd063f3b 100644
--- a/src/modules/alsa-util.c
+++ b/src/modules/alsa-util.c
@@ -289,10 +289,11 @@ int pa_alsa_set_hw_params(snd_pcm_t *pcm_handle, pa_sample_spec *ss, uint32_t *p
pa_assert(periods);
pa_assert(period_size);
+ snd_pcm_hw_params_alloca(&hwparams);
+
buffer_size = *periods * *period_size;
- if ((ret = snd_pcm_hw_params_malloc(&hwparams)) < 0 ||
- (ret = snd_pcm_hw_params_any(pcm_handle, hwparams)) < 0 ||
+ if ((ret = snd_pcm_hw_params_any(pcm_handle, hwparams)) < 0 ||
(ret = snd_pcm_hw_params_set_rate_resample(pcm_handle, hwparams, 0)) < 0)
goto finish;
@@ -355,12 +356,36 @@ int pa_alsa_set_hw_params(snd_pcm_t *pcm_handle, pa_sample_spec *ss, uint32_t *p
ret = 0;
finish:
- if (hwparams)
- snd_pcm_hw_params_free(hwparams);
return ret;
}
+int pa_alsa_set_sw_params(snd_pcm_t *pcm) {
+ snd_pcm_sw_params_t *swparams;
+ int err;
+
+ pa_assert(pcm);
+
+ snd_pcm_sw_params_alloca(&swparams);
+
+ if ((err = snd_pcm_sw_params_current(pcm, swparams) < 0)) {
+ pa_log_warn("Unable to determine current swparams: %s\n", snd_strerror(err));
+ return err;
+ }
+
+ if ((err = snd_pcm_sw_params_set_stop_threshold(pcm, swparams, (snd_pcm_uframes_t) -1)) < 0) {
+ pa_log_warn("Unable to set stop threshold: %s\n", snd_strerror(err));
+ return err;
+ }
+
+ if ((err = snd_pcm_sw_params(pcm, swparams)) < 0) {
+ pa_log_warn("Unable to set sw params: %s\n", snd_strerror(err));
+ return err;
+ }
+
+ return 0;
+}
+
int pa_alsa_prepare_mixer(snd_mixer_t *mixer, const char *dev) {
int err;