diff --git a/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc b/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc index b0922be677..4cee9633f7 100644 --- a/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc +++ b/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc @@ -17,7 +17,7 @@ namespace webrtc { AdaptiveModeLevelEstimatorAgc::AdaptiveModeLevelEstimatorAgc( ApmDataDumper* apm_data_dumper) : level_estimator_(apm_data_dumper) { - set_target_level_dbfs(kDefaultLevelDbfs); + set_target_level_dbfs(kDefaultAgc2LevelHeadroomDbfs); } // |audio| must be mono; in a multi-channel stream, provide the first (usually diff --git a/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h b/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h index df01dd9d27..484b128933 100644 --- a/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h +++ b/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h @@ -38,7 +38,7 @@ class AdaptiveModeLevelEstimatorAgc : public Agc { private: static constexpr int kTimeUntilConfidentMs = 700; - static constexpr int kDefaultLevelDbfs = 0; + static constexpr int kDefaultAgc2LevelHeadroomDbfs = -1; int32_t time_in_ms_since_last_estimate_ = 0; AdaptiveModeLevelEstimator level_estimator_; VadWithLevel agc2_vad_; diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc index 398b574174..b2eb998d8e 100644 --- a/modules/audio_processing/audio_processing_impl.cc +++ b/modules/audio_processing/audio_processing_impl.cc @@ -365,13 +365,15 @@ AudioProcessingImpl::AudioProcessingImpl( constants_(config.Get().startup_min_volume, config.Get().clipped_level_min, #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) - false, - false, - false), + /* enabled= */ false, + /* enabled_agc2_level_estimator= */ false, + /* digital_adaptive_disabled= */ false, + /* analyze_before_aec= */ false), #else config.Get().enabled, config.Get().enabled_agc2_level_estimator, - config.Get().digital_adaptive_disabled), + config.Get().digital_adaptive_disabled, + config.Get().analyze_before_aec), #endif #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) capture_(false), @@ -1221,6 +1223,13 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() { private_submodules_->agc_manager->AnalyzePreProcess( capture_buffer->channels()[0], capture_buffer->num_channels(), capture_nonlocked_.capture_processing_format.num_frames()); + + if (constants_.use_experimental_agc_process_before_aec) { + private_submodules_->agc_manager->Process( + capture_buffer->channels()[0], + capture_nonlocked_.capture_processing_format.num_frames(), + capture_nonlocked_.capture_processing_format.sample_rate_hz()); + } } if (submodule_states_.CaptureMultiBandSubModulesActive() && @@ -1290,7 +1299,8 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() { public_submodules_->voice_detection->ProcessCaptureAudio(capture_buffer); if (constants_.use_experimental_agc && - public_submodules_->gain_control->is_enabled()) { + public_submodules_->gain_control->is_enabled() && + !constants_.use_experimental_agc_process_before_aec) { private_submodules_->agc_manager->Process( capture_buffer->split_bands_const(0)[kBand0To8kHz], capture_buffer->num_frames_per_band(), capture_nonlocked_.split_rate); diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h index a95e150573..808e3f907a 100644 --- a/modules/audio_processing/audio_processing_impl.h +++ b/modules/audio_processing/audio_processing_impl.h @@ -355,7 +355,8 @@ class AudioProcessingImpl : public AudioProcessing { int agc_clipped_level_min, bool use_experimental_agc, bool use_experimental_agc_agc2_level_estimation, - bool use_experimental_agc_agc2_digital_adaptive) + bool use_experimental_agc_agc2_digital_adaptive, + bool use_experimental_agc_process_before_aec) : // Format of processing streams at input/output call sites. agc_startup_min_volume(agc_startup_min_volume), agc_clipped_level_min(agc_clipped_level_min), @@ -363,12 +364,15 @@ class AudioProcessingImpl : public AudioProcessing { use_experimental_agc_agc2_level_estimation( use_experimental_agc_agc2_level_estimation), use_experimental_agc_agc2_digital_adaptive( - use_experimental_agc_agc2_digital_adaptive) {} + use_experimental_agc_agc2_digital_adaptive), + use_experimental_agc_process_before_aec( + use_experimental_agc_process_before_aec) {} int agc_startup_min_volume; int agc_clipped_level_min; bool use_experimental_agc; bool use_experimental_agc_agc2_level_estimation; bool use_experimental_agc_agc2_digital_adaptive; + bool use_experimental_agc_process_before_aec; } constants_; diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h index f05d7b6906..e0bc85e204 100644 --- a/modules/audio_processing/include/audio_processing.h +++ b/modules/audio_processing/include/audio_processing.h @@ -122,10 +122,12 @@ struct ExperimentalAgc { explicit ExperimentalAgc(bool enabled) : enabled(enabled) {} ExperimentalAgc(bool enabled, bool enabled_agc2_level_estimator, - bool digital_adaptive_disabled) + bool digital_adaptive_disabled, + bool analyze_before_aec) : enabled(enabled), enabled_agc2_level_estimator(enabled_agc2_level_estimator), - digital_adaptive_disabled(digital_adaptive_disabled) {} + digital_adaptive_disabled(digital_adaptive_disabled), + analyze_before_aec(analyze_before_aec) {} ExperimentalAgc(bool enabled, int startup_min_volume) : enabled(enabled), startup_min_volume(startup_min_volume) {} @@ -140,6 +142,9 @@ struct ExperimentalAgc { int clipped_level_min = kClippedLevelMin; bool enabled_agc2_level_estimator = false; bool digital_adaptive_disabled = false; + // 'analyze_before_aec' is an experimental flag. It is intended to be removed + // at some point. + bool analyze_before_aec = false; }; // Use to enable experimental noise suppression. It can be set in the diff --git a/modules/audio_processing/test/audio_processing_simulator.cc b/modules/audio_processing/test/audio_processing_simulator.cc index 9481c98206..d5e8ea4744 100644 --- a/modules/audio_processing/test/audio_processing_simulator.cc +++ b/modules/audio_processing/test/audio_processing_simulator.cc @@ -730,7 +730,9 @@ void AudioProcessingSimulator::CreateAudioProcessor() { !!settings_.use_experimental_agc_agc2_level_estimator && *settings_.use_experimental_agc_agc2_level_estimator, !!settings_.experimental_agc_disable_digital_adaptive && - *settings_.experimental_agc_disable_digital_adaptive)); + *settings_.experimental_agc_disable_digital_adaptive, + !!settings_.experimental_agc_analyze_before_aec && + *settings_.experimental_agc_analyze_before_aec)); if (settings_.use_ed) { apm_config.residual_echo_detector.enabled = *settings_.use_ed; } diff --git a/modules/audio_processing/test/audio_processing_simulator.h b/modules/audio_processing/test/audio_processing_simulator.h index 491614099c..75fca66636 100644 --- a/modules/audio_processing/test/audio_processing_simulator.h +++ b/modules/audio_processing/test/audio_processing_simulator.h @@ -68,6 +68,7 @@ struct SimulationSettings { absl::optional use_experimental_agc; absl::optional use_experimental_agc_agc2_level_estimator; absl::optional experimental_agc_disable_digital_adaptive; + absl::optional experimental_agc_analyze_before_aec; absl::optional aecm_routing_mode; absl::optional use_aecm_comfort_noise; absl::optional agc_mode; diff --git a/modules/audio_processing/test/audioproc_float_impl.cc b/modules/audio_processing/test/audioproc_float_impl.cc index 42d8093b0c..a465734e4a 100644 --- a/modules/audio_processing/test/audioproc_float_impl.cc +++ b/modules/audio_processing/test/audioproc_float_impl.cc @@ -119,6 +119,15 @@ DEFINE_int(experimental_agc_disable_digital_adaptive, kParameterNotSpecifiedValue, "Force-deactivate (1) digital adaptation in " "experimental AGC. Digital adaptation is active by default (0)."); +DEFINE_int(experimental_agc_analyze_before_aec, + kParameterNotSpecifiedValue, + "Make level estimation happen before AEC" + " in the experimental AGC. After AEC is the default (0)"); +DEFINE_int( + experimental_agc_agc2_level_estimator, + kParameterNotSpecifiedValue, + "AGC2 level estimation" + " in the experimental AGC. AGC1 level estimation is the default (0)"); DEFINE_int( refined_adaptive_filter, kParameterNotSpecifiedValue, @@ -259,7 +268,10 @@ SimulationSettings CreateSettings() { SetSettingIfFlagSet(FLAG_experimental_agc, &settings.use_experimental_agc); SetSettingIfFlagSet(FLAG_experimental_agc_disable_digital_adaptive, &settings.experimental_agc_disable_digital_adaptive); - + SetSettingIfFlagSet(FLAG_experimental_agc_analyze_before_aec, + &settings.experimental_agc_analyze_before_aec); + SetSettingIfFlagSet(FLAG_experimental_agc_agc2_level_estimator, + &settings.use_experimental_agc_agc2_level_estimator); SetSettingIfSpecified(FLAG_aecm_routing_mode, &settings.aecm_routing_mode); SetSettingIfFlagSet(FLAG_aecm_comfort_noise, &settings.use_aecm_comfort_noise);