diff --git a/modules/audio_processing/aec3/aec_state.cc b/modules/audio_processing/aec3/aec_state.cc index 84328acd6b..0ca8618bee 100644 --- a/modules/audio_processing/aec3/aec_state.cc +++ b/modules/audio_processing/aec3/aec_state.cc @@ -67,6 +67,11 @@ bool EnableUncertaintyUntilSufficientAdapted() { "WebRTC-Aec3ErleUncertaintyUntilSufficientlyAdaptedKillSwitch"); } +bool TreatTransparentModeAsNonlinear() { + return !field_trial::IsEnabled( + "WebRTC-Aec3TreatTransparentModeAsNonlinearKillSwitch"); +} + float ComputeGainRampupIncrease(const EchoCanceller3Config& config) { const auto& c = config.echo_removal_control.gain_rampup; return powf(1.f / c.first_non_zero_gain, 1.f / c.non_zero_gain_blocks); @@ -96,6 +101,8 @@ AecState::AecState(const EchoCanceller3Config& config) no_alignment_required_for_linear_mode_(EnableNoWaitForAlignment()), use_uncertainty_until_sufficiently_adapted_( EnableUncertaintyUntilSufficientAdapted()), + transparent_mode_enforces_nonlinear_mode_( + TreatTransparentModeAsNonlinear()), erle_estimator_(config.erle.min, config.erle.max_l, config.erle.max_h), max_render_(config_.filter.main.length_blocks, 0.f), gain_rampup_increase_(ComputeGainRampupIncrease(config_)), @@ -323,6 +330,9 @@ void AecState::Update( usable_linear_estimate_ = usable_linear_estimate_ && !diverged_filter; } } + if (transparent_mode_enforces_nonlinear_mode_) { + usable_linear_estimate_ = usable_linear_estimate_ && !TransparentMode(); + } use_linear_filter_output_ = usable_linear_estimate_ && !TransparentMode(); diverged_linear_filter_ = diverged_filter; diff --git a/modules/audio_processing/aec3/aec_state.h b/modules/audio_processing/aec3/aec_state.h index 3fd3328c5d..99353b34a0 100644 --- a/modules/audio_processing/aec3/aec_state.h +++ b/modules/audio_processing/aec3/aec_state.h @@ -181,6 +181,7 @@ class AecState { const bool convergence_trigger_linear_mode_; const bool no_alignment_required_for_linear_mode_; const bool use_uncertainty_until_sufficiently_adapted_; + const bool transparent_mode_enforces_nonlinear_mode_; ErlEstimator erl_estimator_; ErleEstimator erle_estimator_; size_t capture_block_counter_ = 0;