Making the Analog AGC properly support multi-channel
This CL adds proper multi-channel support to the analog AGC.
Beyond that, it prepares adding multi-channel support to the digital
AGC by removing the tight dependency between the analog and digital
AGC codes.
Bug: webrtc:10859
Change-Id: I4414ccbc3db5dbb5ae069fdf426cbd038375ca7b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/159480
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Commit-Queue: Per Åhgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29878}
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index bfa2e0d..aaf372e 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -323,20 +323,18 @@
submodules_(std::move(capture_post_processor),
std::move(render_pre_processor),
std::move(echo_detector),
- std::move(capture_analyzer),
- config.Get<ExperimentalAgc>().startup_min_volume,
- config.Get<ExperimentalAgc>().clipped_level_min,
+ std::move(capture_analyzer)),
+ constants_(config.Get<ExperimentalAgc>().startup_min_volume,
+ config.Get<ExperimentalAgc>().clipped_level_min,
#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
- /* enabled= */ false,
- /* enabled_agc2_level_estimator= */ false,
- /* digital_adaptive_disabled= */ false
+ /* enabled= */ false,
+ /* enabled_agc2_level_estimator= */ false,
+ /* digital_adaptive_disabled= */ false,
#else
- config.Get<ExperimentalAgc>().enabled,
- config.Get<ExperimentalAgc>().enabled_agc2_level_estimator,
- config.Get<ExperimentalAgc>().digital_adaptive_disabled
+ config.Get<ExperimentalAgc>().enabled,
+ config.Get<ExperimentalAgc>().enabled_agc2_level_estimator,
+ config.Get<ExperimentalAgc>().digital_adaptive_disabled,
#endif
- ),
- constants_(config.Get<ExperimentalAgc>().clipped_level_min,
!field_trial::IsEnabled(
"WebRTC-ApmExperimentalMultiChannelRenderKillSwitch"),
!field_trial::IsEnabled(
@@ -478,9 +476,21 @@
submodules_.gain_control->Initialize(num_proc_channels(),
proc_sample_rate_hz());
- if (submodules_.agc_manager) {
+ if (constants_.use_experimental_agc) {
+ if (!submodules_.agc_manager.get() ||
+ submodules_.agc_manager->num_channels() !=
+ static_cast<int>(num_proc_channels()) ||
+ submodules_.agc_manager->sample_rate_hz() !=
+ capture_nonlocked_.split_rate) {
+ submodules_.agc_manager.reset(new AgcManagerDirect(
+ num_proc_channels(), constants_.agc_startup_min_volume,
+ constants_.agc_clipped_level_min,
+ constants_.use_experimental_agc_agc2_level_estimation,
+ constants_.use_experimental_agc_agc2_digital_adaptive,
+ capture_nonlocked_.split_rate));
+ }
submodules_.agc_manager->Initialize();
- submodules_.agc_manager->ConfigureGainControl(
+ submodules_.agc_manager->SetupDigitalGainControl(
submodules_.gain_control.get());
submodules_.agc_manager->SetCaptureMuted(capture_.output_will_be_muted);
}
@@ -1262,10 +1272,9 @@
submodules_.echo_controller->AnalyzeCapture(capture_buffer);
}
- if (submodules_.agc_manager && submodules_.gain_control->is_enabled()) {
- submodules_.agc_manager->AnalyzePreProcess(
- capture_buffer->channels_const(), capture_buffer->num_channels(),
- capture_nonlocked_.capture_processing_format.num_frames());
+ if (constants_.use_experimental_agc &&
+ submodules_.gain_control->is_enabled()) {
+ submodules_.agc_manager->AnalyzePreProcess(capture_buffer);
}
if (submodule_states_.CaptureMultiBandSubModulesActive() &&
@@ -1350,11 +1359,15 @@
capture_.stats.voice_detected = absl::nullopt;
}
- if (submodules_.agc_manager && submodules_.gain_control->is_enabled()) {
- submodules_.agc_manager->Process(
- capture_buffer->split_bands_const_f(0)[kBand0To8kHz],
- capture_buffer->num_frames_per_band(), capture_nonlocked_.split_rate,
- submodules_.gain_control.get());
+ if (constants_.use_experimental_agc &&
+ submodules_.gain_control->is_enabled()) {
+ submodules_.agc_manager->Process(capture_buffer);
+
+ absl::optional<int> new_digital_gain =
+ submodules_.agc_manager->GetDigitalComressionGain();
+ if (new_digital_gain) {
+ submodules_.gain_control->set_compression_gain_db(*new_digital_gain);
+ }
}
// TODO(peah): Add reporting from AEC3 whether there is echo.
RETURN_ON_ERR(submodules_.gain_control->ProcessCaptureAudio(