On Thu, 9 Mar 2017, at 03:27 PM, Georg Chini wrote: > On 09.03.2017 05:37, Arun Raghavan wrote: > > 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); > > While taking a look at the patch I noticed something else in the > do_resync(). > You are doing: > > source_output_snapshot_within_thread(u, &latency_snapshot); > pa_asyncmsgq_send(u->sink_input->sink->asyncmsgq, > PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT, > &latency_snapshot, 0, NULL); > > from the source thread. I tried something similar in module loopback and > found that you should not send a message to the sink thread from there. > > At least for bluetooth it looks like input and output is done in the > same thread, > so the pa_asyncmsg_send() will hang. I tested it with my headset and it > hangs > indeed. Interesting. Do you mean for HSP, or HFP, or ...? -- Arun