Reland "Replace the ExperimentalAgc config with the new config format"

This is a reland of f3aa6326b8e21f627b9fba72040122723251999b

Original change's description:
> Replace the ExperimentalAgc config with the new config format
> 
> This CL replaces the use of the ExperimentalAgc config with
> using the new config format.
> 
> Beyond that, some further changes were made to how the analog
> and digital AGCs are initialized/called. While these can be
> made in a separate CL, I believe the code changes becomes more
> clear by bundling those with the replacement of the
> ExperimentalAgc config.
> 
> TBR: saza@webrtc.org
> Bug: webrtc:5298
> Change-Id: Ia19940f3abae048541e6716d0184b4caafc7d53e
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/163986
> Reviewed-by: Per Åhgren <peah@webrtc.org>
> Commit-Queue: Per Åhgren <peah@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#30149}

Bug: webrtc:5298
Change-Id: I6db03628ed3fa2ecd36544fe9181dd8244d7e2df
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/165760
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Commit-Queue: Per Åhgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30295}
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index a0d9dd1..ba85fc5 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -334,18 +334,7 @@
                   std::move(render_pre_processor),
                   std::move(echo_detector),
                   std::move(capture_analyzer)),
-      constants_(config.Get<ExperimentalAgc>().startup_min_volume,
-                 config.Get<ExperimentalAgc>().clipped_level_min,
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-                 /* enabled= */ false,
-                 /* enabled_agc2_level_estimator= */ false,
-                 /* digital_adaptive_disabled= */ false,
-#else
-                 config.Get<ExperimentalAgc>().enabled,
-                 config.Get<ExperimentalAgc>().enabled_agc2_level_estimator,
-                 config.Get<ExperimentalAgc>().digital_adaptive_disabled,
-#endif
-                 !field_trial::IsEnabled(
+      constants_(!field_trial::IsEnabled(
                      "WebRTC-ApmExperimentalMultiChannelRenderKillSwitch"),
                  !field_trial::IsEnabled(
                      "WebRTC-ApmExperimentalMultiChannelCaptureKillSwitch"),
@@ -365,18 +354,29 @@
   capture_nonlocked_.echo_controller_enabled =
       static_cast<bool>(echo_control_factory_);
 
-  submodules_.gain_control.reset(new GainControlImpl());
-
   // If no echo detector is injected, use the ResidualEchoDetector.
   if (!submodules_.echo_detector) {
     submodules_.echo_detector =
         new rtc::RefCountedObject<ResidualEchoDetector>();
   }
 
+#if !(defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS))
   // TODO(webrtc:5298): Remove once the use of ExperimentalNs has been
   // deprecated.
-#if !(defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS))
   config_.transient_suppression.enabled = config.Get<ExperimentalNs>().enabled;
+
+  // TODO(webrtc:5298): Remove once the use of ExperimentalAgc has been
+  // deprecated.
+  config_.gain_controller1.analog_gain_controller.enabled =
+      config.Get<ExperimentalAgc>().enabled;
+  config_.gain_controller1.analog_gain_controller.startup_min_volume =
+      config.Get<ExperimentalAgc>().startup_min_volume;
+  config_.gain_controller1.analog_gain_controller.clipped_level_min =
+      config.Get<ExperimentalAgc>().clipped_level_min;
+  config_.gain_controller1.analog_gain_controller.enable_agc2_level_estimator =
+      config.Get<ExperimentalAgc>().enabled_agc2_level_estimator;
+  config_.gain_controller1.analog_gain_controller.enable_digital_adaptive =
+      !config.Get<ExperimentalAgc>().digital_adaptive_disabled;
 #endif
 }
 
@@ -481,34 +481,7 @@
 
   AllocateRenderQueue();
 
-  submodules_.gain_control->Initialize(num_proc_channels(),
-                                       proc_sample_rate_hz());
-  if (constants_.use_experimental_agc) {
-    if (!submodules_.agc_manager.get() ||
-        submodules_.agc_manager->num_channels() !=
-            static_cast<int>(num_proc_channels()) ||
-        submodules_.agc_manager->sample_rate_hz() !=
-            capture_nonlocked_.split_rate) {
-      int stream_analog_level = -1;
-      const bool re_creation = !!submodules_.agc_manager;
-      if (re_creation) {
-        stream_analog_level = submodules_.agc_manager->stream_analog_level();
-      }
-      submodules_.agc_manager.reset(new AgcManagerDirect(
-          num_proc_channels(), constants_.agc_startup_min_volume,
-          constants_.agc_clipped_level_min,
-          constants_.use_experimental_agc_agc2_level_estimation,
-          constants_.use_experimental_agc_agc2_digital_adaptive,
-          capture_nonlocked_.split_rate));
-      if (re_creation) {
-        submodules_.agc_manager->set_stream_analog_level(stream_analog_level);
-      }
-    }
-    submodules_.agc_manager->Initialize();
-    submodules_.agc_manager->SetupDigitalGainControl(
-        submodules_.gain_control.get());
-    submodules_.agc_manager->SetCaptureMuted(capture_.output_will_be_muted);
-  }
+  InitializeGainController1();
   InitializeTransientSuppressor();
   InitializeHighPassFilter(true);
   InitializeVoiceDetector();
@@ -651,7 +624,20 @@
       config_.gain_controller1.analog_level_minimum !=
           config.gain_controller1.analog_level_minimum ||
       config_.gain_controller1.analog_level_maximum !=
-          config.gain_controller1.analog_level_maximum;
+          config.gain_controller1.analog_level_maximum ||
+      config_.gain_controller1.analog_gain_controller.enabled !=
+          config.gain_controller1.analog_gain_controller.enabled ||
+      config_.gain_controller1.analog_gain_controller.startup_min_volume !=
+          config.gain_controller1.analog_gain_controller.startup_min_volume ||
+      config_.gain_controller1.analog_gain_controller.clipped_level_min !=
+          config.gain_controller1.analog_gain_controller.clipped_level_min ||
+      config_.gain_controller1.analog_gain_controller
+              .enable_agc2_level_estimator !=
+          config.gain_controller1.analog_gain_controller
+              .enable_agc2_level_estimator ||
+      config_.gain_controller1.analog_gain_controller.enable_digital_adaptive !=
+          config.gain_controller1.analog_gain_controller
+              .enable_digital_adaptive;
 
   const bool agc2_config_changed =
       config_.gain_controller2.enabled != config.gain_controller2.enabled;
@@ -688,7 +674,7 @@
   InitializeHighPassFilter(false);
 
   if (agc1_config_changed) {
-    ApplyAgc1Config(config_.gain_controller1);
+    InitializeGainController1();
   }
 
   const bool config_ok = GainController2::Validate(config_.gain_controller2);
@@ -723,29 +709,6 @@
   }
 }
 
-void AudioProcessingImpl::ApplyAgc1Config(
-    const Config::GainController1& config) {
-  int error = submodules_.gain_control->Enable(config.enabled);
-  RTC_DCHECK_EQ(kNoError, error);
-
-  if (!submodules_.agc_manager) {
-    error = submodules_.gain_control->set_mode(
-        Agc1ConfigModeToInterfaceMode(config.mode));
-    RTC_DCHECK_EQ(kNoError, error);
-    error = submodules_.gain_control->set_target_level_dbfs(
-        config.target_level_dbfs);
-    RTC_DCHECK_EQ(kNoError, error);
-    error = submodules_.gain_control->set_compression_gain_db(
-        config.compression_gain_db);
-    RTC_DCHECK_EQ(kNoError, error);
-    error = submodules_.gain_control->enable_limiter(config.enable_limiter);
-    RTC_DCHECK_EQ(kNoError, error);
-    error = submodules_.gain_control->set_analog_level_limits(
-        config.analog_level_minimum, config.analog_level_maximum);
-    RTC_DCHECK_EQ(kNoError, error);
-  }
-}
-
 // TODO(webrtc:5298): Remove.
 void AudioProcessingImpl::SetExtraOptions(const webrtc::Config& config) {}
 
@@ -935,9 +898,11 @@
           setting.GetFloat(&value);
           int int_value = static_cast<int>(value + .5f);
           config_.gain_controller1.compression_gain_db = int_value;
-          int error =
-              submodules_.gain_control->set_compression_gain_db(int_value);
-          RTC_DCHECK_EQ(kNoError, error);
+          if (submodules_.gain_control) {
+            int error =
+                submodules_.gain_control->set_compression_gain_db(int_value);
+            RTC_DCHECK_EQ(kNoError, error);
+          }
         }
         break;
       }
@@ -1013,7 +978,7 @@
     }
   }
 
-  if (!submodules_.agc_manager) {
+  if (!submodules_.agc_manager && submodules_.gain_control) {
     GainControlImpl::PackRenderAudioBuffer(*audio, &agc_render_queue_buffer_);
     // Insert the samples into the queue.
     if (!agc_render_signal_queue_->Insert(&agc_render_queue_buffer_)) {
@@ -1100,8 +1065,10 @@
     }
   }
 
-  while (agc_render_signal_queue_->Remove(&agc_capture_queue_buffer_)) {
-    submodules_.gain_control->ProcessRenderAudio(agc_capture_queue_buffer_);
+  if (submodules_.gain_control) {
+    while (agc_render_signal_queue_->Remove(&agc_capture_queue_buffer_)) {
+      submodules_.gain_control->ProcessRenderAudio(agc_capture_queue_buffer_);
+    }
   }
 
   while (red_render_signal_queue_->Remove(&red_capture_queue_buffer_)) {
@@ -1222,8 +1189,7 @@
     submodules_.echo_controller->AnalyzeCapture(capture_buffer);
   }
 
-  if (constants_.use_experimental_agc &&
-      submodules_.gain_control->is_enabled()) {
+  if (submodules_.agc_manager) {
     submodules_.agc_manager->AnalyzePreProcess(capture_buffer);
   }
 
@@ -1250,7 +1216,10 @@
                                           /*use_split_band_data=*/true);
   }
 
-  RETURN_ON_ERR(submodules_.gain_control->AnalyzeCaptureAudio(*capture_buffer));
+  if (submodules_.gain_control) {
+    RETURN_ON_ERR(
+        submodules_.gain_control->AnalyzeCaptureAudio(*capture_buffer));
+  }
   RTC_DCHECK(
       !(submodules_.legacy_noise_suppressor && submodules_.noise_suppressor));
 
@@ -1315,19 +1284,21 @@
     capture_.stats.voice_detected = absl::nullopt;
   }
 
-  if (constants_.use_experimental_agc &&
-      submodules_.gain_control->is_enabled()) {
+  if (submodules_.agc_manager) {
     submodules_.agc_manager->Process(capture_buffer);
 
     absl::optional<int> new_digital_gain =
         submodules_.agc_manager->GetDigitalComressionGain();
-    if (new_digital_gain) {
+    if (new_digital_gain && submodules_.gain_control) {
       submodules_.gain_control->set_compression_gain_db(*new_digital_gain);
     }
   }
-  // TODO(peah): Add reporting from AEC3 whether there is echo.
-  RETURN_ON_ERR(submodules_.gain_control->ProcessCaptureAudio(
-      capture_buffer, /*stream_has_echo*/ false));
+
+  if (submodules_.gain_control) {
+    // TODO(peah): Add reporting from AEC3 whether there is echo.
+    RETURN_ON_ERR(submodules_.gain_control->ProcessCaptureAudio(
+        capture_buffer, /*stream_has_echo*/ false));
+  }
 
   if (submodule_states_.CaptureMultiBandProcessingPresent() &&
       SampleRateSupportsMultiBand(
@@ -1656,9 +1627,11 @@
     submodules_.agc_manager->set_stream_analog_level(level);
     data_dumper_->DumpRaw("experimental_gain_control_set_stream_analog_level",
                           1, &level);
-  } else {
+  } else if (submodules_.gain_control) {
     int error = submodules_.gain_control->set_stream_analog_level(level);
     RTC_DCHECK_EQ(kNoError, error);
+  } else {
+    capture_.cached_stream_analog_level_ = level;
   }
 }
 
@@ -1666,8 +1639,11 @@
   rtc::CritScope cs_capture(&crit_capture_);
   if (submodules_.agc_manager) {
     return submodules_.agc_manager->stream_analog_level();
+  } else if (submodules_.gain_control) {
+    return submodules_.gain_control->stream_analog_level();
+  } else {
+    return capture_.cached_stream_analog_level_;
   }
-  return submodules_.gain_control->stream_analog_level();
 }
 
 void AudioProcessingImpl::AttachAecDump(std::unique_ptr<AecDump> aec_dump) {
@@ -1724,7 +1700,7 @@
       config_.high_pass_filter.enabled, !!submodules_.echo_control_mobile,
       config_.residual_echo_detector.enabled,
       !!submodules_.legacy_noise_suppressor || !!submodules_.noise_suppressor,
-      submodules_.gain_control->is_enabled(), !!submodules_.gain_controller2,
+      !!submodules_.gain_control, !!submodules_.gain_controller2,
       config_.pre_amplifier.enabled, capture_nonlocked_.echo_controller_enabled,
       config_.voice_detection.enabled, !!submodules_.transient_suppressor);
 }
@@ -1855,6 +1831,71 @@
   aecm_render_signal_queue_.reset();
 }
 
+void AudioProcessingImpl::InitializeGainController1() {
+  if (!config_.gain_controller1.enabled) {
+    submodules_.agc_manager.reset();
+    submodules_.gain_control.reset();
+    return;
+  }
+
+  if (!submodules_.gain_control) {
+    submodules_.gain_control.reset(new GainControlImpl());
+  }
+
+  submodules_.gain_control->Initialize(num_proc_channels(),
+                                       proc_sample_rate_hz());
+
+  if (!config_.gain_controller1.analog_gain_controller.enabled) {
+    int error = submodules_.gain_control->set_mode(
+        Agc1ConfigModeToInterfaceMode(config_.gain_controller1.mode));
+    RTC_DCHECK_EQ(kNoError, error);
+    error = submodules_.gain_control->set_target_level_dbfs(
+        config_.gain_controller1.target_level_dbfs);
+    RTC_DCHECK_EQ(kNoError, error);
+    error = submodules_.gain_control->set_compression_gain_db(
+        config_.gain_controller1.compression_gain_db);
+    RTC_DCHECK_EQ(kNoError, error);
+    error = submodules_.gain_control->enable_limiter(
+        config_.gain_controller1.enable_limiter);
+    RTC_DCHECK_EQ(kNoError, error);
+    error = submodules_.gain_control->set_analog_level_limits(
+        config_.gain_controller1.analog_level_minimum,
+        config_.gain_controller1.analog_level_maximum);
+    RTC_DCHECK_EQ(kNoError, error);
+
+    submodules_.agc_manager.reset();
+    return;
+  }
+
+  if (!submodules_.agc_manager.get() ||
+      submodules_.agc_manager->num_channels() !=
+          static_cast<int>(num_proc_channels()) ||
+      submodules_.agc_manager->sample_rate_hz() !=
+          capture_nonlocked_.split_rate) {
+    int stream_analog_level = -1;
+    const bool re_creation = !!submodules_.agc_manager;
+    if (re_creation) {
+      stream_analog_level = submodules_.agc_manager->stream_analog_level();
+    }
+    submodules_.agc_manager.reset(new AgcManagerDirect(
+        num_proc_channels(),
+        config_.gain_controller1.analog_gain_controller.startup_min_volume,
+        config_.gain_controller1.analog_gain_controller.clipped_level_min,
+        config_.gain_controller1.analog_gain_controller
+            .enable_agc2_level_estimator,
+        !config_.gain_controller1.analog_gain_controller
+             .enable_digital_adaptive,
+        capture_nonlocked_.split_rate));
+    if (re_creation) {
+      submodules_.agc_manager->set_stream_analog_level(stream_analog_level);
+    }
+  }
+  submodules_.agc_manager->Initialize();
+  submodules_.agc_manager->SetupDigitalGainControl(
+      submodules_.gain_control.get());
+  submodules_.agc_manager->SetCaptureMuted(capture_.output_will_be_muted);
+}
+
 void AudioProcessingImpl::InitializeGainController2() {
   if (config_.gain_controller2.enabled) {
     if (!submodules_.gain_controller2) {
@@ -1958,7 +1999,8 @@
   std::string experiments_description = "";
   // TODO(peah): Add semicolon-separated concatenations of experiment
   // descriptions for other submodules.
-  if (constants_.agc_clipped_level_min != kClippedLevelMin) {
+  if (config_.gain_controller1.analog_gain_controller.clipped_level_min !=
+      kClippedLevelMin) {
     experiments_description += "AgcClippingLevelExperiment;";
   }
   if (capture_nonlocked_.echo_controller_enabled) {
@@ -1984,10 +2026,14 @@
           ? static_cast<int>(submodules_.echo_control_mobile->routing_mode())
           : 0;
 
-  apm_config.agc_enabled = submodules_.gain_control->is_enabled();
-  apm_config.agc_mode = static_cast<int>(submodules_.gain_control->mode());
+  apm_config.agc_enabled = !!submodules_.gain_control;
+
+  apm_config.agc_mode = submodules_.gain_control
+                            ? static_cast<int>(submodules_.gain_control->mode())
+                            : GainControl::kAdaptiveAnalog;
   apm_config.agc_limiter_enabled =
-      submodules_.gain_control->is_limiter_enabled();
+      submodules_.gain_control ? submodules_.gain_control->is_limiter_enabled()
+                               : false;
   apm_config.noise_robust_agc_enabled = !!submodules_.agc_manager;
 
   apm_config.hpf_enabled = config_.high_pass_filter.enabled;