]> code.delx.au - pulseaudio/commitdiff
alsa: distuingish real underruns from left_to_play=0
authorLennart Poettering <lennart@poettering.net>
Tue, 1 Sep 2009 02:54:18 +0000 (04:54 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 1 Sep 2009 02:54:18 +0000 (04:54 +0200)
src/modules/alsa/alsa-sink.c
src/modules/alsa/alsa-source.c

index 07d5388051c3a31fa789deb56fd6abccb43b90de..afea8e088304d37a861fbdd84b04498a154c7131 100644 (file)
@@ -410,6 +410,7 @@ static int try_recover(struct userdata *u, const char *call, int err) {
 
 static size_t check_left_to_play(struct userdata *u, size_t n_bytes, pa_bool_t on_timeout) {
     size_t left_to_play;
+    pa_bool_t underrun = FALSE;
 
     /* We use <= instead of < for this check here because an underrun
      * only happens after the last sample was processed, not already when
@@ -422,6 +423,7 @@ static size_t check_left_to_play(struct userdata *u, size_t n_bytes, pa_bool_t o
 
         /* We got a dropout. What a mess! */
         left_to_play = 0;
+        underrun = TRUE;
 
 #ifdef DEBUG_TIMING
         PA_DEBUG_TRAP;
@@ -443,7 +445,7 @@ static size_t check_left_to_play(struct userdata *u, size_t n_bytes, pa_bool_t o
         pa_bool_t reset_not_before = TRUE;
 
         if (!u->first && !u->after_rewind) {
-            if (left_to_play < u->watermark_inc_threshold)
+            if (underrun || left_to_play < u->watermark_inc_threshold)
                 increase_watermark(u);
             else if (left_to_play > u->watermark_dec_threshold) {
                 reset_not_before = FALSE;
index 165b2e3bef389cc72ceeba3adcf2ed51ab84fc50..643566b5fc7c01068ee2a5e041aa6a0ab93c4f92 100644 (file)
@@ -406,6 +406,7 @@ static int try_recover(struct userdata *u, const char *call, int err) {
 static size_t check_left_to_record(struct userdata *u, size_t n_bytes, pa_bool_t on_timeout) {
     size_t left_to_record;
     size_t rec_space = u->hwbuf_size - u->hwbuf_unused;
+    pa_bool_t overrun = FALSE;
 
     /* We use <= instead of < for this check here because an overrun
      * only happens after the last sample was processed, not already when
@@ -418,6 +419,7 @@ static size_t check_left_to_record(struct userdata *u, size_t n_bytes, pa_bool_t
 
         /* We got a dropout. What a mess! */
         left_to_record = 0;
+        overrun = TRUE;
 
 #ifdef DEBUG_TIMING
         PA_DEBUG_TRAP;
@@ -434,7 +436,7 @@ static size_t check_left_to_record(struct userdata *u, size_t n_bytes, pa_bool_t
     if (u->use_tsched) {
         pa_bool_t reset_not_before = TRUE;
 
-        if (left_to_record < u->watermark_inc_threshold)
+        if (overrun || left_to_record < u->watermark_inc_threshold)
             increase_watermark(u);
         else if (left_to_record > u->watermark_dec_threshold) {
             reset_not_before = FALSE;