diff --git a/modules/audio_processing/aec3/aec_state.cc b/modules/audio_processing/aec3/aec_state.cc index db61c5a118..bc987c40e1 100644 --- a/modules/audio_processing/aec3/aec_state.cc +++ b/modules/audio_processing/aec3/aec_state.cc @@ -167,6 +167,12 @@ void AecState::Update( blocks_since_converged_filter_ = converged_filter ? 0 : blocks_since_converged_filter_ + 1; } + if (converged_filter) { + active_blocks_since_converged_filter_ = 0; + } else if (active_render_block) { + ++active_blocks_since_converged_filter_; + } + bool recently_converged_filter = blocks_since_converged_filter_ < 60 * kNumBlocksPerSecond; @@ -198,6 +204,13 @@ void AecState::Update( converged_filter_seen_ = converged_filter_seen_ || converged_filter; + // If no filter convergence is seen for a long time, reset the estimated + // properties of the echo path. + if (active_blocks_since_converged_filter_ > 60 * kNumBlocksPerSecond) { + converged_filter_seen_ = false; + finite_erl_ = false; + } + // After an amount of active render samples for which an echo should have been // detected in the capture signal if the ERL was not infinite, flag that a // transparent mode should be entered. diff --git a/modules/audio_processing/aec3/aec_state.h b/modules/audio_processing/aec3/aec_state.h index 9e7c7b2c1d..e1ff492c51 100644 --- a/modules/audio_processing/aec3/aec_state.h +++ b/modules/audio_processing/aec3/aec_state.h @@ -175,6 +175,7 @@ class AecState { bool external_delay_seen_ = false; size_t converged_filter_count_ = 0; bool finite_erl_ = false; + size_t active_blocks_since_converged_filter_ = 0; RTC_DISALLOW_COPY_AND_ASSIGN(AecState); };