diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc index f22db20759..e91a567476 100644 --- a/modules/audio_processing/audio_processing_impl.cc +++ b/modules/audio_processing/audio_processing_impl.cc @@ -509,7 +509,7 @@ int AudioProcessingImpl::InitializeLocked() { submodules_.agc_manager->SetCaptureMuted(capture_.output_will_be_muted); } InitializeTransientSuppressor(); - InitializeHighPassFilter(); + InitializeHighPassFilter(true); InitializeVoiceDetector(); InitializeResidualEchoDetector(); InitializeEchoController(); @@ -665,6 +665,11 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) { const bool ts_config_changed = config_.transient_suppression.enabled != config.transient_suppression.enabled; + const bool pre_amplifier_config_changed = + config_.pre_amplifier.enabled != config.pre_amplifier.enabled || + config_.pre_amplifier.fixed_gain_factor != + config.pre_amplifier.fixed_gain_factor; + config_ = config; if (aec_config_changed) { @@ -679,7 +684,7 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) { InitializeTransientSuppressor(); } - InitializeHighPassFilter(); + InitializeHighPassFilter(false); if (agc1_config_changed) { ApplyAgc1Config(config_.gain_controller1); @@ -693,10 +698,14 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) { << "\nReverting to default parameter set"; config_.gain_controller2 = AudioProcessing::Config::GainController2(); } + if (agc2_config_changed) { InitializeGainController2(); } - InitializePreAmplifier(); + + if (pre_amplifier_config_changed) { + InitializePreAmplifier(); + } if (config_.level_estimation.enabled && !submodules_.output_level_estimator) { submodules_.output_level_estimator = std::make_unique(); @@ -1780,7 +1789,7 @@ void AudioProcessingImpl::InitializeTransientSuppressor() { } } -void AudioProcessingImpl::InitializeHighPassFilter() { +void AudioProcessingImpl::InitializeHighPassFilter(bool forced_reset) { bool high_pass_filter_needed_by_aec = config_.echo_canceller.enabled && config_.echo_canceller.enforce_high_pass_filtering && @@ -1794,7 +1803,13 @@ void AudioProcessingImpl::InitializeHighPassFilter() { size_t num_channels = use_full_band ? num_output_channels() : num_proc_channels(); - submodules_.high_pass_filter.reset(new HighPassFilter(rate, num_channels)); + if (!submodules_.high_pass_filter || + rate != submodules_.high_pass_filter->sample_rate_hz() || + forced_reset || + num_channels != submodules_.high_pass_filter->num_channels()) { + submodules_.high_pass_filter.reset( + new HighPassFilter(rate, num_channels)); + } } else { submodules_.high_pass_filter.reset(); } diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h index 77eae38ea1..424659419b 100644 --- a/modules/audio_processing/audio_processing_impl.h +++ b/modules/audio_processing/audio_processing_impl.h @@ -236,7 +236,8 @@ class AudioProcessingImpl : public AudioProcessing { // Initializations of capture-only submodules, requiring the capture lock // already acquired. - void InitializeHighPassFilter() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); + void InitializeHighPassFilter(bool forced_reset) + RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); void InitializeVoiceDetector() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); void InitializeTransientSuppressor() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); diff --git a/modules/audio_processing/high_pass_filter.h b/modules/audio_processing/high_pass_filter.h index d396383b0c..7e7c370cd1 100644 --- a/modules/audio_processing/high_pass_filter.h +++ b/modules/audio_processing/high_pass_filter.h @@ -33,6 +33,9 @@ class HighPassFilter { void Reset(); void Reset(size_t num_channels); + int sample_rate_hz() const { return sample_rate_hz_; } + size_t num_channels() const { return filters_.size(); } + private: const int sample_rate_hz_; std::vector> filters_;