[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