Remove the noise_suppression() pointer to submodule interface

Bug: webrtc:9878
Change-Id: I356afddb56cc1957e9d0415e2723f66e0e4ac522
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/137517
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Ivo Creusen <ivoc@webrtc.org>
Commit-Queue: Sam Zackrisson <saza@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29499}
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index 39de770..760e81d 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -35,8 +35,7 @@
 #include "modules/audio_processing/include/audio_frame_view.h"
 #include "modules/audio_processing/level_estimator.h"
 #include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "modules/audio_processing/noise_suppression_impl.h"
-#include "modules/audio_processing/noise_suppression_proxy.h"
+#include "modules/audio_processing/noise_suppression.h"
 #include "modules/audio_processing/residual_echo_detector.h"
 #include "modules/audio_processing/transient/transient_suppressor.h"
 #include "modules/audio_processing/voice_detection.h"
@@ -107,13 +106,13 @@
   using NsConfig = AudioProcessing::Config::NoiseSuppression;
   switch (level) {
     case NsConfig::kLow:
-      return NoiseSuppression::kLow;
+      return NoiseSuppression::Level::kLow;
     case NsConfig::kModerate:
-      return NoiseSuppression::kModerate;
+      return NoiseSuppression::Level::kModerate;
     case NsConfig::kHigh:
-      return NoiseSuppression::kHigh;
+      return NoiseSuppression::Level::kHigh;
     case NsConfig::kVeryHigh:
-      return NoiseSuppression::kVeryHigh;
+      return NoiseSuppression::Level::kVeryHigh;
     default:
       RTC_NOTREACHED();
   }
@@ -254,11 +253,8 @@
 
 struct AudioProcessingImpl::ApmPublicSubmodules {
   ApmPublicSubmodules() {}
-  // Accessed externally of APM without any lock acquired.
-  // TODO(bugs.webrtc.org/9947): Move these submodules into private_submodules_
-  // when their pointer-to-submodule API functions are gone.
-  std::unique_ptr<NoiseSuppressionImpl> noise_suppression;
-  std::unique_ptr<NoiseSuppressionProxy> noise_suppression_proxy;
+  // Historically accessed externally of APM without any lock acquired.
+  // TODO(bugs.webrtc.org/9947): Move these submodules into private_submodules_.
   std::unique_ptr<GainControlImpl> gain_control;
   std::unique_ptr<GainControlForExperimentalAgc>
       gain_control_for_experimental_agc;
@@ -284,6 +280,7 @@
   std::unique_ptr<EchoCancellationImpl> echo_cancellation;
   std::unique_ptr<EchoControl> echo_controller;
   std::unique_ptr<EchoControlMobileImpl> echo_control_mobile;
+  std::unique_ptr<NoiseSuppression> noise_suppressor;
   std::unique_ptr<CustomProcessing> capture_post_processor;
   std::unique_ptr<CustomProcessing> render_pre_processor;
   std::unique_ptr<GainApplier> pre_amplifier;
@@ -403,10 +400,6 @@
       static_cast<bool>(echo_control_factory_);
 
   public_submodules_->gain_control.reset(new GainControlImpl());
-  public_submodules_->noise_suppression.reset(
-      new NoiseSuppressionImpl(&crit_capture_));
-  public_submodules_->noise_suppression_proxy.reset(new NoiseSuppressionProxy(
-      this, public_submodules_->noise_suppression.get()));
   public_submodules_->gain_control_for_experimental_agc.reset(
       new GainControlForExperimentalAgc(
           public_submodules_->gain_control.get()));
@@ -556,12 +549,11 @@
   }
   InitializeTransient();
   InitializeHighPassFilter();
-  public_submodules_->noise_suppression->Initialize(num_proc_channels(),
-                                                    proc_sample_rate_hz());
   InitializeVoiceDetector();
   InitializeResidualEchoDetector();
   InitializeEchoController();
   InitializeGainController2();
+  InitializeNoiseSuppressor();
   InitializeAnalyzer();
   InitializePostProcessor();
   InitializePreProcessor();
@@ -702,16 +694,19 @@
   const bool voice_detection_config_changed =
       config_.voice_detection.enabled != config.voice_detection.enabled;
 
+  const bool ns_config_changed =
+      config_.noise_suppression.enabled != config.noise_suppression.enabled ||
+      config_.noise_suppression.level != config.noise_suppression.level;
+
   config_ = config;
 
   if (aec_config_changed) {
     InitializeEchoController();
   }
 
-  public_submodules_->noise_suppression->Enable(
-      config.noise_suppression.enabled);
-  public_submodules_->noise_suppression->set_level(
-      NsConfigLevelToInterfaceLevel(config.noise_suppression.level));
+  if (ns_config_changed) {
+    InitializeNoiseSuppressor();
+  }
 
   InitializeHighPassFilter();
 
@@ -1407,7 +1402,9 @@
   }
   RETURN_ON_ERR(
       public_submodules_->gain_control->AnalyzeCaptureAudio(capture_buffer));
-  public_submodules_->noise_suppression->AnalyzeCaptureAudio(capture_buffer);
+  if (private_submodules_->noise_suppressor) {
+    private_submodules_->noise_suppressor->AnalyzeCaptureAudio(capture_buffer);
+  }
 
   if (private_submodules_->echo_control_mobile) {
     // Ensure that the stream delay was set before the call to the
@@ -1416,13 +1413,13 @@
       return AudioProcessing::kStreamParameterNotSetError;
     }
 
-    if (public_submodules_->noise_suppression->is_enabled()) {
+    if (private_submodules_->noise_suppressor) {
       private_submodules_->echo_control_mobile->CopyLowPassReference(
           capture_buffer);
+      private_submodules_->noise_suppressor->ProcessCaptureAudio(
+          capture_buffer);
     }
 
-    public_submodules_->noise_suppression->ProcessCaptureAudio(capture_buffer);
-
     RETURN_ON_ERR(private_submodules_->echo_control_mobile->ProcessCaptureAudio(
         capture_buffer, stream_delay_ms()));
   } else {
@@ -1447,7 +1444,10 @@
           capture_buffer, stream_delay_ms()));
     }
 
-    public_submodules_->noise_suppression->ProcessCaptureAudio(capture_buffer);
+    if (private_submodules_->noise_suppressor) {
+      private_submodules_->noise_suppressor->ProcessCaptureAudio(
+          capture_buffer);
+    }
   }
 
   if (config_.voice_detection.enabled) {
@@ -1824,10 +1824,6 @@
   return stats;
 }
 
-NoiseSuppression* AudioProcessingImpl::noise_suppression() const {
-  return public_submodules_->noise_suppression_proxy.get();
-}
-
 void AudioProcessingImpl::MutateConfig(
     rtc::FunctionView<void(AudioProcessing::Config*)> mutator) {
   rtc::CritScope cs_render(&crit_render_);
@@ -1848,12 +1844,11 @@
       !!private_submodules_->echo_cancellation,
       !!private_submodules_->echo_control_mobile,
       config_.residual_echo_detector.enabled,
-      public_submodules_->noise_suppression->is_enabled(),
+      !!private_submodules_->noise_suppressor,
       public_submodules_->gain_control->is_enabled(),
       config_.gain_controller2.enabled, config_.pre_amplifier.enabled,
       capture_nonlocked_.echo_controller_enabled,
-      config_.voice_detection.enabled,
-      capture_.transient_suppressor_enabled);
+      config_.voice_detection.enabled, capture_.transient_suppressor_enabled);
 }
 
 void AudioProcessingImpl::InitializeTransient() {
@@ -1993,6 +1988,17 @@
   }
 }
 
+void AudioProcessingImpl::InitializeNoiseSuppressor() {
+  if (config_.noise_suppression.enabled) {
+    auto ns_level =
+        NsConfigLevelToInterfaceLevel(config_.noise_suppression.level);
+    private_submodules_->noise_suppressor = std::make_unique<NoiseSuppression>(
+        num_proc_channels(), proc_sample_rate_hz(), ns_level);
+  } else {
+    private_submodules_->noise_suppressor.reset();
+  }
+}
+
 void AudioProcessingImpl::InitializePreAmplifier() {
   if (config_.pre_amplifier.enabled) {
     private_submodules_->pre_amplifier.reset(
@@ -2092,9 +2098,8 @@
 
   apm_config.hpf_enabled = config_.high_pass_filter.enabled;
 
-  apm_config.ns_enabled = public_submodules_->noise_suppression->is_enabled();
-  apm_config.ns_level =
-      static_cast<int>(public_submodules_->noise_suppression->level());
+  apm_config.ns_enabled = config_.noise_suppression.enabled;
+  apm_config.ns_level = static_cast<int>(config_.noise_suppression.level);
 
   apm_config.transient_suppression_enabled =
       capture_.transient_suppressor_enabled;