[PATCH] echo-cancel: Try to minimise in-flight chunks in snapshot latency

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

diff --git a/src/modules/echo-cancel/module-echo-cancel.c b/src/modules/echo-cancel/module-echo-cancel.c
index dfd05b6..ed75e0c 100644
--- a/src/modules/echo-cancel/module-echo-cancel.c
+++ b/src/modules/echo-cancel/module-echo-cancel.c
@@ -683,8 +683,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);
-- 
2.9.3



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux