diff --git a/api/audio/echo_canceller3_config.h b/api/audio/echo_canceller3_config.h index 6eb91aa845..7b3ced38fd 100644 --- a/api/audio/echo_canceller3_config.h +++ b/api/audio/echo_canceller3_config.h @@ -54,6 +54,7 @@ struct EchoCanceller3Config { size_t config_change_duration_blocks = 250; float initial_state_seconds = 2.5f; + bool conservative_initial_phase = false; } filter; struct Erle { diff --git a/modules/audio_processing/aec3/aec_state.cc b/modules/audio_processing/aec3/aec_state.cc index 09a42bff58..1d5070f2de 100644 --- a/modules/audio_processing/aec3/aec_state.cc +++ b/modules/audio_processing/aec3/aec_state.cc @@ -130,10 +130,16 @@ AecState::AecState(const EchoCanceller3Config& config) enforce_delay_after_realignment_(EnableEnforcingDelayAfterRealignment()), allow_linear_mode_with_diverged_filter_( EnableLinearModeWithDivergedFilter()), - early_filter_usage_activated_(EnableEarlyFilterUsage()), - use_short_initial_state_(EnableShortInitialState()), - convergence_trigger_linear_mode_(EnableConvergenceTriggeredLinearMode()), - no_alignment_required_for_linear_mode_(EnableNoWaitForAlignment()), + early_filter_usage_activated_(EnableEarlyFilterUsage() && + !config.filter.conservative_initial_phase), + use_short_initial_state_(EnableShortInitialState() && + !config.filter.conservative_initial_phase), + convergence_trigger_linear_mode_( + EnableConvergenceTriggeredLinearMode() && + !config.filter.conservative_initial_phase), + no_alignment_required_for_linear_mode_( + EnableNoWaitForAlignment() && + !config.filter.conservative_initial_phase), use_uncertainty_until_sufficiently_adapted_( EnableUncertaintyUntilSufficientAdapted()), transparent_mode_enforces_nonlinear_mode_( diff --git a/modules/audio_processing/test/audio_processing_simulator.cc b/modules/audio_processing/test/audio_processing_simulator.cc index 9a353bd189..160798dd1d 100644 --- a/modules/audio_processing/test/audio_processing_simulator.cc +++ b/modules/audio_processing/test/audio_processing_simulator.cc @@ -214,6 +214,8 @@ EchoCanceller3Config ParseAec3Parameters(const std::string& filename) { &cfg.filter.config_change_duration_blocks); ReadParam(section, "initial_state_seconds", &cfg.filter.initial_state_seconds); + ReadParam(section, "conservative_initial_phase", + &cfg.filter.conservative_initial_phase); } if (rtc::GetValueFromJsonObject(root, "erle", §ion)) {