From 8092a0a63730307ae34033ffcb1401d2427e4aa9 Mon Sep 17 00:00:00 2001 From: Jonas Holmberg Date: Fri, 21 Oct 2022 14:53:26 +0200 Subject: [PATCH] module-echo-cancel: Run canceller on first frames Run canceller on the first frames when play delay is not a multiple of the chunk size. --- src/modules/module-echo-cancel.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/modules/module-echo-cancel.c b/src/modules/module-echo-cancel.c index 5639efa69..a0e245484 100644 --- a/src/modules/module-echo-cancel.c +++ b/src/modules/module-echo-cancel.c @@ -279,11 +279,21 @@ static void process(struct impl *impl) /* don't run the canceller until play_buffer has been filled, * copy silence to output in the meantime */ silence_size = SPA_MIN(size, delay_left * sizeof(float)); - for (i = 0; i < impl->info.channels; i++) { + for (i = 0; i < impl->info.channels; i++) memset(out[i], 0, silence_size); - } impl->current_delay += silence_size / sizeof(float); pw_log_debug("current_delay %d", impl->current_delay); + + if (silence_size != size) { + const float *pd[impl->info.channels]; + float *o[impl->info.channels]; + + for (i = 0; i < impl->info.channels; i++) { + pd[i] = play_delayed[i] + delay_left; + o[i] = out[i] + delay_left; + } + spa_audio_aec_run(impl->aec, rec, pd, o, delay_left); + } } else { /* run the canceller */ spa_audio_aec_run(impl->aec, rec, play_delayed, out, size / sizeof(float));