From 0f14db22decb1e7d1b3d4a882cede4f2002cfbea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=85hgren?= Date: Fri, 3 Jan 2020 14:27:14 +0100 Subject: [PATCH] Reduce for reallocations the pre-amplifier and high-pass filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL ensures that the pre-amplifier and the high-pass filter submodules are not reallocated more than needed. Bug: webrtc:5298 Change-Id: I7ed23807d4d2d9fef0eda2e7dca9de9b0b1a4649 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/163988 Commit-Queue: Per Ã…hgren Reviewed-by: Sam Zackrisson Cr-Commit-Position: refs/heads/master@{#30143} --- .../audio_processing/audio_processing_impl.cc | 25 +++++++++++++++---- .../audio_processing/audio_processing_impl.h | 3 ++- modules/audio_processing/high_pass_filter.h | 3 +++ 3 files changed, 25 insertions(+), 6 deletions(-) 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_;