diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc index ed1715cbe7..81959127a1 100644 --- a/modules/audio_processing/audio_processing_impl.cc +++ b/modules/audio_processing/audio_processing_impl.cc @@ -372,10 +372,6 @@ AudioProcessingImpl::AudioProcessingImpl( new rtc::RefCountedObject(); } - // TODO(alessiob): Move the injected gain controller once injection is - // implemented. - submodules_.gain_controller2.reset(new GainController2()); - // TODO(webrtc:5298): Remove once the use of ExperimentalNs has been // deprecated. #if !(defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)) @@ -656,6 +652,9 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) { config_.gain_controller1.analog_level_maximum != config.gain_controller1.analog_level_maximum; + const bool agc2_config_changed = + config_.gain_controller2.enabled != config.gain_controller2.enabled; + const bool voice_detection_config_changed = config_.voice_detection.enabled != config.voice_detection.enabled; @@ -694,9 +693,10 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) { << "\nReverting to default parameter set"; config_.gain_controller2 = AudioProcessing::Config::GainController2(); } - InitializeGainController2(); + if (agc2_config_changed) { + InitializeGainController2(); + } InitializePreAmplifier(); - submodules_.gain_controller2->ApplyConfig(config_.gain_controller2); if (config_.level_estimation.enabled && !submodules_.output_level_estimator) { submodules_.output_level_estimator = std::make_unique(); @@ -931,7 +931,7 @@ void AudioProcessingImpl::HandleCaptureRuntimeSettings() { break; } case RuntimeSetting::Type::kCaptureFixedPostGain: { - if (config_.gain_controller2.enabled) { + if (submodules_.gain_controller2) { float value; setting.GetFloat(&value); config_.gain_controller2.fixed_digital.gain_db = value; @@ -1411,7 +1411,7 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() { submodules_.capture_analyzer->Analyze(capture_buffer); } - if (config_.gain_controller2.enabled) { + if (submodules_.gain_controller2) { submodules_.gain_controller2->NotifyAnalogLevel( recommended_stream_analog_level()); submodules_.gain_controller2->Process(capture_buffer); @@ -1761,7 +1761,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(), config_.gain_controller2.enabled, + submodules_.gain_control->is_enabled(), !!submodules_.gain_controller2, config_.pre_amplifier.enabled, capture_nonlocked_.echo_controller_enabled, config_.voice_detection.enabled, !!submodules_.transient_suppressor); } @@ -1888,7 +1888,16 @@ void AudioProcessingImpl::InitializeEchoController() { void AudioProcessingImpl::InitializeGainController2() { if (config_.gain_controller2.enabled) { + if (!submodules_.gain_controller2) { + // TODO(alessiob): Move the injected gain controller once injection is + // implemented. + submodules_.gain_controller2.reset(new GainController2()); + } + submodules_.gain_controller2->Initialize(proc_fullband_sample_rate_hz()); + submodules_.gain_controller2->ApplyConfig(config_.gain_controller2); + } else { + submodules_.gain_controller2.reset(); } } diff --git a/modules/audio_processing/gain_controller2.cc b/modules/audio_processing/gain_controller2.cc index 7cff82dce1..8c764f848a 100644 --- a/modules/audio_processing/gain_controller2.cc +++ b/modules/audio_processing/gain_controller2.cc @@ -27,8 +27,11 @@ GainController2::GainController2() new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))), gain_applier_(/*hard_clip_samples=*/false, /*initial_gain_factor=*/0.f), - adaptive_agc_(new AdaptiveAgc(data_dumper_.get())), - limiter_(static_cast(48000), data_dumper_.get(), "Agc2") {} + limiter_(static_cast(48000), data_dumper_.get(), "Agc2") { + if (config_.adaptive_digital.enabled) { + adaptive_agc_.reset(new AdaptiveAgc(data_dumper_.get())); + } +} GainController2::~GainController2() = default; @@ -47,14 +50,14 @@ void GainController2::Process(AudioBuffer* audio) { audio->num_frames()); // Apply fixed gain first, then the adaptive one. gain_applier_.ApplyGain(float_frame); - if (config_.adaptive_digital.enabled) { + if (adaptive_agc_) { adaptive_agc_->Process(float_frame, limiter_.LastAudioLevel()); } limiter_.Process(float_frame); } void GainController2::NotifyAnalogLevel(int level) { - if (analog_level_ != level && config_.adaptive_digital.enabled) { + if (analog_level_ != level && adaptive_agc_) { adaptive_agc_->Reset(); } analog_level_ = level; @@ -72,7 +75,11 @@ void GainController2::ApplyConfig( limiter_.Reset(); } gain_applier_.SetGainFactor(DbToRatio(config_.fixed_digital.gain_db)); - adaptive_agc_.reset(new AdaptiveAgc(data_dumper_.get(), config_)); + if (config_.adaptive_digital.enabled) { + adaptive_agc_.reset(new AdaptiveAgc(data_dumper_.get(), config_)); + } else { + adaptive_agc_.reset(); + } } bool GainController2::Validate(