]> code.delx.au - pulseaudio/blobdiff - src/modules/alsa/alsa-util.c
alsa-util: Reset hwparams_copy before the second try of buffer setup
[pulseaudio] / src / modules / alsa / alsa-util.c
index 75f58580a0e38ae537603d8989e8fb5f975a6541..1ce2e16d5f0cd1c7dd6252aa42d831f73158b6ff 100644 (file)
@@ -245,6 +245,12 @@ int pa_alsa_set_hw_params(
     if (!pa_alsa_pcm_is_hw(pcm_handle))
         _use_tsched = false;
 
+    /* The PCM pointer is only updated with period granularity */
+    if (snd_pcm_hw_params_is_batch(hwparams)) {
+        pa_log_info("Disabling tsched mode since BATCH flag is set");
+        _use_tsched = false;
+    }
+
 #if (SND_LIB_VERSION >= ((1<<16)|(0<<8)|24)) /* API additions in 1.0.24 */
     if (_use_tsched) {
 
@@ -321,6 +327,7 @@ int pa_alsa_set_hw_params(
                 goto success;
             }
 
+            snd_pcm_hw_params_copy(hwparams_copy, hwparams);
             /* Second try: set period size first, followed by buffer size */
             if (set_period_size(pcm_handle, hwparams_copy, _period_size) >= 0 &&
                 set_buffer_size(pcm_handle, hwparams_copy, _buffer_size) >= 0 &&
@@ -862,11 +869,11 @@ void pa_alsa_refcnt_dec(void) {
     }
 }
 
-bool pa_alsa_init_description(pa_proplist *p) {
+bool pa_alsa_init_description(pa_proplist *p, pa_card *card) {
     const char *d, *k;
     pa_assert(p);
 
-    if (pa_device_init_description(p))
+    if (pa_device_init_description(p, card))
         return true;
 
     if (!(d = pa_proplist_gets(p, "alsa.card_name")))