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();
   }