Reland "Replace the ExperimentalAgc config with the new config format"
This is a reland of f3aa6326b8e21f627b9fba72040122723251999b Original change's description: > Replace the ExperimentalAgc config with the new config format > > This CL replaces the use of the ExperimentalAgc config with > using the new config format. > > Beyond that, some further changes were made to how the analog > and digital AGCs are initialized/called. While these can be > made in a separate CL, I believe the code changes becomes more > clear by bundling those with the replacement of the > ExperimentalAgc config. > > TBR: saza@webrtc.org > Bug: webrtc:5298 > Change-Id: Ia19940f3abae048541e6716d0184b4caafc7d53e > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/163986 > Reviewed-by: Per Åhgren <peah@webrtc.org> > Commit-Queue: Per Åhgren <peah@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#30149} Bug: webrtc:5298 Change-Id: I6db03628ed3fa2ecd36544fe9181dd8244d7e2df Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/165760 Reviewed-by: Sam Zackrisson <saza@webrtc.org> Commit-Queue: Per Åhgren <peah@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30295}
This commit is contained in:
@ -334,18 +334,7 @@ AudioProcessingImpl::AudioProcessingImpl(
|
||||
std::move(render_pre_processor),
|
||||
std::move(echo_detector),
|
||||
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,
|
||||
#else
|
||||
config.Get<ExperimentalAgc>().enabled,
|
||||
config.Get<ExperimentalAgc>().enabled_agc2_level_estimator,
|
||||
config.Get<ExperimentalAgc>().digital_adaptive_disabled,
|
||||
#endif
|
||||
!field_trial::IsEnabled(
|
||||
constants_(!field_trial::IsEnabled(
|
||||
"WebRTC-ApmExperimentalMultiChannelRenderKillSwitch"),
|
||||
!field_trial::IsEnabled(
|
||||
"WebRTC-ApmExperimentalMultiChannelCaptureKillSwitch"),
|
||||
@ -365,18 +354,29 @@ AudioProcessingImpl::AudioProcessingImpl(
|
||||
capture_nonlocked_.echo_controller_enabled =
|
||||
static_cast<bool>(echo_control_factory_);
|
||||
|
||||
submodules_.gain_control.reset(new GainControlImpl());
|
||||
|
||||
// If no echo detector is injected, use the ResidualEchoDetector.
|
||||
if (!submodules_.echo_detector) {
|
||||
submodules_.echo_detector =
|
||||
new rtc::RefCountedObject<ResidualEchoDetector>();
|
||||
}
|
||||
|
||||
#if !(defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS))
|
||||
// TODO(webrtc:5298): Remove once the use of ExperimentalNs has been
|
||||
// deprecated.
|
||||
#if !(defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS))
|
||||
config_.transient_suppression.enabled = config.Get<ExperimentalNs>().enabled;
|
||||
|
||||
// TODO(webrtc:5298): Remove once the use of ExperimentalAgc has been
|
||||
// deprecated.
|
||||
config_.gain_controller1.analog_gain_controller.enabled =
|
||||
config.Get<ExperimentalAgc>().enabled;
|
||||
config_.gain_controller1.analog_gain_controller.startup_min_volume =
|
||||
config.Get<ExperimentalAgc>().startup_min_volume;
|
||||
config_.gain_controller1.analog_gain_controller.clipped_level_min =
|
||||
config.Get<ExperimentalAgc>().clipped_level_min;
|
||||
config_.gain_controller1.analog_gain_controller.enable_agc2_level_estimator =
|
||||
config.Get<ExperimentalAgc>().enabled_agc2_level_estimator;
|
||||
config_.gain_controller1.analog_gain_controller.enable_digital_adaptive =
|
||||
!config.Get<ExperimentalAgc>().digital_adaptive_disabled;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -481,34 +481,7 @@ int AudioProcessingImpl::InitializeLocked() {
|
||||
|
||||
AllocateRenderQueue();
|
||||
|
||||
submodules_.gain_control->Initialize(num_proc_channels(),
|
||||
proc_sample_rate_hz());
|
||||
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) {
|
||||
int stream_analog_level = -1;
|
||||
const bool re_creation = !!submodules_.agc_manager;
|
||||
if (re_creation) {
|
||||
stream_analog_level = submodules_.agc_manager->stream_analog_level();
|
||||
}
|
||||
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));
|
||||
if (re_creation) {
|
||||
submodules_.agc_manager->set_stream_analog_level(stream_analog_level);
|
||||
}
|
||||
}
|
||||
submodules_.agc_manager->Initialize();
|
||||
submodules_.agc_manager->SetupDigitalGainControl(
|
||||
submodules_.gain_control.get());
|
||||
submodules_.agc_manager->SetCaptureMuted(capture_.output_will_be_muted);
|
||||
}
|
||||
InitializeGainController1();
|
||||
InitializeTransientSuppressor();
|
||||
InitializeHighPassFilter(true);
|
||||
InitializeVoiceDetector();
|
||||
@ -651,7 +624,20 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
|
||||
config_.gain_controller1.analog_level_minimum !=
|
||||
config.gain_controller1.analog_level_minimum ||
|
||||
config_.gain_controller1.analog_level_maximum !=
|
||||
config.gain_controller1.analog_level_maximum;
|
||||
config.gain_controller1.analog_level_maximum ||
|
||||
config_.gain_controller1.analog_gain_controller.enabled !=
|
||||
config.gain_controller1.analog_gain_controller.enabled ||
|
||||
config_.gain_controller1.analog_gain_controller.startup_min_volume !=
|
||||
config.gain_controller1.analog_gain_controller.startup_min_volume ||
|
||||
config_.gain_controller1.analog_gain_controller.clipped_level_min !=
|
||||
config.gain_controller1.analog_gain_controller.clipped_level_min ||
|
||||
config_.gain_controller1.analog_gain_controller
|
||||
.enable_agc2_level_estimator !=
|
||||
config.gain_controller1.analog_gain_controller
|
||||
.enable_agc2_level_estimator ||
|
||||
config_.gain_controller1.analog_gain_controller.enable_digital_adaptive !=
|
||||
config.gain_controller1.analog_gain_controller
|
||||
.enable_digital_adaptive;
|
||||
|
||||
const bool agc2_config_changed =
|
||||
config_.gain_controller2.enabled != config.gain_controller2.enabled;
|
||||
@ -688,7 +674,7 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
|
||||
InitializeHighPassFilter(false);
|
||||
|
||||
if (agc1_config_changed) {
|
||||
ApplyAgc1Config(config_.gain_controller1);
|
||||
InitializeGainController1();
|
||||
}
|
||||
|
||||
const bool config_ok = GainController2::Validate(config_.gain_controller2);
|
||||
@ -723,29 +709,6 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
|
||||
}
|
||||
}
|
||||
|
||||
void AudioProcessingImpl::ApplyAgc1Config(
|
||||
const Config::GainController1& config) {
|
||||
int error = submodules_.gain_control->Enable(config.enabled);
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
|
||||
if (!submodules_.agc_manager) {
|
||||
error = submodules_.gain_control->set_mode(
|
||||
Agc1ConfigModeToInterfaceMode(config.mode));
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
error = submodules_.gain_control->set_target_level_dbfs(
|
||||
config.target_level_dbfs);
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
error = submodules_.gain_control->set_compression_gain_db(
|
||||
config.compression_gain_db);
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
error = submodules_.gain_control->enable_limiter(config.enable_limiter);
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
error = submodules_.gain_control->set_analog_level_limits(
|
||||
config.analog_level_minimum, config.analog_level_maximum);
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(webrtc:5298): Remove.
|
||||
void AudioProcessingImpl::SetExtraOptions(const webrtc::Config& config) {}
|
||||
|
||||
@ -935,9 +898,11 @@ void AudioProcessingImpl::HandleCaptureRuntimeSettings() {
|
||||
setting.GetFloat(&value);
|
||||
int int_value = static_cast<int>(value + .5f);
|
||||
config_.gain_controller1.compression_gain_db = int_value;
|
||||
int error =
|
||||
submodules_.gain_control->set_compression_gain_db(int_value);
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
if (submodules_.gain_control) {
|
||||
int error =
|
||||
submodules_.gain_control->set_compression_gain_db(int_value);
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1013,7 +978,7 @@ void AudioProcessingImpl::QueueBandedRenderAudio(AudioBuffer* audio) {
|
||||
}
|
||||
}
|
||||
|
||||
if (!submodules_.agc_manager) {
|
||||
if (!submodules_.agc_manager && submodules_.gain_control) {
|
||||
GainControlImpl::PackRenderAudioBuffer(*audio, &agc_render_queue_buffer_);
|
||||
// Insert the samples into the queue.
|
||||
if (!agc_render_signal_queue_->Insert(&agc_render_queue_buffer_)) {
|
||||
@ -1100,8 +1065,10 @@ void AudioProcessingImpl::EmptyQueuedRenderAudio() {
|
||||
}
|
||||
}
|
||||
|
||||
while (agc_render_signal_queue_->Remove(&agc_capture_queue_buffer_)) {
|
||||
submodules_.gain_control->ProcessRenderAudio(agc_capture_queue_buffer_);
|
||||
if (submodules_.gain_control) {
|
||||
while (agc_render_signal_queue_->Remove(&agc_capture_queue_buffer_)) {
|
||||
submodules_.gain_control->ProcessRenderAudio(agc_capture_queue_buffer_);
|
||||
}
|
||||
}
|
||||
|
||||
while (red_render_signal_queue_->Remove(&red_capture_queue_buffer_)) {
|
||||
@ -1222,8 +1189,7 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() {
|
||||
submodules_.echo_controller->AnalyzeCapture(capture_buffer);
|
||||
}
|
||||
|
||||
if (constants_.use_experimental_agc &&
|
||||
submodules_.gain_control->is_enabled()) {
|
||||
if (submodules_.agc_manager) {
|
||||
submodules_.agc_manager->AnalyzePreProcess(capture_buffer);
|
||||
}
|
||||
|
||||
@ -1250,7 +1216,10 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() {
|
||||
/*use_split_band_data=*/true);
|
||||
}
|
||||
|
||||
RETURN_ON_ERR(submodules_.gain_control->AnalyzeCaptureAudio(*capture_buffer));
|
||||
if (submodules_.gain_control) {
|
||||
RETURN_ON_ERR(
|
||||
submodules_.gain_control->AnalyzeCaptureAudio(*capture_buffer));
|
||||
}
|
||||
RTC_DCHECK(
|
||||
!(submodules_.legacy_noise_suppressor && submodules_.noise_suppressor));
|
||||
|
||||
@ -1315,19 +1284,21 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() {
|
||||
capture_.stats.voice_detected = absl::nullopt;
|
||||
}
|
||||
|
||||
if (constants_.use_experimental_agc &&
|
||||
submodules_.gain_control->is_enabled()) {
|
||||
if (submodules_.agc_manager) {
|
||||
submodules_.agc_manager->Process(capture_buffer);
|
||||
|
||||
absl::optional<int> new_digital_gain =
|
||||
submodules_.agc_manager->GetDigitalComressionGain();
|
||||
if (new_digital_gain) {
|
||||
if (new_digital_gain && submodules_.gain_control) {
|
||||
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(
|
||||
capture_buffer, /*stream_has_echo*/ false));
|
||||
|
||||
if (submodules_.gain_control) {
|
||||
// TODO(peah): Add reporting from AEC3 whether there is echo.
|
||||
RETURN_ON_ERR(submodules_.gain_control->ProcessCaptureAudio(
|
||||
capture_buffer, /*stream_has_echo*/ false));
|
||||
}
|
||||
|
||||
if (submodule_states_.CaptureMultiBandProcessingPresent() &&
|
||||
SampleRateSupportsMultiBand(
|
||||
@ -1656,9 +1627,11 @@ void AudioProcessingImpl::set_stream_analog_level(int level) {
|
||||
submodules_.agc_manager->set_stream_analog_level(level);
|
||||
data_dumper_->DumpRaw("experimental_gain_control_set_stream_analog_level",
|
||||
1, &level);
|
||||
} else {
|
||||
} else if (submodules_.gain_control) {
|
||||
int error = submodules_.gain_control->set_stream_analog_level(level);
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
} else {
|
||||
capture_.cached_stream_analog_level_ = level;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1666,8 +1639,11 @@ int AudioProcessingImpl::recommended_stream_analog_level() const {
|
||||
rtc::CritScope cs_capture(&crit_capture_);
|
||||
if (submodules_.agc_manager) {
|
||||
return submodules_.agc_manager->stream_analog_level();
|
||||
} else if (submodules_.gain_control) {
|
||||
return submodules_.gain_control->stream_analog_level();
|
||||
} else {
|
||||
return capture_.cached_stream_analog_level_;
|
||||
}
|
||||
return submodules_.gain_control->stream_analog_level();
|
||||
}
|
||||
|
||||
void AudioProcessingImpl::AttachAecDump(std::unique_ptr<AecDump> aec_dump) {
|
||||
@ -1724,7 +1700,7 @@ bool AudioProcessingImpl::UpdateActiveSubmoduleStates() {
|
||||
config_.high_pass_filter.enabled, !!submodules_.echo_control_mobile,
|
||||
config_.residual_echo_detector.enabled,
|
||||
!!submodules_.legacy_noise_suppressor || !!submodules_.noise_suppressor,
|
||||
submodules_.gain_control->is_enabled(), !!submodules_.gain_controller2,
|
||||
!!submodules_.gain_control, !!submodules_.gain_controller2,
|
||||
config_.pre_amplifier.enabled, capture_nonlocked_.echo_controller_enabled,
|
||||
config_.voice_detection.enabled, !!submodules_.transient_suppressor);
|
||||
}
|
||||
@ -1855,6 +1831,71 @@ void AudioProcessingImpl::InitializeEchoController() {
|
||||
aecm_render_signal_queue_.reset();
|
||||
}
|
||||
|
||||
void AudioProcessingImpl::InitializeGainController1() {
|
||||
if (!config_.gain_controller1.enabled) {
|
||||
submodules_.agc_manager.reset();
|
||||
submodules_.gain_control.reset();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!submodules_.gain_control) {
|
||||
submodules_.gain_control.reset(new GainControlImpl());
|
||||
}
|
||||
|
||||
submodules_.gain_control->Initialize(num_proc_channels(),
|
||||
proc_sample_rate_hz());
|
||||
|
||||
if (!config_.gain_controller1.analog_gain_controller.enabled) {
|
||||
int error = submodules_.gain_control->set_mode(
|
||||
Agc1ConfigModeToInterfaceMode(config_.gain_controller1.mode));
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
error = submodules_.gain_control->set_target_level_dbfs(
|
||||
config_.gain_controller1.target_level_dbfs);
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
error = submodules_.gain_control->set_compression_gain_db(
|
||||
config_.gain_controller1.compression_gain_db);
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
error = submodules_.gain_control->enable_limiter(
|
||||
config_.gain_controller1.enable_limiter);
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
error = submodules_.gain_control->set_analog_level_limits(
|
||||
config_.gain_controller1.analog_level_minimum,
|
||||
config_.gain_controller1.analog_level_maximum);
|
||||
RTC_DCHECK_EQ(kNoError, error);
|
||||
|
||||
submodules_.agc_manager.reset();
|
||||
return;
|
||||
}
|
||||
|
||||
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) {
|
||||
int stream_analog_level = -1;
|
||||
const bool re_creation = !!submodules_.agc_manager;
|
||||
if (re_creation) {
|
||||
stream_analog_level = submodules_.agc_manager->stream_analog_level();
|
||||
}
|
||||
submodules_.agc_manager.reset(new AgcManagerDirect(
|
||||
num_proc_channels(),
|
||||
config_.gain_controller1.analog_gain_controller.startup_min_volume,
|
||||
config_.gain_controller1.analog_gain_controller.clipped_level_min,
|
||||
config_.gain_controller1.analog_gain_controller
|
||||
.enable_agc2_level_estimator,
|
||||
!config_.gain_controller1.analog_gain_controller
|
||||
.enable_digital_adaptive,
|
||||
capture_nonlocked_.split_rate));
|
||||
if (re_creation) {
|
||||
submodules_.agc_manager->set_stream_analog_level(stream_analog_level);
|
||||
}
|
||||
}
|
||||
submodules_.agc_manager->Initialize();
|
||||
submodules_.agc_manager->SetupDigitalGainControl(
|
||||
submodules_.gain_control.get());
|
||||
submodules_.agc_manager->SetCaptureMuted(capture_.output_will_be_muted);
|
||||
}
|
||||
|
||||
void AudioProcessingImpl::InitializeGainController2() {
|
||||
if (config_.gain_controller2.enabled) {
|
||||
if (!submodules_.gain_controller2) {
|
||||
@ -1958,7 +1999,8 @@ void AudioProcessingImpl::WriteAecDumpConfigMessage(bool forced) {
|
||||
std::string experiments_description = "";
|
||||
// TODO(peah): Add semicolon-separated concatenations of experiment
|
||||
// descriptions for other submodules.
|
||||
if (constants_.agc_clipped_level_min != kClippedLevelMin) {
|
||||
if (config_.gain_controller1.analog_gain_controller.clipped_level_min !=
|
||||
kClippedLevelMin) {
|
||||
experiments_description += "AgcClippingLevelExperiment;";
|
||||
}
|
||||
if (capture_nonlocked_.echo_controller_enabled) {
|
||||
@ -1984,10 +2026,14 @@ void AudioProcessingImpl::WriteAecDumpConfigMessage(bool forced) {
|
||||
? static_cast<int>(submodules_.echo_control_mobile->routing_mode())
|
||||
: 0;
|
||||
|
||||
apm_config.agc_enabled = submodules_.gain_control->is_enabled();
|
||||
apm_config.agc_mode = static_cast<int>(submodules_.gain_control->mode());
|
||||
apm_config.agc_enabled = !!submodules_.gain_control;
|
||||
|
||||
apm_config.agc_mode = submodules_.gain_control
|
||||
? static_cast<int>(submodules_.gain_control->mode())
|
||||
: GainControl::kAdaptiveAnalog;
|
||||
apm_config.agc_limiter_enabled =
|
||||
submodules_.gain_control->is_limiter_enabled();
|
||||
submodules_.gain_control ? submodules_.gain_control->is_limiter_enabled()
|
||||
: false;
|
||||
apm_config.noise_robust_agc_enabled = !!submodules_.agc_manager;
|
||||
|
||||
apm_config.hpf_enabled = config_.high_pass_filter.enabled;
|
||||
|
||||
Reference in New Issue
Block a user