Remove AudioProcessing::gain_control() getter

This change also resolves a bug in audioproc_f:
The implicit ApplyConfig calls to enable gain control settings in
aec_dump_simulator.cc:377-406 [1] are overwritten by the ApplyConfig
call on line 500 using a config from line 292.

Compared to a ToT build including a fix for that bug, these changes
are bitexact on a large number of aecdumps.

[1] https://cs.chromium.org/chromium/src/third_party/webrtc/modules/audio_processing/test/aec_dump_based_simulator.cc?l=377&rcl=8bbf9e2c6e40feb8efcbf276b43945a14d651e9b

Bug: webrtc:9878
Change-Id: Id427d34e838c999d996d58193977ac2a9198edd6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/156463
Commit-Queue: Sam Zackrisson <saza@webrtc.org>
Reviewed-by: Ivo Creusen <ivoc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29481}
diff --git a/media/BUILD.gn b/media/BUILD.gn
index 3c8008a..39d40a7 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -291,8 +291,8 @@
     "../modules/audio_device:audio_device_impl",
     "../modules/audio_mixer:audio_mixer_impl",
     "../modules/audio_processing:api",
-    "../modules/audio_processing:gain_control_interface",
     "../modules/audio_processing/aec_dump",
+    "../modules/audio_processing/agc:gain_control_interface",
     "../modules/video_coding",
     "../modules/video_coding:video_codec_interface",
     "../modules/video_coding:video_coding_utility",
diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn
index 6fa6585..df06c14 100644
--- a/modules/audio_processing/BUILD.gn
+++ b/modules/audio_processing/BUILD.gn
@@ -49,7 +49,6 @@
     ":audio_generator_interface",
     ":audio_processing_statistics",
     ":config",
-    ":gain_control_interface",
     "../../api:scoped_refptr",
     "../../api/audio:aec3_config",
     "../../api/audio:echo_control",
@@ -58,6 +57,7 @@
     "../../rtc_base:rtc_base_approved",
     "../../rtc_base/system:arch",
     "../../rtc_base/system:rtc_export",
+    "agc:gain_control_interface",
     "//third_party/abseil-cpp/absl/types:optional",
   ]
 }
@@ -170,8 +170,6 @@
     ":audio_processing_c",
     ":audio_processing_statistics",
     ":config",
-    ":gain_control_config_proxy",
-    ":gain_control_interface",
     ":high_pass_filter",
     ":noise_suppression_proxy",
     "../../api:array_view",
@@ -197,6 +195,7 @@
     "aecm:aecm_core",
     "agc",
     "agc:agc_legacy_c",
+    "agc:gain_control_interface",
     "agc2:adaptive_digital",
     "agc2:fixed_digital",
     "agc2:gain_applier",
@@ -223,25 +222,6 @@
   ]
 }
 
-rtc_source_set("gain_control_interface") {
-  sources = [
-    "include/gain_control.h",
-  ]
-}
-
-rtc_source_set("gain_control_config_proxy") {
-  sources = [
-    "gain_control_config_proxy.cc",
-    "gain_control_config_proxy.h",
-  ]
-  deps = [
-    ":api",
-    ":gain_control_interface",
-    "../../rtc_base:criticalsection",
-    "../../rtc_base:macromagic",
-  ]
-}
-
 rtc_source_set("noise_suppression_proxy") {
   sources = [
     "noise_suppression_proxy.cc",
@@ -434,7 +414,6 @@
       "config_unittest.cc",
       "echo_cancellation_impl_unittest.cc",
       "echo_control_mobile_unittest.cc",
-      "gain_control_config_proxy_unittest.cc",
       "gain_controller2_unittest.cc",
       "splitting_filter_unittest.cc",
       "test/fake_recording_device_unittest.cc",
@@ -459,7 +438,6 @@
       ":audioproc_test_utils",
       ":config",
       ":file_audio_generator_unittests",
-      ":gain_control_config_proxy",
       ":high_pass_filter",
       ":mocks",
       "../../api:array_view",
diff --git a/modules/audio_processing/agc/BUILD.gn b/modules/audio_processing/agc/BUILD.gn
index f8ed539..7e363ca 100644
--- a/modules/audio_processing/agc/BUILD.gn
+++ b/modules/audio_processing/agc/BUILD.gn
@@ -8,6 +8,12 @@
 
 import("../../../webrtc.gni")
 
+rtc_source_set("gain_control_interface") {
+  sources = [
+    "gain_control.h",
+  ]
+}
+
 rtc_source_set("agc") {
   sources = [
     "agc_manager_direct.cc",
@@ -15,10 +21,10 @@
   ]
   configs += [ "..:apm_debug_dump" ]
   deps = [
+    ":gain_control_interface",
     ":gain_map",
     ":level_estimation",
     "..:apm_logging",
-    "..:gain_control_interface",
     "../../../common_audio",
     "../../../common_audio:common_audio_c",
     "../../../rtc_base:checks",
@@ -100,6 +106,7 @@
 
     deps = [
       ":agc",
+      ":gain_control_interface",
       ":level_estimation",
       "..:mocks",
       "../../../test:fileutils",
diff --git a/modules/audio_processing/agc/agc_manager_direct.cc b/modules/audio_processing/agc/agc_manager_direct.cc
index 4b0de78..f913560 100644
--- a/modules/audio_processing/agc/agc_manager_direct.cc
+++ b/modules/audio_processing/agc/agc_manager_direct.cc
@@ -18,9 +18,9 @@
 #endif
 
 #include "common_audio/include/audio_util.h"
+#include "modules/audio_processing/agc/gain_control.h"
 #include "modules/audio_processing/agc/gain_map_internal.h"
 #include "modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h"
-#include "modules/audio_processing/include/gain_control.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/numerics/safe_minmax.h"
diff --git a/modules/audio_processing/agc/agc_manager_direct_unittest.cc b/modules/audio_processing/agc/agc_manager_direct_unittest.cc
index cfa7f69..615a8d8 100644
--- a/modules/audio_processing/agc/agc_manager_direct_unittest.cc
+++ b/modules/audio_processing/agc/agc_manager_direct_unittest.cc
@@ -10,6 +10,7 @@
 
 #include "modules/audio_processing/agc/agc_manager_direct.h"
 
+#include "modules/audio_processing/agc/gain_control.h"
 #include "modules/audio_processing/agc/mock_agc.h"
 #include "modules/audio_processing/include/mock_audio_processing.h"
 #include "test/gmock.h"
@@ -31,6 +32,27 @@
 constexpr int kClippedMin = 165;  // Arbitrary, but different from the default.
 const float kAboveClippedThreshold = 0.2f;
 
+class MockGainControl : public GainControl {
+ public:
+  virtual ~MockGainControl() {}
+  MOCK_METHOD1(Enable, int(bool enable));
+  MOCK_CONST_METHOD0(is_enabled, bool());
+  MOCK_METHOD1(set_stream_analog_level, int(int level));
+  MOCK_CONST_METHOD0(stream_analog_level, int());
+  MOCK_METHOD1(set_mode, int(Mode mode));
+  MOCK_CONST_METHOD0(mode, Mode());
+  MOCK_METHOD1(set_target_level_dbfs, int(int level));
+  MOCK_CONST_METHOD0(target_level_dbfs, int());
+  MOCK_METHOD1(set_compression_gain_db, int(int gain));
+  MOCK_CONST_METHOD0(compression_gain_db, int());
+  MOCK_METHOD1(enable_limiter, int(bool enable));
+  MOCK_CONST_METHOD0(is_limiter_enabled, bool());
+  MOCK_METHOD2(set_analog_level_limits, int(int minimum, int maximum));
+  MOCK_CONST_METHOD0(analog_level_minimum, int());
+  MOCK_CONST_METHOD0(analog_level_maximum, int());
+  MOCK_CONST_METHOD0(stream_is_saturated, bool());
+};
+
 class TestVolumeCallbacks : public VolumeCallbacks {
  public:
   TestVolumeCallbacks() : volume_(0) {}
@@ -89,7 +111,7 @@
   }
 
   MockAgc* agc_;
-  test::MockGainControl gctrl_;
+  MockGainControl gctrl_;
   TestVolumeCallbacks volume_;
   AgcManagerDirect manager_;
 };
@@ -684,7 +706,7 @@
 
 TEST(AgcManagerDirectStandaloneTest, DisableDigitalDisablesDigital) {
   auto agc = std::unique_ptr<Agc>(new ::testing::NiceMock<MockAgc>());
-  test::MockGainControl gctrl;
+  MockGainControl gctrl;
   TestVolumeCallbacks volume;
 
   AgcManagerDirect manager(agc.release(), &gctrl, &volume, kInitialVolume,
diff --git a/modules/audio_processing/include/gain_control.h b/modules/audio_processing/agc/gain_control.h
similarity index 96%
rename from modules/audio_processing/include/gain_control.h
rename to modules/audio_processing/agc/gain_control.h
index 69208a7..f31cbec 100644
--- a/modules/audio_processing/include/gain_control.h
+++ b/modules/audio_processing/agc/gain_control.h
@@ -8,8 +8,8 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#ifndef MODULES_AUDIO_PROCESSING_INCLUDE_GAIN_CONTROL_H_
-#define MODULES_AUDIO_PROCESSING_INCLUDE_GAIN_CONTROL_H_
+#ifndef MODULES_AUDIO_PROCESSING_AGC_GAIN_CONTROL_H_
+#define MODULES_AUDIO_PROCESSING_AGC_GAIN_CONTROL_H_
 
 namespace webrtc {
 
@@ -105,4 +105,4 @@
 };
 }  // namespace webrtc
 
-#endif  // MODULES_AUDIO_PROCESSING_INCLUDE_GAIN_CONTROL_H_
+#endif  // MODULES_AUDIO_PROCESSING_AGC_GAIN_CONTROL_H_
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index 0582ece..39de770 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -28,7 +28,6 @@
 #include "modules/audio_processing/common.h"
 #include "modules/audio_processing/echo_cancellation_impl.h"
 #include "modules/audio_processing/echo_control_mobile_impl.h"
-#include "modules/audio_processing/gain_control_config_proxy.h"
 #include "modules/audio_processing/gain_control_for_experimental_agc.h"
 #include "modules/audio_processing/gain_control_impl.h"
 #include "modules/audio_processing/gain_controller2.h"
@@ -263,7 +262,6 @@
   std::unique_ptr<GainControlImpl> gain_control;
   std::unique_ptr<GainControlForExperimentalAgc>
       gain_control_for_experimental_agc;
-  std::unique_ptr<GainControlConfigProxy> gain_control_config_proxy;
 
   // Accessed internally from both render and capture.
   std::unique_ptr<TransientSuppressor> transient_suppressor;
@@ -412,8 +410,6 @@
   public_submodules_->gain_control_for_experimental_agc.reset(
       new GainControlForExperimentalAgc(
           public_submodules_->gain_control.get()));
-  public_submodules_->gain_control_config_proxy.reset(
-      new GainControlConfigProxy(&crit_capture_, this, agc1()));
 
   // If no echo detector is injected, use the ResidualEchoDetector.
   if (!private_submodules_->echo_detector) {
@@ -1828,10 +1824,6 @@
   return stats;
 }
 
-GainControl* AudioProcessingImpl::gain_control() const {
-  return public_submodules_->gain_control_config_proxy.get();
-}
-
 NoiseSuppression* AudioProcessingImpl::noise_suppression() const {
   return public_submodules_->noise_suppression_proxy.get();
 }
diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h
index aa577a0..8af8b22 100644
--- a/modules/audio_processing/audio_processing_impl.h
+++ b/modules/audio_processing/audio_processing_impl.h
@@ -16,6 +16,7 @@
 #include <vector>
 
 #include "api/function_view.h"
+#include "modules/audio_processing/agc/gain_control.h"
 #include "modules/audio_processing/audio_buffer.h"
 #include "modules/audio_processing/include/aec_dump.h"
 #include "modules/audio_processing/include/audio_processing.h"
@@ -119,7 +120,6 @@
   // would offer no protection (the submodules are
   // created only once in a single-treaded manner
   // during APM creation).
-  GainControl* gain_control() const override;
   NoiseSuppression* noise_suppression() const override;
 
   // TODO(peah): Remove MutateConfig once the new API allows that.
diff --git a/modules/audio_processing/audio_processing_impl_locking_unittest.cc b/modules/audio_processing/audio_processing_impl_locking_unittest.cc
index c974a3c..08b1ee8 100644
--- a/modules/audio_processing/audio_processing_impl_locking_unittest.cc
+++ b/modules/audio_processing/audio_processing_impl_locking_unittest.cc
@@ -535,17 +535,14 @@
 void AudioProcessingImplLockTest::SetUp() {
   test_config_ = static_cast<TestConfig>(GetParam());
 
-  ASSERT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
-
-  ASSERT_EQ(apm_->kNoError,
-            apm_->gain_control()->set_mode(GainControl::kAdaptiveDigital));
-  ASSERT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
-
   AudioProcessing::Config apm_config = apm_->GetConfig();
   apm_config.echo_canceller.enabled =
       (test_config_.aec_type != AecType::AecTurnedOff);
   apm_config.echo_canceller.mobile_mode =
       (test_config_.aec_type == AecType::BasicWebRtcAecSettingsWithAecMobile);
+  apm_config.gain_controller1.enabled = true;
+  apm_config.gain_controller1.mode =
+      AudioProcessing::Config::GainController1::kAdaptiveDigital;
   apm_config.noise_suppression.enabled = true;
   apm_config.voice_detection.enabled = true;
   apm_config.level_estimation.enabled = true;
@@ -590,7 +587,7 @@
   } else {
     EXPECT_FALSE(apm_config.echo_canceller.enabled);
   }
-  EXPECT_TRUE(apm_->gain_control()->is_enabled());
+  EXPECT_TRUE(apm_config.gain_controller1.enabled);
   EXPECT_TRUE(apm_config.noise_suppression.enabled);
 
   // The below return values are not testable.
@@ -697,7 +694,7 @@
   apm_->set_stream_delay_ms(30);
 
   // Set the analog level.
-  apm_->gain_control()->set_stream_analog_level(80);
+  apm_->set_stream_analog_level(80);
 
   // Call the specified capture side API processing method.
   int result = AudioProcessing::kNoError;
@@ -722,7 +719,7 @@
   }
 
   // Retrieve the new analog level.
-  apm_->gain_control()->stream_analog_level();
+  apm_->recommended_stream_analog_level();
 
   // Check the return code for error.
   ASSERT_EQ(AudioProcessing::kNoError, result);
diff --git a/modules/audio_processing/audio_processing_impl_unittest.cc b/modules/audio_processing/audio_processing_impl_unittest.cc
index 292b632..b4f78e5 100644
--- a/modules/audio_processing/audio_processing_impl_unittest.cc
+++ b/modules/audio_processing/audio_processing_impl_unittest.cc
@@ -221,9 +221,9 @@
       AudioProcessingBuilder()
           .SetEchoControlFactory(std::move(echo_control_factory))
           .Create());
-  apm->gain_control()->Enable(false);  // Disable AGC.
-  apm->gain_control()->set_mode(GainControl::Mode::kFixedDigital);
+  // Disable AGC.
   webrtc::AudioProcessing::Config apm_config;
+  apm_config.gain_controller1.enabled = false;
   apm_config.gain_controller2.enabled = false;
   apm_config.pre_amplifier.enabled = true;
   apm_config.pre_amplifier.fixed_gain_factor = 1.f;
@@ -264,9 +264,11 @@
       AudioProcessingBuilder()
           .SetEchoControlFactory(std::move(echo_control_factory))
           .Create());
-  apm->gain_control()->Enable(true);  // Enable AGC.
-  apm->gain_control()->set_mode(GainControl::Mode::kAdaptiveAnalog);
   webrtc::AudioProcessing::Config apm_config;
+  // Enable AGC1.
+  apm_config.gain_controller1.enabled = true;
+  apm_config.gain_controller1.mode =
+      AudioProcessing::Config::GainController1::kAdaptiveAnalog;
   apm_config.gain_controller2.enabled = false;
   apm_config.pre_amplifier.enabled = false;
   apm->ApplyConfig(apm_config);
@@ -280,14 +282,14 @@
 
   MockEchoControl* echo_control_mock = echo_control_factory_ptr->GetNext();
 
-  const int initial_analog_gain = apm->gain_control()->stream_analog_level();
+  const int initial_analog_gain = apm->recommended_stream_analog_level();
   EXPECT_CALL(*echo_control_mock, AnalyzeCapture(testing::_)).Times(1);
   EXPECT_CALL(*echo_control_mock, ProcessCapture(NotNull(), false)).Times(1);
   apm->ProcessStream(&frame);
 
   // Force an analog gain change if it did not happen.
-  if (initial_analog_gain == apm->gain_control()->stream_analog_level()) {
-    apm->gain_control()->set_stream_analog_level(initial_analog_gain + 1);
+  if (initial_analog_gain == apm->recommended_stream_analog_level()) {
+    apm->set_stream_analog_level(initial_analog_gain + 1);
   }
 
   EXPECT_CALL(*echo_control_mock, AnalyzeCapture(testing::_)).Times(1);
@@ -305,8 +307,11 @@
       AudioProcessingBuilder()
           .SetEchoControlFactory(std::move(echo_control_factory))
           .Create());
-  apm->gain_control()->Enable(false);  // Disable AGC.
-  apm->gain_control()->set_mode(GainControl::Mode::kFixedDigital);
+  // Disable AGC.
+  webrtc::AudioProcessing::Config apm_config;
+  apm_config.gain_controller1.enabled = false;
+  apm_config.gain_controller2.enabled = false;
+  apm->ApplyConfig(apm_config);
 
   AudioFrame frame;
   constexpr int16_t kAudioLevel = 10000;
diff --git a/modules/audio_processing/audio_processing_performance_unittest.cc b/modules/audio_processing/audio_processing_performance_unittest.cc
index 24026f1..8fcf992 100644
--- a/modules/audio_processing/audio_processing_performance_unittest.cc
+++ b/modules/audio_processing/audio_processing_performance_unittest.cc
@@ -446,14 +446,13 @@
   void SetUp() override {
     // Lambda function for setting the default APM runtime settings for desktop.
     auto set_default_desktop_apm_runtime_settings = [](AudioProcessing* apm) {
-      ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
-      ASSERT_EQ(apm->kNoError,
-                apm->gain_control()->set_mode(GainControl::kAdaptiveDigital));
-      ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
       ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
       AudioProcessing::Config apm_config = apm->GetConfig();
       apm_config.echo_canceller.enabled = true;
       apm_config.echo_canceller.mobile_mode = false;
+      apm_config.gain_controller1.enabled = true;
+      apm_config.gain_controller1.mode =
+          AudioProcessing::Config::GainController1::kAdaptiveDigital;
       apm_config.level_estimation.enabled = true;
       apm_config.voice_detection.enabled = true;
       apm->ApplyConfig(apm_config);
@@ -461,14 +460,13 @@
 
     // Lambda function for setting the default APM runtime settings for mobile.
     auto set_default_mobile_apm_runtime_settings = [](AudioProcessing* apm) {
-      ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
-      ASSERT_EQ(apm->kNoError,
-                apm->gain_control()->set_mode(GainControl::kAdaptiveDigital));
-      ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
       ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
       AudioProcessing::Config apm_config = apm->GetConfig();
       apm_config.echo_canceller.enabled = true;
       apm_config.echo_canceller.mobile_mode = true;
+      apm_config.gain_controller1.mode =
+          AudioProcessing::Config::GainController1::kAdaptiveDigital;
+      apm_config.level_estimation.enabled = true;
       apm_config.level_estimation.enabled = true;
       apm_config.voice_detection.enabled = true;
       apm->ApplyConfig(apm_config);
@@ -477,13 +475,10 @@
     // Lambda function for turning off all of the APM runtime settings
     // submodules.
     auto turn_off_default_apm_runtime_settings = [](AudioProcessing* apm) {
-      ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(false));
-      ASSERT_EQ(apm->kNoError,
-                apm->gain_control()->set_mode(GainControl::kAdaptiveDigital));
-      ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(false));
       ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(false));
       AudioProcessing::Config apm_config = apm->GetConfig();
       apm_config.echo_canceller.enabled = false;
+      apm_config.gain_controller1.enabled = false;
       apm_config.level_estimation.enabled = false;
       apm_config.voice_detection.enabled = false;
       apm->ApplyConfig(apm_config);
diff --git a/modules/audio_processing/audio_processing_unittest.cc b/modules/audio_processing/audio_processing_unittest.cc
index caa7bab..78a7220 100644
--- a/modules/audio_processing/audio_processing_unittest.cc
+++ b/modules/audio_processing/audio_processing_unittest.cc
@@ -560,7 +560,7 @@
 
 void ApmTest::ProcessWithDefaultStreamParameters(AudioFrame* frame) {
   EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_stream_analog_level(127));
+  apm_->set_stream_analog_level(127);
   EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame));
 }
 
@@ -678,22 +678,24 @@
   EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
 
   // -- Missing AGC level --
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
+  AudioProcessing::Config apm_config = apm_->GetConfig();
+  apm_config.gain_controller1.enabled = true;
+  apm_->ApplyConfig(apm_config);
   EXPECT_EQ(apm_->kStreamParameterNotSetError, ProcessStreamChooser(format));
 
   // Resets after successful ProcessStream().
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_stream_analog_level(127));
+  apm_->set_stream_analog_level(127);
   EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
   EXPECT_EQ(apm_->kStreamParameterNotSetError, ProcessStreamChooser(format));
 
   // Other stream parameters set correctly.
-  AudioProcessing::Config apm_config = apm_->GetConfig();
   apm_config.echo_canceller.enabled = true;
   apm_config.echo_canceller.mobile_mode = false;
   apm_->ApplyConfig(apm_config);
   EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
   EXPECT_EQ(apm_->kStreamParameterNotSetError, ProcessStreamChooser(format));
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
+  apm_config.gain_controller1.enabled = false;
+  apm_->ApplyConfig(apm_config);
 
   // -- Missing delay --
   EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
@@ -705,10 +707,12 @@
   EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
 
   // Other stream parameters set correctly.
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_stream_analog_level(127));
+  apm_config.gain_controller1.enabled = true;
+  apm_->ApplyConfig(apm_config);
+  apm_->set_stream_analog_level(127);
   EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
+  apm_config.gain_controller1.enabled = false;
+  apm_->ApplyConfig(apm_config);
 
   // -- No stream parameters --
   EXPECT_EQ(apm_->kNoError, AnalyzeReverseStreamChooser(format));
@@ -716,7 +720,7 @@
 
   // -- All there --
   EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_stream_analog_level(127));
+  apm_->set_stream_analog_level(127);
   EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
 }
 
@@ -839,117 +843,129 @@
 }
 
 TEST_F(ApmTest, GainControl) {
+  AudioProcessing::Config config = apm_->GetConfig();
+  config.gain_controller1.enabled = false;
+  apm_->ApplyConfig(config);
+  config.gain_controller1.enabled = true;
+  apm_->ApplyConfig(config);
+
   // Testing gain modes
-  EXPECT_EQ(apm_->kNoError,
-            apm_->gain_control()->set_mode(apm_->gain_control()->mode()));
-
-  GainControl::Mode mode[] = {GainControl::kAdaptiveAnalog,
-                              GainControl::kAdaptiveDigital,
-                              GainControl::kFixedDigital};
-  for (size_t i = 0; i < arraysize(mode); i++) {
-    EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_mode(mode[i]));
-    EXPECT_EQ(mode[i], apm_->gain_control()->mode());
+  for (auto mode :
+       {AudioProcessing::Config::GainController1::kAdaptiveDigital,
+        AudioProcessing::Config::GainController1::kFixedDigital,
+        AudioProcessing::Config::GainController1::kAdaptiveAnalog}) {
+    config.gain_controller1.mode = mode;
+    apm_->ApplyConfig(config);
+    apm_->set_stream_analog_level(100);
+    EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(kFloatFormat));
   }
-  // Testing target levels
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_target_level_dbfs(
-                                apm_->gain_control()->target_level_dbfs()));
 
-  int level_dbfs[] = {0, 6, 31};
-  for (size_t i = 0; i < arraysize(level_dbfs); i++) {
-    EXPECT_EQ(apm_->kNoError,
-              apm_->gain_control()->set_target_level_dbfs(level_dbfs[i]));
-    EXPECT_EQ(level_dbfs[i], apm_->gain_control()->target_level_dbfs());
+  // Testing target levels
+  for (int target_level_dbfs : {0, 15, 31}) {
+    config.gain_controller1.target_level_dbfs = target_level_dbfs;
+    apm_->ApplyConfig(config);
+    apm_->set_stream_analog_level(100);
+    EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(kFloatFormat));
   }
 
   // Testing compression gains
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_compression_gain_db(
-                                apm_->gain_control()->compression_gain_db()));
-
-  int gain_db[] = {0, 10, 90};
-  for (size_t i = 0; i < arraysize(gain_db); i++) {
-    EXPECT_EQ(apm_->kNoError,
-              apm_->gain_control()->set_compression_gain_db(gain_db[i]));
-    ProcessStreamChooser(kFloatFormat);
-    EXPECT_EQ(gain_db[i], apm_->gain_control()->compression_gain_db());
+  for (int compression_gain_db : {0, 10, 90}) {
+    config.gain_controller1.compression_gain_db = compression_gain_db;
+    apm_->ApplyConfig(config);
+    apm_->set_stream_analog_level(100);
+    EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(kFloatFormat));
   }
 
   // Testing limiter off/on
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->enable_limiter(false));
-  EXPECT_FALSE(apm_->gain_control()->is_limiter_enabled());
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->enable_limiter(true));
-  EXPECT_TRUE(apm_->gain_control()->is_limiter_enabled());
+  for (bool enable : {false, true}) {
+    config.gain_controller1.enable_limiter = enable;
+    apm_->ApplyConfig(config);
+    apm_->set_stream_analog_level(100);
+    EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(kFloatFormat));
+  }
 
   // Testing level limits
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_analog_level_limits(
-                                apm_->gain_control()->analog_level_minimum(),
-                                apm_->gain_control()->analog_level_maximum()));
-
-  int min_level[] = {0, 255, 1024};
-  for (size_t i = 0; i < arraysize(min_level); i++) {
-    EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_analog_level_limits(
-                                  min_level[i], 1024));
-    EXPECT_EQ(min_level[i], apm_->gain_control()->analog_level_minimum());
+  std::array<int, 4> kMinLevels = {0, 0, 255, 65000};
+  std::array<int, 4> kMaxLevels = {255, 1024, 65535, 65535};
+  for (size_t i = 0; i < kMinLevels.size(); ++i) {
+    int min_level = kMinLevels[i];
+    int max_level = kMaxLevels[i];
+    config.gain_controller1.analog_level_minimum = min_level;
+    config.gain_controller1.analog_level_maximum = max_level;
+    apm_->ApplyConfig(config);
+    apm_->set_stream_analog_level((min_level + max_level) / 2);
+    EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(kFloatFormat));
   }
-
-  int max_level[] = {0, 1024, 65535};
-  for (size_t i = 0; i < arraysize(min_level); i++) {
-    EXPECT_EQ(apm_->kNoError,
-              apm_->gain_control()->set_analog_level_limits(0, max_level[i]));
-    EXPECT_EQ(max_level[i], apm_->gain_control()->analog_level_maximum());
-  }
-
-  // TODO(ajm): stream_is_saturated() and stream_analog_level()
-
-  // Turn AGC off
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
-  EXPECT_FALSE(apm_->gain_control()->is_enabled());
 }
 
 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
 TEST_F(ApmTest, GainControlDiesOnTooLowTargetLevelDbfs) {
-  EXPECT_DEATH(apm_->gain_control()->set_target_level_dbfs(-1), "");
+  auto config = apm_->GetConfig();
+  config.gain_controller1.target_level_dbfs = -1;
+  EXPECT_DEATH(apm_->ApplyConfig(config), "");
 }
 
 TEST_F(ApmTest, GainControlDiesOnTooHighTargetLevelDbfs) {
-  EXPECT_DEATH(apm_->gain_control()->set_target_level_dbfs(32), "");
+  auto config = apm_->GetConfig();
+  config.gain_controller1.target_level_dbfs = 32;
+  EXPECT_DEATH(apm_->ApplyConfig(config), "");
 }
 
 TEST_F(ApmTest, GainControlDiesOnTooLowCompressionGainDb) {
-  EXPECT_DEATH(apm_->gain_control()->set_compression_gain_db(-1), "");
+  auto config = apm_->GetConfig();
+  config.gain_controller1.compression_gain_db = -1;
+  EXPECT_DEATH(apm_->ApplyConfig(config), "");
 }
 
 TEST_F(ApmTest, GainControlDiesOnTooHighCompressionGainDb) {
-  EXPECT_DEATH(apm_->gain_control()->set_compression_gain_db(91), "");
+  auto config = apm_->GetConfig();
+  config.gain_controller1.compression_gain_db = 91;
+  EXPECT_DEATH(apm_->ApplyConfig(config), "");
 }
 
 TEST_F(ApmTest, GainControlDiesOnTooLowAnalogLevelLowerLimit) {
-  EXPECT_DEATH(apm_->gain_control()->set_analog_level_limits(-1, 512), "");
+  auto config = apm_->GetConfig();
+  config.gain_controller1.analog_level_minimum = -1;
+  EXPECT_DEATH(apm_->ApplyConfig(config), "");
 }
 
 TEST_F(ApmTest, GainControlDiesOnTooHighAnalogLevelUpperLimit) {
-  EXPECT_DEATH(apm_->gain_control()->set_analog_level_limits(512, 65536), "");
+  auto config = apm_->GetConfig();
+  config.gain_controller1.analog_level_maximum = 65536;
+  EXPECT_DEATH(apm_->ApplyConfig(config), "");
 }
 
 TEST_F(ApmTest, GainControlDiesOnInvertedAnalogLevelLimits) {
-  EXPECT_DEATH(apm_->gain_control()->set_analog_level_limits(512, 255), "");
+  auto config = apm_->GetConfig();
+  config.gain_controller1.analog_level_minimum = 512;
+  config.gain_controller1.analog_level_maximum = 255;
+  EXPECT_DEATH(apm_->ApplyConfig(config), "");
 }
 
 TEST_F(ApmTest, ApmDiesOnTooLowAnalogLevel) {
-  apm_->gain_control()->set_analog_level_limits(255, 512);
+  auto config = apm_->GetConfig();
+  config.gain_controller1.analog_level_minimum = 255;
+  config.gain_controller1.analog_level_maximum = 512;
+  apm_->ApplyConfig(config);
   EXPECT_DEATH(apm_->set_stream_analog_level(254), "");
 }
 
 TEST_F(ApmTest, ApmDiesOnTooHighAnalogLevel) {
-  apm_->gain_control()->set_analog_level_limits(255, 512);
+  auto config = apm_->GetConfig();
+  config.gain_controller1.analog_level_minimum = 255;
+  config.gain_controller1.analog_level_maximum = 512;
+  apm_->ApplyConfig(config);
   EXPECT_DEATH(apm_->set_stream_analog_level(513), "");
 }
 #endif
 
 void ApmTest::RunQuantizedVolumeDoesNotGetStuckTest(int sample_rate) {
   Init(sample_rate, sample_rate, sample_rate, 2, 2, 2, false);
-  EXPECT_EQ(apm_->kNoError,
-            apm_->gain_control()->set_mode(GainControl::kAdaptiveAnalog));
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
+  auto config = apm_->GetConfig();
+  config.gain_controller1.enabled = true;
+  config.gain_controller1.mode =
+      AudioProcessing::Config::GainController1::kAdaptiveAnalog;
+  apm_->ApplyConfig(config);
 
   int out_analog_level = 0;
   for (int i = 0; i < 2000; ++i) {
@@ -958,10 +974,9 @@
     ScaleFrame(frame_, 0.25);
 
     // Always pass in the same volume.
-    EXPECT_EQ(apm_->kNoError,
-              apm_->gain_control()->set_stream_analog_level(100));
+    apm_->set_stream_analog_level(100);
     EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-    out_analog_level = apm_->gain_control()->stream_analog_level();
+    out_analog_level = apm_->recommended_stream_analog_level();
   }
 
   // Ensure the AGC is still able to reach the maximum.
@@ -978,9 +993,11 @@
 
 void ApmTest::RunManualVolumeChangeIsPossibleTest(int sample_rate) {
   Init(sample_rate, sample_rate, sample_rate, 2, 2, 2, false);
-  EXPECT_EQ(apm_->kNoError,
-            apm_->gain_control()->set_mode(GainControl::kAdaptiveAnalog));
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
+  auto config = apm_->GetConfig();
+  config.gain_controller1.enabled = true;
+  config.gain_controller1.mode =
+      AudioProcessing::Config::GainController1::kAdaptiveAnalog;
+  apm_->ApplyConfig(config);
 
   int out_analog_level = 100;
   for (int i = 0; i < 1000; ++i) {
@@ -988,10 +1005,9 @@
     // Ensure the audio is at a low level, so the AGC will try to increase it.
     ScaleFrame(frame_, 0.25);
 
-    EXPECT_EQ(apm_->kNoError,
-              apm_->gain_control()->set_stream_analog_level(out_analog_level));
+    apm_->set_stream_analog_level(out_analog_level);
     EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-    out_analog_level = apm_->gain_control()->stream_analog_level();
+    out_analog_level = apm_->recommended_stream_analog_level();
   }
 
   // Ensure the volume was raised.
@@ -1004,10 +1020,9 @@
     ReadFrameWithRewind(near_file_, frame_);
     ScaleFrame(frame_, 0.25);
 
-    EXPECT_EQ(apm_->kNoError,
-              apm_->gain_control()->set_stream_analog_level(out_analog_level));
+    apm_->set_stream_analog_level(out_analog_level);
     EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-    out_analog_level = apm_->gain_control()->stream_analog_level();
+    out_analog_level = apm_->recommended_stream_analog_level();
     // Check that AGC respected the manually adjusted volume.
     EXPECT_LT(out_analog_level, highest_level_reached);
   }
@@ -1051,9 +1066,9 @@
   AudioProcessing::Config config = apm_->GetConfig();
   EXPECT_FALSE(config.echo_canceller.enabled);
   EXPECT_FALSE(config.high_pass_filter.enabled);
+  EXPECT_FALSE(config.gain_controller1.enabled);
   EXPECT_FALSE(config.level_estimation.enabled);
   EXPECT_FALSE(config.voice_detection.enabled);
-  EXPECT_FALSE(apm_->gain_control()->is_enabled());
   EXPECT_FALSE(apm_->noise_suppression()->is_enabled());
 }
 
@@ -1125,10 +1140,9 @@
       frame_->vad_activity_ = AudioFrame::kVadUnknown;
 
       ASSERT_EQ(kNoErr, apm_->set_stream_delay_ms(0));
-      ASSERT_EQ(kNoErr,
-                apm_->gain_control()->set_stream_analog_level(analog_level));
+      apm_->set_stream_analog_level(analog_level);
       ASSERT_EQ(kNoErr, apm_->ProcessStream(frame_));
-      analog_level = apm_->gain_control()->stream_analog_level();
+      analog_level = apm_->recommended_stream_analog_level();
 
       VerifyChannelsAreEqual(frame_->data(), frame_->samples_per_channel_);
     }
@@ -1258,7 +1272,7 @@
       // ProcessStream could have changed this for the output frame.
       frame_->num_channels_ = apm_->num_input_channels();
 
-      EXPECT_NOERR(apm_->gain_control()->set_stream_analog_level(msg.level()));
+      apm_->set_stream_analog_level(msg.level());
       EXPECT_NOERR(apm_->set_stream_delay_ms(msg.delay()));
       if (msg.has_keypress()) {
         apm_->set_stream_key_pressed(msg.keypress());
@@ -1485,7 +1499,6 @@
 
     int frame_count = 0;
     int has_voice_count = 0;
-    int is_saturated_count = 0;
     int analog_level = 127;
     int analog_level_average = 0;
     int max_output_average = 0;
@@ -1501,8 +1514,7 @@
       frame_->vad_activity_ = AudioFrame::kVadUnknown;
 
       EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
-      EXPECT_EQ(apm_->kNoError,
-                apm_->gain_control()->set_stream_analog_level(analog_level));
+      apm_->set_stream_analog_level(analog_level);
 
       EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
 
@@ -1512,11 +1524,8 @@
 
       max_output_average += MaxAudioFrame(*frame_);
 
-      analog_level = apm_->gain_control()->stream_analog_level();
+      analog_level = apm_->recommended_stream_analog_level();
       analog_level_average += analog_level;
-      if (apm_->gain_control()->stream_is_saturated()) {
-        is_saturated_count++;
-      }
       AudioProcessingStats stats =
           apm_->GetStatistics(/*has_remote_tracks=*/false);
       EXPECT_TRUE(stats.voice_detected);
@@ -1602,7 +1611,6 @@
 #endif
       EXPECT_NEAR(test->has_voice_count(),
                   has_voice_count - kHasVoiceCountOffset, kHasVoiceCountNear);
-      EXPECT_NEAR(test->is_saturated_count(), is_saturated_count, kIntNear);
 
       EXPECT_NEAR(test->analog_level_average(), analog_level_average, kIntNear);
       EXPECT_NEAR(test->max_output_average(),
@@ -1616,7 +1624,6 @@
 #endif
     } else {
       test->set_has_voice_count(has_voice_count);
-      test->set_is_saturated_count(is_saturated_count);
 
       test->set_analog_level_average(analog_level_average);
       test->set_max_output_average(max_output_average);
@@ -1828,7 +1835,7 @@
           processing_config.reverse_output_stream(), rev_out_cb.channels()));
 
       EXPECT_NOERR(ap->set_stream_delay_ms(0));
-      EXPECT_NOERR(ap->gain_control()->set_stream_analog_level(analog_level));
+      ap->set_stream_analog_level(analog_level);
 
       EXPECT_NOERR(ap->ProcessStream(
           fwd_cb.channels(), fwd_cb.num_frames(), input_rate,
@@ -1852,7 +1859,7 @@
       ASSERT_EQ(rev_out_length, fwrite(float_data.get(), sizeof(float_data[0]),
                                        rev_out_length, rev_out_file));
 
-      analog_level = ap->gain_control()->stream_analog_level();
+      analog_level = ap->recommended_stream_analog_level();
     }
     fclose(far_file);
     fclose(near_file);
@@ -2421,11 +2428,11 @@
   AudioProcessing::Config apm_config;
   apm_config.residual_echo_detector.enabled = true;
   apm_config.high_pass_filter.enabled = false;
+  apm_config.gain_controller1.enabled = false;
   apm_config.gain_controller2.enabled = false;
   apm_config.echo_canceller.enabled = true;
   apm_config.echo_canceller.mobile_mode = mobile_aec;
   apm->ApplyConfig(apm_config);
-  EXPECT_EQ(apm->gain_control()->Enable(false), 0);
   EXPECT_EQ(apm->noise_suppression()->Enable(false), 0);
   return apm;
 }
diff --git a/modules/audio_processing/gain_control_config_proxy.cc b/modules/audio_processing/gain_control_config_proxy.cc
deleted file mode 100644
index 28e2117..0000000
--- a/modules/audio_processing/gain_control_config_proxy.cc
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "modules/audio_processing/gain_control_config_proxy.h"
-
-namespace webrtc {
-namespace {
-
-AudioProcessing::Config::GainController1::Mode InterfaceModeToConfigMode(
-    GainControl::Mode agc_mode) {
-  using AgcConfig = AudioProcessing::Config::GainController1;
-  switch (agc_mode) {
-    case GainControl::kAdaptiveAnalog:
-      return AgcConfig::kAdaptiveAnalog;
-    case GainControl::kAdaptiveDigital:
-      return AgcConfig::kAdaptiveDigital;
-    case GainControl::kFixedDigital:
-      return AgcConfig::kFixedDigital;
-  }
-}
-}  // namespace
-
-GainControlConfigProxy::GainControlConfigProxy(
-    rtc::CriticalSection* crit_capture,
-    AudioProcessing* apm,
-    GainControl* agc)
-    : crit_capture_(crit_capture), apm_(apm), agc_(agc) {
-  RTC_DCHECK(apm);
-  RTC_DCHECK(agc);
-  RTC_DCHECK(crit_capture);
-}
-
-GainControlConfigProxy::~GainControlConfigProxy() = default;
-
-int GainControlConfigProxy::set_stream_analog_level(int level) {
-  apm_->set_stream_analog_level(level);
-  return AudioProcessing::kNoError;
-}
-
-int GainControlConfigProxy::stream_analog_level() const {
-  return apm_->recommended_stream_analog_level();
-}
-
-int GainControlConfigProxy::Enable(bool enable) {
-  auto apm_config = apm_->GetConfig();
-  apm_config.gain_controller1.enabled = enable;
-  apm_->ApplyConfig(apm_config);
-  return AudioProcessing::kNoError;
-}
-
-int GainControlConfigProxy::set_mode(Mode mode) {
-  auto config = apm_->GetConfig();
-  config.gain_controller1.mode = InterfaceModeToConfigMode(mode);
-  apm_->ApplyConfig(config);
-  return AudioProcessing::kNoError;
-}
-
-int GainControlConfigProxy::set_target_level_dbfs(int level) {
-  auto config = apm_->GetConfig();
-  config.gain_controller1.target_level_dbfs = level;
-  apm_->ApplyConfig(config);
-  return AudioProcessing::kNoError;
-}
-
-int GainControlConfigProxy::set_compression_gain_db(int gain) {
-  apm_->SetRuntimeSetting(
-      AudioProcessing::RuntimeSetting::CreateCompressionGainDb(gain));
-  return AudioProcessing::kNoError;
-}
-
-int GainControlConfigProxy::enable_limiter(bool enable) {
-  auto config = apm_->GetConfig();
-  config.gain_controller1.enable_limiter = enable;
-  apm_->ApplyConfig(config);
-  return AudioProcessing::kNoError;
-}
-
-int GainControlConfigProxy::set_analog_level_limits(int minimum, int maximum) {
-  auto config = apm_->GetConfig();
-  config.gain_controller1.analog_level_minimum = minimum;
-  config.gain_controller1.analog_level_maximum = maximum;
-  apm_->ApplyConfig(config);
-  return AudioProcessing::kNoError;
-}
-
-bool GainControlConfigProxy::is_limiter_enabled() const {
-  rtc::CritScope cs_capture(crit_capture_);
-  return agc_->is_limiter_enabled();
-}
-
-int GainControlConfigProxy::compression_gain_db() const {
-  rtc::CritScope cs_capture(crit_capture_);
-  return agc_->compression_gain_db();
-}
-
-bool GainControlConfigProxy::is_enabled() const {
-  rtc::CritScope cs_capture(crit_capture_);
-  return agc_->is_enabled();
-}
-
-GainControl::Mode GainControlConfigProxy::mode() const {
-  rtc::CritScope cs_capture(crit_capture_);
-  return agc_->mode();
-}
-
-int GainControlConfigProxy::target_level_dbfs() const {
-  rtc::CritScope cs_capture(crit_capture_);
-  return agc_->target_level_dbfs();
-}
-
-int GainControlConfigProxy::analog_level_minimum() const {
-  rtc::CritScope cs_capture(crit_capture_);
-  return agc_->analog_level_minimum();
-}
-
-int GainControlConfigProxy::analog_level_maximum() const {
-  rtc::CritScope cs_capture(crit_capture_);
-  return agc_->analog_level_maximum();
-}
-
-bool GainControlConfigProxy::stream_is_saturated() const {
-  rtc::CritScope cs_capture(crit_capture_);
-  return agc_->stream_is_saturated();
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/gain_control_config_proxy.h b/modules/audio_processing/gain_control_config_proxy.h
deleted file mode 100644
index 04ed536..0000000
--- a/modules/audio_processing/gain_control_config_proxy.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef MODULES_AUDIO_PROCESSING_GAIN_CONTROL_CONFIG_PROXY_H_
-#define MODULES_AUDIO_PROCESSING_GAIN_CONTROL_CONFIG_PROXY_H_
-
-#include "modules/audio_processing/include/audio_processing.h"
-#include "modules/audio_processing/include/gain_control.h"
-#include "rtc_base/critical_section.h"
-#include "rtc_base/thread_annotations.h"
-
-namespace webrtc {
-
-// This class forwards all gain control configuration to the audio processing
-// module, for compatibility with AudioProcessing::Config.
-class GainControlConfigProxy : public GainControl {
- public:
-  GainControlConfigProxy(rtc::CriticalSection* crit_capture,
-                         AudioProcessing* apm,
-                         GainControl* agc);
-  GainControlConfigProxy(const GainControlConfigProxy&) = delete;
-  GainControlConfigProxy& operator=(const GainControlConfigProxy&) = delete;
-
-  ~GainControlConfigProxy() override;
-
- private:
-  // GainControl API during processing.
-  int set_stream_analog_level(int level) override;
-  int stream_analog_level() const override;
-
-  // GainControl config setters.
-  int Enable(bool enable) override;
-  int set_mode(Mode mode) override;
-  int set_target_level_dbfs(int level) override;
-  int set_compression_gain_db(int gain) override;
-  int enable_limiter(bool enable) override;
-  int set_analog_level_limits(int minimum, int maximum) override;
-
-  // GainControl config getters.
-  bool is_enabled() const override;
-  bool is_limiter_enabled() const override;
-  int compression_gain_db() const override;
-  int target_level_dbfs() const override;
-  int analog_level_minimum() const override;
-  int analog_level_maximum() const override;
-  bool stream_is_saturated() const override;
-  Mode mode() const override;
-
-  rtc::CriticalSection* crit_capture_ = nullptr;
-  AudioProcessing* apm_ = nullptr;
-  GainControl* agc_ RTC_GUARDED_BY(crit_capture_) = nullptr;
-};
-
-}  // namespace webrtc
-#endif  // MODULES_AUDIO_PROCESSING_GAIN_CONTROL_CONFIG_PROXY_H_
diff --git a/modules/audio_processing/gain_control_config_proxy_unittest.cc b/modules/audio_processing/gain_control_config_proxy_unittest.cc
deleted file mode 100644
index 5bd341f..0000000
--- a/modules/audio_processing/gain_control_config_proxy_unittest.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "modules/audio_processing/gain_control_config_proxy.h"
-
-#include "modules/audio_processing/include/audio_processing.h"
-#include "modules/audio_processing/include/mock_audio_processing.h"
-#include "rtc_base/critical_section.h"
-#include "rtc_base/ref_counted_object.h"
-#include "test/gtest.h"
-
-namespace webrtc {
-class GainControlConfigProxyTest : public ::testing::Test {
- protected:
-  GainControlConfigProxyTest()
-      : apm_(new rtc::RefCountedObject<
-             ::testing::StrictMock<test::MockAudioProcessing>>()),
-        agc_(),
-        proxy_(&lock_, apm_, &agc_) {
-    EXPECT_CALL(*apm_, GetConfig())
-        .WillRepeatedly(::testing::ReturnPointee(&apm_config_));
-    EXPECT_CALL(*apm_, ApplyConfig(::testing::_))
-        .WillRepeatedly(::testing::SaveArg<0>(&apm_config_));
-  }
-
-  GainControl* proxy() { return &proxy_; }
-
-  rtc::scoped_refptr<testing::StrictMock<test::MockAudioProcessing>> apm_;
-  ::testing::StrictMock<test::MockGainControl> agc_;
-  AudioProcessing::Config apm_config_;
-
- private:
-  rtc::CriticalSection lock_;
-  GainControlConfigProxy proxy_;
-};
-
-// GainControl API during processing.
-TEST_F(GainControlConfigProxyTest, SetStreamAnalogLevel) {
-  EXPECT_CALL(*apm_, set_stream_analog_level(100));
-  proxy()->set_stream_analog_level(100);
-}
-
-TEST_F(GainControlConfigProxyTest, StreamAnalogLevel) {
-  EXPECT_CALL(*apm_, recommended_stream_analog_level())
-      .WillOnce(::testing::Return(100));
-  EXPECT_EQ(100, proxy()->stream_analog_level());
-}
-
-// GainControl config setters.
-TEST_F(GainControlConfigProxyTest, SetEnable) {
-  proxy()->Enable(true);
-  EXPECT_TRUE(apm_config_.gain_controller1.enabled);
-
-  proxy()->Enable(false);
-  EXPECT_FALSE(apm_config_.gain_controller1.enabled);
-}
-
-TEST_F(GainControlConfigProxyTest, SetMode) {
-  proxy()->set_mode(GainControl::Mode::kAdaptiveAnalog);
-  EXPECT_EQ(apm_config_.gain_controller1.kAdaptiveAnalog,
-            apm_config_.gain_controller1.mode);
-
-  proxy()->set_mode(GainControl::Mode::kAdaptiveDigital);
-  EXPECT_EQ(apm_config_.gain_controller1.kAdaptiveDigital,
-            apm_config_.gain_controller1.mode);
-
-  proxy()->set_mode(GainControl::Mode::kFixedDigital);
-  EXPECT_EQ(apm_config_.gain_controller1.kFixedDigital,
-            apm_config_.gain_controller1.mode);
-}
-
-TEST_F(GainControlConfigProxyTest, SetTargetLevelDbfs) {
-  proxy()->set_target_level_dbfs(17);
-  EXPECT_EQ(17, apm_config_.gain_controller1.target_level_dbfs);
-}
-
-TEST_F(GainControlConfigProxyTest, SetCompressionGainDb) {
-  AudioProcessing::RuntimeSetting setting;
-  EXPECT_CALL(*apm_, SetRuntimeSetting(::testing::_))
-      .WillOnce(::testing::SaveArg<0>(&setting));
-  proxy()->set_compression_gain_db(17);
-  EXPECT_EQ(AudioProcessing::RuntimeSetting::Type::kCaptureCompressionGain,
-            setting.type());
-  float value;
-  setting.GetFloat(&value);
-  EXPECT_EQ(17, static_cast<int>(value + .5f));
-}
-
-TEST_F(GainControlConfigProxyTest, SetEnableLimiter) {
-  proxy()->enable_limiter(true);
-  EXPECT_TRUE(apm_config_.gain_controller1.enable_limiter);
-  proxy()->enable_limiter(false);
-  EXPECT_FALSE(apm_config_.gain_controller1.enable_limiter);
-}
-
-TEST_F(GainControlConfigProxyTest, SetAnalogLevelLimits) {
-  proxy()->set_analog_level_limits(100, 300);
-  EXPECT_EQ(100, apm_config_.gain_controller1.analog_level_minimum);
-  EXPECT_EQ(300, apm_config_.gain_controller1.analog_level_maximum);
-}
-
-TEST_F(GainControlConfigProxyTest, GetEnabled) {
-  EXPECT_CALL(agc_, is_enabled())
-      .WillOnce(::testing::Return(true))
-      .WillOnce(::testing::Return(false));
-  EXPECT_TRUE(proxy()->is_enabled());
-  EXPECT_FALSE(proxy()->is_enabled());
-}
-
-TEST_F(GainControlConfigProxyTest, GetLimiterEnabled) {
-  EXPECT_CALL(agc_, is_enabled())
-      .WillOnce(::testing::Return(true))
-      .WillOnce(::testing::Return(false));
-  EXPECT_TRUE(proxy()->is_enabled());
-  EXPECT_FALSE(proxy()->is_enabled());
-}
-
-TEST_F(GainControlConfigProxyTest, GetCompressionGainDb) {
-  EXPECT_CALL(agc_, compression_gain_db()).WillOnce(::testing::Return(17));
-  EXPECT_EQ(17, proxy()->compression_gain_db());
-}
-
-TEST_F(GainControlConfigProxyTest, GetTargetLevelDbfs) {
-  EXPECT_CALL(agc_, target_level_dbfs()).WillOnce(::testing::Return(17));
-  EXPECT_EQ(17, proxy()->target_level_dbfs());
-}
-
-TEST_F(GainControlConfigProxyTest, GetAnalogLevelMinimum) {
-  EXPECT_CALL(agc_, analog_level_minimum()).WillOnce(::testing::Return(17));
-  EXPECT_EQ(17, proxy()->analog_level_minimum());
-}
-
-TEST_F(GainControlConfigProxyTest, GetAnalogLevelMaximum) {
-  EXPECT_CALL(agc_, analog_level_maximum()).WillOnce(::testing::Return(17));
-  EXPECT_EQ(17, proxy()->analog_level_maximum());
-}
-
-TEST_F(GainControlConfigProxyTest, GetStreamIsSaturated) {
-  EXPECT_CALL(agc_, stream_is_saturated())
-      .WillOnce(::testing::Return(true))
-      .WillOnce(::testing::Return(false));
-  EXPECT_TRUE(proxy()->stream_is_saturated());
-  EXPECT_FALSE(proxy()->stream_is_saturated());
-}
-
-TEST_F(GainControlConfigProxyTest, GetMode) {
-  EXPECT_CALL(agc_, mode())
-      .WillOnce(::testing::Return(GainControl::Mode::kAdaptiveAnalog))
-      .WillOnce(::testing::Return(GainControl::Mode::kAdaptiveDigital))
-      .WillOnce(::testing::Return(GainControl::Mode::kFixedDigital));
-  EXPECT_EQ(GainControl::Mode::kAdaptiveAnalog, proxy()->mode());
-  EXPECT_EQ(GainControl::Mode::kAdaptiveDigital, proxy()->mode());
-  EXPECT_EQ(GainControl::Mode::kFixedDigital, proxy()->mode());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/gain_control_for_experimental_agc.h b/modules/audio_processing/gain_control_for_experimental_agc.h
index 59328cd..a8bc808 100644
--- a/modules/audio_processing/gain_control_for_experimental_agc.h
+++ b/modules/audio_processing/gain_control_for_experimental_agc.h
@@ -12,7 +12,7 @@
 #define MODULES_AUDIO_PROCESSING_GAIN_CONTROL_FOR_EXPERIMENTAL_AGC_H_
 
 #include "modules/audio_processing/agc/agc_manager_direct.h"
-#include "modules/audio_processing/include/audio_processing.h"
+#include "modules/audio_processing/agc/gain_control.h"
 #include "rtc_base/thread_checker.h"
 
 namespace webrtc {
diff --git a/modules/audio_processing/gain_control_impl.h b/modules/audio_processing/gain_control_impl.h
index 99b43b5..4ec1941 100644
--- a/modules/audio_processing/gain_control_impl.h
+++ b/modules/audio_processing/gain_control_impl.h
@@ -19,7 +19,7 @@
 
 #include "absl/types/optional.h"
 #include "api/array_view.h"
-#include "modules/audio_processing/include/gain_control.h"
+#include "modules/audio_processing/agc/gain_control.h"
 #include "rtc_base/constructor_magic.h"
 
 namespace webrtc {
diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h
index e46deea..79cbc28 100644
--- a/modules/audio_processing/include/audio_processing.h
+++ b/modules/audio_processing/include/audio_processing.h
@@ -30,7 +30,6 @@
 #include "modules/audio_processing/include/audio_generator.h"
 #include "modules/audio_processing/include/audio_processing_statistics.h"
 #include "modules/audio_processing/include/config.h"
-#include "modules/audio_processing/include/gain_control.h"
 #include "rtc_base/arraysize.h"
 #include "rtc_base/deprecation.h"
 #include "rtc_base/ref_count.h"
@@ -48,7 +47,6 @@
 class ProcessingConfig;
 
 class EchoDetector;
-class GainControl;
 class NoiseSuppression;
 class CustomAudioAnalyzer;
 class CustomProcessing;
@@ -190,19 +188,24 @@
 // AudioProcessing::Config config;
 // config.echo_canceller.enabled = true;
 // config.echo_canceller.mobile_mode = false;
-// config.high_pass_filter.enabled = true;
+//
+// config.gain_controller1.enabled = true;
+// config.gain_controller1.mode =
+// AudioProcessing::Config::GainController1::kAdaptiveAnalog;
+// config.gain_controller1.analog_level_minimum = 0;
+// config.gain_controller1.analog_level_maximum = 255;
+//
 // config.gain_controller2.enabled = true;
+//
+// config.high_pass_filter.enabled = true;
+//
+// config.voice_detection.enabled = true;
+//
 // apm->ApplyConfig(config)
 //
 // apm->noise_reduction()->set_level(kHighSuppression);
 // apm->noise_reduction()->Enable(true);
 //
-// apm->gain_control()->set_analog_level_limits(0, 255);
-// apm->gain_control()->set_mode(kAdaptiveAnalog);
-// apm->gain_control()->Enable(true);
-//
-// apm->voice_detection()->Enable(true);
-//
 // // Start a voice call...
 //
 // // ... Render frame arrives bound for the audio HAL ...
@@ -211,12 +214,12 @@
 // // ... Capture frame arrives from the audio HAL ...
 // // Call required set_stream_ functions.
 // apm->set_stream_delay_ms(delay_ms);
-// apm->gain_control()->set_stream_analog_level(analog_level);
+// apm->set_stream_analog_level(analog_level);
 //
 // apm->ProcessStream(capture_frame);
 //
 // // Call required stream_ functions.
-// analog_level = apm->gain_control()->stream_analog_level();
+// analog_level = apm->recommended_stream_analog_level();
 // has_voice = apm->stream_has_voice();
 //
 // // Repeate render and capture processing for the duration of the call...
@@ -683,7 +686,6 @@
   // These provide access to the component interfaces and should never return
   // NULL. The pointers will be valid for the lifetime of the APM instance.
   // The memory for these objects is entirely managed internally.
-  virtual GainControl* gain_control() const = 0;
   virtual NoiseSuppression* noise_suppression() const = 0;
 
   // Returns the last applied configuration.
diff --git a/modules/audio_processing/include/mock_audio_processing.h b/modules/audio_processing/include/mock_audio_processing.h
index a404dca..baf500f 100644
--- a/modules/audio_processing/include/mock_audio_processing.h
+++ b/modules/audio_processing/include/mock_audio_processing.h
@@ -22,27 +22,6 @@
 namespace webrtc {
 
 namespace test {
-class MockGainControl : public GainControl {
- public:
-  virtual ~MockGainControl() {}
-  MOCK_METHOD1(Enable, int(bool enable));
-  MOCK_CONST_METHOD0(is_enabled, bool());
-  MOCK_METHOD1(set_stream_analog_level, int(int level));
-  MOCK_CONST_METHOD0(stream_analog_level, int());
-  MOCK_METHOD1(set_mode, int(Mode mode));
-  MOCK_CONST_METHOD0(mode, Mode());
-  MOCK_METHOD1(set_target_level_dbfs, int(int level));
-  MOCK_CONST_METHOD0(target_level_dbfs, int());
-  MOCK_METHOD1(set_compression_gain_db, int(int gain));
-  MOCK_CONST_METHOD0(compression_gain_db, int());
-  MOCK_METHOD1(enable_limiter, int(bool enable));
-  MOCK_CONST_METHOD0(is_limiter_enabled, bool());
-  MOCK_METHOD2(set_analog_level_limits, int(int minimum, int maximum));
-  MOCK_CONST_METHOD0(analog_level_minimum, int());
-  MOCK_CONST_METHOD0(analog_level_maximum, int());
-  MOCK_CONST_METHOD0(stream_is_saturated, bool());
-};
-
 class MockNoiseSuppression : public NoiseSuppression {
  public:
   virtual ~MockNoiseSuppression() {}
@@ -87,8 +66,7 @@
 class MockAudioProcessing : public ::testing::NiceMock<AudioProcessing> {
  public:
   MockAudioProcessing()
-      : gain_control_(new ::testing::NiceMock<MockGainControl>()),
-        noise_suppression_(new ::testing::NiceMock<MockNoiseSuppression>()) {}
+      : noise_suppression_(new ::testing::NiceMock<MockNoiseSuppression>()) {}
 
   virtual ~MockAudioProcessing() {}
 
@@ -154,7 +132,6 @@
 
   MOCK_METHOD0(UpdateHistogramsOnCallEnd, void());
   MOCK_CONST_METHOD1(GetStatistics, AudioProcessingStats(bool));
-  virtual MockGainControl* gain_control() const { return gain_control_.get(); }
   virtual MockNoiseSuppression* noise_suppression() const {
     return noise_suppression_.get();
   }
@@ -162,7 +139,6 @@
   MOCK_CONST_METHOD0(GetConfig, AudioProcessing::Config());
 
  private:
-  std::unique_ptr<MockGainControl> gain_control_;
   std::unique_ptr<MockNoiseSuppression> noise_suppression_;
 };
 
diff --git a/modules/audio_processing/test/aec_dump_based_simulator.cc b/modules/audio_processing/test/aec_dump_based_simulator.cc
index ba39274..e56694e 100644
--- a/modules/audio_processing/test/aec_dump_based_simulator.cc
+++ b/modules/audio_processing/test/aec_dump_based_simulator.cc
@@ -376,8 +376,7 @@
 
     if (msg.has_agc_enabled() || settings_.use_agc) {
       bool enable = settings_.use_agc ? *settings_.use_agc : msg.agc_enabled();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->gain_control()->Enable(enable));
+      apm_config.gain_controller1.enabled = enable;
       if (settings_.use_verbose_logging) {
         std::cout << " agc_enabled: " << (enable ? "true" : "false")
                   << std::endl;
@@ -386,9 +385,9 @@
 
     if (msg.has_agc_mode() || settings_.agc_mode) {
       int mode = settings_.agc_mode ? *settings_.agc_mode : msg.agc_mode();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->gain_control()->set_mode(
-                       static_cast<webrtc::GainControl::Mode>(mode)));
+      apm_config.gain_controller1.mode =
+          static_cast<webrtc::AudioProcessing::Config::GainController1::Mode>(
+              mode);
       if (settings_.use_verbose_logging) {
         std::cout << " agc_mode: " << mode << std::endl;
       }
@@ -397,8 +396,7 @@
     if (msg.has_agc_limiter_enabled() || settings_.use_agc_limiter) {
       bool enable = settings_.use_agc_limiter ? *settings_.use_agc_limiter
                                               : msg.agc_limiter_enabled();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->gain_control()->enable_limiter(enable));
+      apm_config.gain_controller1.enable_limiter = enable;
       if (settings_.use_verbose_logging) {
         std::cout << " agc_limiter_enabled: " << (enable ? "true" : "false")
                   << std::endl;
diff --git a/modules/audio_processing/test/audio_processing_simulator.cc b/modules/audio_processing/test/audio_processing_simulator.cc
index 4a0e007..ccd3505 100644
--- a/modules/audio_processing/test/audio_processing_simulator.cc
+++ b/modules/audio_processing/test/audio_processing_simulator.cc
@@ -188,15 +188,12 @@
     }
 
     // Notify the current mic level to AGC.
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->gain_control()->set_stream_analog_level(
-                     fake_recording_device_.MicLevel()));
+    ap_->set_stream_analog_level(fake_recording_device_.MicLevel());
   } else {
     // Notify the current mic level to AGC.
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->gain_control()->set_stream_analog_level(
-                     settings_.aec_dump_input_filename ? aec_dump_mic_level_
-                                                       : analog_mic_level_));
+    ap_->set_stream_analog_level(settings_.aec_dump_input_filename
+                                     ? aec_dump_mic_level_
+                                     : analog_mic_level_);
   }
 
   // Process the current audio frame.
@@ -218,7 +215,7 @@
   // Store the mic level suggested by AGC.
   // Note that when the analog gain is simulated and an AEC dump is used as
   // input, |analog_mic_level_| will not be used with set_stream_analog_level().
-  analog_mic_level_ = ap_->gain_control()->stream_analog_level();
+  analog_mic_level_ = ap_->recommended_stream_analog_level();
   if (settings_.simulate_mic_gain) {
     fake_recording_device_.SetMicLevel(analog_mic_level_);
   }
@@ -463,6 +460,25 @@
     apm_config.voice_detection.enabled = *settings_.use_vad;
   }
 
+  if (settings_.use_agc) {
+    apm_config.gain_controller1.enabled = *settings_.use_agc;
+  }
+  if (settings_.agc_mode) {
+    apm_config.gain_controller1.mode =
+        static_cast<webrtc::AudioProcessing::Config::GainController1::Mode>(
+            *settings_.agc_mode);
+  }
+  if (settings_.use_agc_limiter) {
+    apm_config.gain_controller1.enable_limiter = *settings_.use_agc_limiter;
+  }
+  if (settings_.agc_target_level) {
+    apm_config.gain_controller1.target_level_dbfs = *settings_.agc_target_level;
+  }
+  if (settings_.agc_compression_gain) {
+    apm_config.gain_controller1.compression_gain_db =
+        *settings_.agc_compression_gain;
+  }
+
   if (settings_.use_refined_adaptive_filter) {
     config.Set<RefinedAdaptiveFilter>(
         new RefinedAdaptiveFilter(*settings_.use_refined_adaptive_filter));
@@ -498,34 +514,10 @@
 
   ap_->ApplyConfig(apm_config);
 
-  if (settings_.use_agc) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->gain_control()->Enable(*settings_.use_agc));
-  }
   if (settings_.use_ns) {
     RTC_CHECK_EQ(AudioProcessing::kNoError,
                  ap_->noise_suppression()->Enable(*settings_.use_ns));
   }
-  if (settings_.use_agc_limiter) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError, ap_->gain_control()->enable_limiter(
-                                                *settings_.use_agc_limiter));
-  }
-  if (settings_.agc_target_level) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->gain_control()->set_target_level_dbfs(
-                     *settings_.agc_target_level));
-  }
-  if (settings_.agc_compression_gain) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->gain_control()->set_compression_gain_db(
-                     *settings_.agc_compression_gain));
-  }
-  if (settings_.agc_mode) {
-    RTC_CHECK_EQ(
-        AudioProcessing::kNoError,
-        ap_->gain_control()->set_mode(
-            static_cast<webrtc::GainControl::Mode>(*settings_.agc_mode)));
-  }
   if (settings_.ns_level) {
     RTC_CHECK_EQ(
         AudioProcessing::kNoError,
diff --git a/modules/audio_processing/test/audio_processing_simulator.h b/modules/audio_processing/test/audio_processing_simulator.h
index c7087be..340c9d3 100644
--- a/modules/audio_processing/test/audio_processing_simulator.h
+++ b/modules/audio_processing/test/audio_processing_simulator.h
@@ -57,7 +57,6 @@
   absl::optional<bool> use_hpf;
   absl::optional<bool> use_ns;
   absl::optional<bool> use_ts;
-  absl::optional<bool> use_ie;
   absl::optional<bool> use_vad;
   absl::optional<bool> use_le;
   absl::optional<bool> use_all;
diff --git a/modules/audio_processing/test/audioproc_float_impl.cc b/modules/audio_processing/test/audioproc_float_impl.cc
index 2b24823..6428e9d 100644
--- a/modules/audio_processing/test/audioproc_float_impl.cc
+++ b/modules/audio_processing/test/audioproc_float_impl.cc
@@ -338,7 +338,6 @@
   if (absl::GetFlag(FLAGS_all_default)) {
     settings.use_le = true;
     settings.use_vad = true;
-    settings.use_ie = false;
     settings.use_ts = true;
     settings.use_ns = true;
     settings.use_hpf = true;
diff --git a/modules/audio_processing/test/debug_dump_replayer.cc b/modules/audio_processing/test/debug_dump_replayer.cc
index 9c1257a..45600f0 100644
--- a/modules/audio_processing/test/debug_dump_replayer.cc
+++ b/modules/audio_processing/test/debug_dump_replayer.cc
@@ -119,8 +119,7 @@
   // APM should have been created.
   RTC_CHECK(apm_.get());
 
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->gain_control()->set_stream_analog_level(msg.level()));
+  apm_->set_stream_analog_level(msg.level());
   RTC_CHECK_EQ(AudioProcessing::kNoError,
                apm_->set_stream_delay_ms(msg.delay()));
 
@@ -237,21 +236,17 @@
       static_cast<AudioProcessing::Config::NoiseSuppression::Level>(
           msg.ns_level());
 
-  apm_->ApplyConfig(apm_config);
-
   // AGC configs.
   RTC_CHECK(msg.has_agc_enabled());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->gain_control()->Enable(msg.agc_enabled()));
-
   RTC_CHECK(msg.has_agc_mode());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->gain_control()->set_mode(
-                   static_cast<GainControl::Mode>(msg.agc_mode())));
-
   RTC_CHECK(msg.has_agc_limiter_enabled());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->gain_control()->enable_limiter(msg.agc_limiter_enabled()));
+  apm_config.gain_controller1.enabled = msg.agc_enabled();
+  apm_config.gain_controller1.mode =
+      static_cast<AudioProcessing::Config::GainController1::Mode>(
+          msg.agc_mode());
+  apm_config.gain_controller1.enable_limiter = msg.agc_limiter_enabled();
+
+  apm_->ApplyConfig(apm_config);
 }
 
 void DebugDumpReplayer::LoadNextMessage() {
diff --git a/modules/audio_processing/test/debug_dump_test.cc b/modules/audio_processing/test/debug_dump_test.cc
index ff08e5d..b769a66 100644
--- a/modules/audio_processing/test/debug_dump_test.cc
+++ b/modules/audio_processing/test/debug_dump_test.cc
@@ -529,8 +529,9 @@
   generator.StartRecording();
   generator.Process(100);
 
-  GainControl* agc = generator.apm()->gain_control();
-  EXPECT_EQ(AudioProcessing::kNoError, agc->Enable(!agc->is_enabled()));
+  AudioProcessing::Config apm_config = generator.apm()->GetConfig();
+  apm_config.gain_controller1.enabled = !apm_config.gain_controller1.enabled;
+  generator.apm()->ApplyConfig(apm_config);
 
   generator.Process(100);
   generator.StopRecording();