fix draining not to lose samples in pre buffer
authorJaska Uimonen <jaska.uimonen@intel.com>
Mon, 4 Mar 2013 07:24:37 +0000 (09:24 +0200)
committerJaska Uimonen <jaska.uimonen@intel.com>
Tue, 12 Mar 2013 08:19:03 +0000 (10:19 +0200)
src/pulsecore/memblockq.c
src/pulsecore/memblockq.h
src/pulsecore/protocol-native.c

index 18066f7..2dd08bc 100644 (file)
@@ -814,6 +814,19 @@ void pa_memblockq_prebuf_disable(pa_memblockq *bq) {
     bq->in_prebuf = FALSE;
 }
 
+void pa_memblockq_prebuf_disable_and_adjust(pa_memblockq *bq) {
+    size_t len;
+
+    pa_assert(bq);
+
+    bq->in_prebuf = FALSE;
+
+    if (bq->prebuf > 0 && (len = pa_memblockq_get_length(bq)) > 0) {
+       pa_log("adjusting prebuf length to %u", len);
+       bq->prebuf = len;
+    }
+}
+
 void pa_memblockq_prebuf_force(pa_memblockq *bq) {
     pa_assert(bq);
 
index 08c0bf0..0a7f9df 100644 (file)
@@ -134,6 +134,9 @@ void pa_memblockq_flush_read(pa_memblockq *bq);
 /* Ignore prebuf for now */
 void pa_memblockq_prebuf_disable(pa_memblockq *bq);
 
+/* Ignore prebuf for now and adjust prebuf size to actual size */
+void pa_memblockq_prebuf_disable_and_adjust(pa_memblockq *bq);
+
 /* Force prebuf */
 void pa_memblockq_prebuf_force(pa_memblockq *bq);
 
index 41fc0a0..8c45a33 100644 (file)
@@ -1487,8 +1487,14 @@ static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int
                     break;
 
                 case SINK_INPUT_MESSAGE_DRAIN:
+                   if (i->thread_info.state == PA_SINK_INPUT_CORKED)
+                       func = pa_memblockq_prebuf_disable_and_adjust;
+                   else
+                       func = pa_memblockq_prebuf_disable;
+                    break;
+
                 case SINK_INPUT_MESSAGE_TRIGGER:
-                    func = pa_memblockq_prebuf_disable;
+                   func = pa_memblockq_prebuf_disable;
                     break;
 
                 default: