Reduce for reallocations the pre-amplifier and high-pass filter
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 <peah@webrtc.org>
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30143}
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index f22db20..e91a567 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -509,7 +509,7 @@
submodules_.agc_manager->SetCaptureMuted(capture_.output_will_be_muted);
}
InitializeTransientSuppressor();
- InitializeHighPassFilter();
+ InitializeHighPassFilter(true);
InitializeVoiceDetector();
InitializeResidualEchoDetector();
InitializeEchoController();
@@ -665,6 +665,11 @@
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 @@
InitializeTransientSuppressor();
}
- InitializeHighPassFilter();
+ InitializeHighPassFilter(false);
if (agc1_config_changed) {
ApplyAgc1Config(config_.gain_controller1);
@@ -693,10 +698,14 @@
<< "\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<LevelEstimator>();
@@ -1780,7 +1789,7 @@
}
}
-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 @@
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 77eae38..4246594 100644
--- a/modules/audio_processing/audio_processing_impl.h
+++ b/modules/audio_processing/audio_processing_impl.h
@@ -236,7 +236,8 @@
// 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 d396383..7e7c370 100644
--- a/modules/audio_processing/high_pass_filter.h
+++ b/modules/audio_processing/high_pass_filter.h
@@ -33,6 +33,9 @@
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<std::unique_ptr<CascadedBiQuadFilter>> filters_;