[pulseaudio-commits] src/modules

Arun Raghavan arun at kemper.freedesktop.org
Wed Mar 29 05:34:53 UTC 2017


 src/modules/echo-cancel/module-echo-cancel.c |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

New commits:
commit 2c2ca1c949553b59c54431ec179b31a697004492
Author: Arun Raghavan <arun at arunraghavan.net>
Date:   Thu Mar 9 09:58:23 2017 +0530

    echo-cancel: Try to minimise in-flight chunks in snapshot latency
    
    We don't always know whether the in-flight memory chunks will be
    rendered or skipped (if the source is not in RUNNING). This can cause us
    to have an erroneous estimate of drift, particularly when the canceller
    starts.
    
    To avoid this, we explicitly flush out the send and receive sides of the
    message queue of audio chunks going from the sink to the source before
    trying to perform a resync.

diff --git a/src/modules/echo-cancel/module-echo-cancel.c b/src/modules/echo-cancel/module-echo-cancel.c
index 14a148a3..4f80be40 100644
--- a/src/modules/echo-cancel/module-echo-cancel.c
+++ b/src/modules/echo-cancel/module-echo-cancel.c
@@ -689,8 +689,13 @@ static void do_resync(struct userdata *u) {
     pa_log("Doing resync");
 
     /* update our snapshot */
-    source_output_snapshot_within_thread(u, &latency_snapshot);
+    /* 1. Get sink input latency snapshot, might cause buffers to be sent to source thread */
     pa_asyncmsgq_send(u->sink_input->sink->asyncmsgq, PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT, &latency_snapshot, 0, NULL);
+    /* 2. Pick up any in-flight buffers (and discard if needed) */
+    while (pa_asyncmsgq_process_one(u->asyncmsgq))
+        ;
+    /* 3. Now get the source output latency snapshot */
+    source_output_snapshot_within_thread(u, &latency_snapshot);
 
     /* calculate drift between capture and playback */
     diff_time = calc_diff(u, &latency_snapshot);



More information about the pulseaudio-commits mailing list