18.11.2015 07:58, arun at accosted.net wrote: > From: Arun Raghavan <git at arunraghavan.net> > > This forces the canceller engine to be invoked even if playback is not > currently active. We need to do this for cases where the engine provides > additional processing that is independent of playback, such as noise > suppression and AGC. The commit message should, ideally, mention this bug: https://bugs.freedesktop.org/show_bug.cgi?id=83557 And it is fixed by the patch - ACK! > --- > src/modules/echo-cancel/module-echo-cancel.c | 12 +++--------- > 1 file changed, 3 insertions(+), 9 deletions(-) > > diff --git a/src/modules/echo-cancel/module-echo-cancel.c b/src/modules/echo-cancel/module-echo-cancel.c > index cd539a4..484281f 100644 > --- a/src/modules/echo-cancel/module-echo-cancel.c > +++ b/src/modules/echo-cancel/module-echo-cancel.c > @@ -794,7 +794,7 @@ static void do_push_drift_comp(struct userdata *u) { > > /* This one's simpler than the drift compensation case -- we just iterate over > * the capture buffer, and pass the canceller blocksize bytes of playback and > - * capture data. > + * capture data. If playback is currently inactive, we just push silence. > * > * Called from source I/O thread context. */ > static void do_push(struct userdata *u) { > @@ -880,12 +880,6 @@ static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk) > return; > } > > - if (PA_UNLIKELY(u->source->thread_info.state != PA_SOURCE_RUNNING || > - u->sink->thread_info.state != PA_SINK_RUNNING)) { > - pa_source_post(u->source, chunk); > - return; > - } > - > /* handle queued messages, do any message sending of our own */ > while (pa_asyncmsgq_process_one(u->asyncmsgq) > 0) > ; > @@ -942,8 +936,8 @@ static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk) > u->sink_skip -= to_skip; > } > > - /* process and push out samples */ > - if (u->ec->params.drift_compensation) > + /* process and push out samples, do drift compensation only if the sink is actually running */ > + if (u->ec->params.drift_compensation && u->sink->thread_info.state == PA_SINK_RUNNING) > do_push_drift_comp(u); > else > do_push(u); >