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_;