[pulseaudio-discuss] [PATCH] echo-cancel: Don't skip canceller when sink is inactive
Alexander E. Patrakov
patrakov at gmail.com
Fri Dec 11 05:56:44 PST 2015
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);
>
More information about the pulseaudio-discuss
mailing list