Reland "Refactoring of the noise suppressor and adding true multichannel support"

This is a reland of 87a7b82520b83a6cf42da27cdc46142c2eb6248c

Original change's description:
> Refactoring of the noise suppressor and adding true multichannel support
> 
> This CL adds proper multichannel support to the noise suppressor.
> To accomplish that in a safe way, a full refactoring of the noise
> suppressor code has been done.
> 
> Due to floating point precision, the changes made are not entirely
> bitexact. They are, however, very close to being bitexact.
> 
> As a safety measure, the former noise suppressor code is preserved
> and a kill-switch is added to allow revering to the legacy noise
> suppressor in case issues arise.
> 
> Bug: webrtc:10895, b/143344262
> Change-Id: I0b071011b23265ac12e6d4b3956499d122286657
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/158407
> Commit-Queue: Per Åhgren <peah@webrtc.org>
> Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#29646}

Bug: webrtc:10895, b/143344262
Change-Id: I236f1e67bb0baa4e30908a4cf7a8a7bb55fbced3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/158747
Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org>
Commit-Queue: Per Åhgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29663}
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index f9e7bce..4573aed 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -70,6 +70,11 @@
          sample_rate_hz == AudioProcessing::kSampleRate48kHz;
 }
 
+// Checks whether the legacy ns functionality should be enforced.
+bool DetectLegacyNsEnforcement() {
+  return field_trial::IsEnabled("WebRTC-NewNoiseSuppressionKillSwitch");
+}
+
 // Identify the native processing rate that best handles a sample rate.
 int SuitableProcessRate(int minimum_rate,
                         int max_splitting_rate,
@@ -306,6 +311,7 @@
     std::unique_ptr<CustomAudioAnalyzer> capture_analyzer)
     : data_dumper_(
           new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
+      enforced_usage_of_legacy_ns_(DetectLegacyNsEnforcement()),
       capture_runtime_settings_(kRuntimeSettingQueueSize),
       render_runtime_settings_(kRuntimeSettingQueueSize),
       capture_runtime_settings_enqueuer_(&capture_runtime_settings_),
@@ -1303,9 +1309,14 @@
   if (submodules_.high_pass_filter) {
     submodules_.high_pass_filter->Process(capture_buffer);
   }
+
   RETURN_ON_ERR(submodules_.gain_control->AnalyzeCaptureAudio(capture_buffer));
+  RTC_DCHECK(
+      !(submodules_.legacy_noise_suppressor && submodules_.noise_suppressor));
   if (submodules_.noise_suppressor) {
-    submodules_.noise_suppressor->AnalyzeCaptureAudio(capture_buffer);
+    submodules_.noise_suppressor->Analyze(*capture_buffer);
+  } else if (submodules_.legacy_noise_suppressor) {
+    submodules_.legacy_noise_suppressor->AnalyzeCaptureAudio(capture_buffer);
   }
 
   if (submodules_.echo_control_mobile) {
@@ -1316,8 +1327,10 @@
     }
 
     if (submodules_.noise_suppressor) {
+      submodules_.noise_suppressor->Process(capture_buffer);
+    } else if (submodules_.legacy_noise_suppressor) {
       submodules_.echo_control_mobile->CopyLowPassReference(capture_buffer);
-      submodules_.noise_suppressor->ProcessCaptureAudio(capture_buffer);
+      submodules_.legacy_noise_suppressor->ProcessCaptureAudio(capture_buffer);
     }
 
     RETURN_ON_ERR(submodules_.echo_control_mobile->ProcessCaptureAudio(
@@ -1344,7 +1357,9 @@
     }
 
     if (submodules_.noise_suppressor) {
-      submodules_.noise_suppressor->ProcessCaptureAudio(capture_buffer);
+      submodules_.noise_suppressor->Process(capture_buffer);
+    } else if (submodules_.legacy_noise_suppressor) {
+      submodules_.legacy_noise_suppressor->ProcessCaptureAudio(capture_buffer);
     }
   }
 
@@ -1726,9 +1741,9 @@
   return submodule_states_.Update(
       config_.high_pass_filter.enabled, !!submodules_.echo_cancellation,
       !!submodules_.echo_control_mobile, config_.residual_echo_detector.enabled,
-      !!submodules_.noise_suppressor, submodules_.gain_control->is_enabled(),
-      config_.gain_controller2.enabled, config_.pre_amplifier.enabled,
-      capture_nonlocked_.echo_controller_enabled,
+      !!submodules_.legacy_noise_suppressor || !!submodules_.noise_suppressor,
+      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);
 }
 
@@ -1868,13 +1883,42 @@
 }
 
 void AudioProcessingImpl::InitializeNoiseSuppressor() {
+  submodules_.legacy_noise_suppressor.reset();
+  submodules_.noise_suppressor.reset();
+
   if (config_.noise_suppression.enabled) {
-    auto ns_level =
-        NsConfigLevelToInterfaceLevel(config_.noise_suppression.level);
-    submodules_.noise_suppressor = std::make_unique<NoiseSuppression>(
-        num_proc_channels(), proc_sample_rate_hz(), ns_level);
-  } else {
-    submodules_.noise_suppressor.reset();
+    const bool use_legacy_ns =
+        config_.noise_suppression.use_legacy_ns || enforced_usage_of_legacy_ns_;
+
+    if (!use_legacy_ns) {
+      auto map_level =
+          [](AudioProcessing::Config::NoiseSuppression::Level level) {
+            using NoiseSuppresionConfig =
+                AudioProcessing::Config::NoiseSuppression;
+            switch (level) {
+              case NoiseSuppresionConfig::kLow:
+                return NsConfig::SuppressionLevel::k6dB;
+              case NoiseSuppresionConfig::kModerate:
+                return NsConfig::SuppressionLevel::k12dB;
+              case NoiseSuppresionConfig::kHigh:
+                return NsConfig::SuppressionLevel::k18dB;
+              case NoiseSuppresionConfig::kVeryHigh:
+                return NsConfig::SuppressionLevel::k21dB;
+              default:
+                RTC_NOTREACHED();
+            }
+          };
+
+      NsConfig cfg;
+      cfg.target_level = map_level(config_.noise_suppression.level);
+      submodules_.noise_suppressor = std::make_unique<NoiseSuppressor>(
+          cfg, proc_sample_rate_hz(), num_proc_channels());
+    } else {
+      auto ns_level =
+          NsConfigLevelToInterfaceLevel(config_.noise_suppression.level);
+      submodules_.legacy_noise_suppressor = std::make_unique<NoiseSuppression>(
+          num_proc_channels(), proc_sample_rate_hz(), ns_level);
+    }
   }
 }