Make AEC3 the default desktop AEC option in WebRTC

Bug: webrtc:10366
Change-Id: I854ed62df1da489fdab43e9157dff79b7287cacb
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/125081
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Per Åhgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26983}
diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn
index 0febbfb..39d492b 100644
--- a/modules/audio_processing/BUILD.gn
+++ b/modules/audio_processing/BUILD.gn
@@ -57,15 +57,33 @@
     "../../rtc_base:macromagic",
     "../../rtc_base:rtc_base_approved",
     "../../rtc_base/system:rtc_export",
+    "//third_party/abseil-cpp/absl/memory:memory",
     "//third_party/abseil-cpp/absl/types:optional",
   ]
 }
 
 rtc_static_library("audio_buffer") {
   visibility = [ "*" ]
+
+  configs += [ ":apm_debug_dump" ]
+
   sources = [
-    "audio_buffer_placeholder.cc",
-    "audio_buffer_placeholder.h",
+    "audio_buffer.cc",
+    "audio_buffer.h",
+    "splitting_filter.cc",
+    "splitting_filter.h",
+    "three_band_filter_bank.cc",
+    "three_band_filter_bank.h",
+  ]
+
+  defines = []
+
+  deps = [
+    ":api",
+    "../../api/audio:audio_frame_api",
+    "../../common_audio:common_audio",
+    "../../common_audio:common_audio_c",
+    "../../rtc_base:checks",
   ]
 }
 
@@ -73,8 +91,6 @@
   visibility = [ "*" ]
   configs += [ ":apm_debug_dump" ]
   sources = [
-    "audio_buffer.cc",
-    "audio_buffer.h",
     "audio_processing_impl.cc",
     "audio_processing_impl.h",
     "common.h",
@@ -109,10 +125,6 @@
     "residual_echo_detector.h",
     "rms_level.cc",
     "rms_level.h",
-    "splitting_filter.cc",
-    "splitting_filter.h",
-    "three_band_filter_bank.cc",
-    "three_band_filter_bank.h",
     "transient/common.h",
     "transient/daubechies_8_wavelet_coeffs.h",
     "transient/dyadic_decimator.h",
@@ -164,6 +176,7 @@
     "../../system_wrappers:metrics",
     "aec:aec",
     "aec:aec_core",
+    "aec3:aec3",
     "aecm:aecm_core",
     "agc",
     "agc:agc_legacy_c",
@@ -171,6 +184,7 @@
     "agc2:fixed_digital",
     "agc2:gain_applier",
     "vad",
+    "//third_party/abseil-cpp/absl/memory:memory",
     "//third_party/abseil-cpp/absl/types:optional",
   ]
 
diff --git a/modules/audio_processing/aec3/BUILD.gn b/modules/audio_processing/aec3/BUILD.gn
index e8bbe69..259403c 100644
--- a/modules/audio_processing/aec3/BUILD.gn
+++ b/modules/audio_processing/aec3/BUILD.gn
@@ -133,7 +133,7 @@
 
   deps = [
     "..:apm_logging",
-    "..:audio_processing",
+    "..:audio_buffer",
     "../../../api:array_view",
     "../../../api/audio:aec3_config",
     "../../../api/audio:echo_control",
@@ -169,6 +169,7 @@
     deps = [
       ":aec3",
       "..:apm_logging",
+      "..:audio_buffer",
       "..:audio_processing",
       "..:audio_processing_unittests",
       "../../../api:array_view",
diff --git a/modules/audio_processing/audio_buffer.h b/modules/audio_processing/audio_buffer.h
index 469646e..a85144b 100644
--- a/modules/audio_processing/audio_buffer.h
+++ b/modules/audio_processing/audio_buffer.h
@@ -19,7 +19,6 @@
 #include "api/audio/audio_frame.h"
 #include "common_audio/channel_buffer.h"
 #include "modules/audio_processing/include/audio_processing.h"
-#include "rtc_base/gtest_prod_util.h"
 
 namespace webrtc {
 
diff --git a/modules/audio_processing/audio_buffer_placeholder.cc b/modules/audio_processing/audio_buffer_placeholder.cc
deleted file mode 100644
index aa872c3..0000000
--- a/modules/audio_processing/audio_buffer_placeholder.cc
+++ /dev/null
@@ -1,16 +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/audio_buffer_placeholder.h"
-
-// TODO(peah): Remove this file once the audio buffer has been moved to the
-// audio_buffer build target. The purpose of this file is to ensure that the
-// audio_buffer build target is not empty as that causes the compiler to
-// complain.
diff --git a/modules/audio_processing/audio_buffer_placeholder.h b/modules/audio_processing/audio_buffer_placeholder.h
deleted file mode 100644
index 6c553f4..0000000
--- a/modules/audio_processing/audio_buffer_placeholder.h
+++ /dev/null
@@ -1,25 +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_AUDIO_BUFFER_PLACEHOLDER_H_
-#define MODULES_AUDIO_PROCESSING_AUDIO_BUFFER_PLACEHOLDER_H_
-
-// TODO(peah): Remove this file once the audio buffer has been moved to the
-// audio_buffer build target. The purpose of this file is to ensure that the
-// audio_buffer build target is not empty as that causes the compiler to
-// complain.
-struct AudioBufferPlaceholder {
- public:
-  int dummy;
-
- private:
-};
-
-#endif  // MODULES_AUDIO_PROCESSING_AUDIO_BUFFER_PLACEHOLDER_H_
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index 3400abf..504eb31 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -16,10 +16,12 @@
 #include <type_traits>
 #include <utility>
 
+#include "absl/memory/memory.h"
 #include "absl/types/optional.h"
 #include "api/array_view.h"
 #include "common_audio/audio_converter.h"
 #include "common_audio/include/audio_util.h"
+#include "modules/audio_processing/aec3/echo_canceller3.h"
 #include "modules/audio_processing/agc/agc_manager_direct.h"
 #include "modules/audio_processing/agc2/gain_applier.h"
 #include "modules/audio_processing/audio_buffer.h"
@@ -669,17 +671,20 @@
   rtc::CritScope cs_render(&crit_render_);
   rtc::CritScope cs_capture(&crit_capture_);
 
+  const bool aec_config_changed =
+      config_.echo_canceller.enabled != config.echo_canceller.enabled ||
+      config_.echo_canceller.use_legacy_aec !=
+          config.echo_canceller.use_legacy_aec ||
+      config_.echo_canceller.mobile_mode != config.echo_canceller.mobile_mode ||
+      (config_.echo_canceller.enabled && config.echo_canceller.use_legacy_aec &&
+       config_.echo_canceller.legacy_moderate_suppression_level !=
+           config.echo_canceller.legacy_moderate_suppression_level);
+
   config_ = config;
 
-  private_submodules_->echo_cancellation->Enable(
-      config_.echo_canceller.enabled && !config_.echo_canceller.mobile_mode);
-  private_submodules_->echo_control_mobile->Enable(
-      config_.echo_canceller.enabled && config_.echo_canceller.mobile_mode);
-
-  private_submodules_->echo_cancellation->set_suppression_level(
-      config.echo_canceller.legacy_moderate_suppression_level
-          ? EchoCancellationImpl::SuppressionLevel::kModerateSuppression
-          : EchoCancellationImpl::SuppressionLevel::kHighSuppression);
+  if (aec_config_changed) {
+    InitializeEchoController();
+  }
 
   public_submodules_->noise_suppression->Enable(
       config.noise_suppression.enabled);
@@ -1342,6 +1347,7 @@
         capture_buffer->split_bands_const(0)[kBand0To8kHz],
         capture_buffer->num_frames_per_band(), capture_nonlocked_.split_rate);
   }
+  // TODO(peah): Add reporting from AEC3 whether there is echo.
   RETURN_ON_ERR(public_submodules_->gain_control->ProcessCaptureAudio(
       capture_buffer,
       private_submodules_->echo_cancellation->stream_has_echo()));
@@ -1770,11 +1776,31 @@
 }
 
 void AudioProcessingImpl::InitializeEchoController() {
-  if (echo_control_factory_) {
-    private_submodules_->echo_controller =
-        echo_control_factory_->Create(proc_sample_rate_hz());
+  if (echo_control_factory_ ||
+      (config_.echo_canceller.enabled && !config_.echo_canceller.mobile_mode &&
+       !config_.echo_canceller.use_legacy_aec)) {
+    if (echo_control_factory_) {
+      private_submodules_->echo_controller =
+          echo_control_factory_->Create(proc_sample_rate_hz());
+    } else {
+      private_submodules_->echo_controller = absl::make_unique<EchoCanceller3>(
+          EchoCanceller3Config(), proc_sample_rate_hz(), true);
+    }
+
+    capture_nonlocked_.echo_controller_enabled = true;
   } else {
+    private_submodules_->echo_cancellation->Enable(
+        config_.echo_canceller.enabled && !config_.echo_canceller.mobile_mode);
+    private_submodules_->echo_control_mobile->Enable(
+        config_.echo_canceller.enabled && config_.echo_canceller.mobile_mode);
+
+    private_submodules_->echo_cancellation->set_suppression_level(
+        config_.echo_canceller.legacy_moderate_suppression_level
+            ? EchoCancellationImpl::SuppressionLevel::kModerateSuppression
+            : EchoCancellationImpl::SuppressionLevel::kHighSuppression);
+
     private_submodules_->echo_controller.reset();
+    capture_nonlocked_.echo_controller_enabled = false;
   }
 }
 
@@ -1915,7 +1941,7 @@
 
   InternalAPMConfig apm_config;
 
-  apm_config.aec_enabled = private_submodules_->echo_cancellation->is_enabled();
+  apm_config.aec_enabled = config_.echo_canceller.enabled;
   apm_config.aec_delay_agnostic_enabled =
       private_submodules_->echo_cancellation->is_delay_agnostic_enabled();
   apm_config.aec_drift_compensation_enabled =
diff --git a/modules/audio_processing/audio_processing_unittest.cc b/modules/audio_processing/audio_processing_unittest.cc
index 5ca0f74..59feb9b 100644
--- a/modules/audio_processing/audio_processing_unittest.cc
+++ b/modules/audio_processing/audio_processing_unittest.cc
@@ -182,10 +182,11 @@
   apm_config.echo_canceller.enabled = true;
 #if defined(WEBRTC_AUDIOPROC_FIXED_PROFILE)
   apm_config.echo_canceller.mobile_mode = true;
-
   EXPECT_NOERR(ap->gain_control()->set_mode(GainControl::kAdaptiveDigital));
   EXPECT_NOERR(ap->gain_control()->Enable(true));
 #elif defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
+  // TODO(peah): Update tests to instead use AEC3.
+  apm_config.echo_canceller.use_legacy_aec = true;
   apm_config.echo_canceller.mobile_mode = false;
   apm_config.echo_canceller.legacy_moderate_suppression_level = true;
 
@@ -720,28 +721,24 @@
 
   // -- Missing delay --
   EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
+  EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
 
   // Resets after successful ProcessStream().
   EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
   EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
+  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));
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
+  EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
   EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
 
   // -- No stream parameters --
   EXPECT_EQ(apm_->kNoError,
             AnalyzeReverseStreamChooser(format));
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
+  EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
 
   // -- All there --
   EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
@@ -873,6 +870,8 @@
   // Enable AEC only.
   AudioProcessing::Config apm_config = apm_->GetConfig();
   apm_config.echo_canceller.enabled = true;
+  // TODO(peah): Update tests to instead use AEC3.
+  apm_config.echo_canceller.use_legacy_aec = true;
   apm_config.echo_canceller.mobile_mode = false;
   apm_->ApplyConfig(apm_config);
   Config config;
@@ -1430,6 +1429,8 @@
   // Check the test is valid. We should have distortion from the filter
   // when AEC is enabled (which won't affect the audio).
   apm_config.echo_canceller.enabled = true;
+  // TODO(peah): Update tests to instead use AEC3.
+  apm_config.echo_canceller.use_legacy_aec = true;
   apm_config.echo_canceller.mobile_mode = false;
   apm_->ApplyConfig(apm_config);
   frame_->samples_per_channel_ = 320;
@@ -2443,11 +2444,11 @@
                     std::make_tuple(44100, 16000, 16000, 16000, 25, 0),
 
                     std::make_tuple(32000, 48000, 48000, 48000, 30, 0),
-                    std::make_tuple(32000, 48000, 32000, 48000, 35, 30),
+                    std::make_tuple(32000, 48000, 32000, 48000, 32, 30),
                     std::make_tuple(32000, 48000, 16000, 48000, 30, 20),
-                    std::make_tuple(32000, 44100, 48000, 44100, 20, 20),
-                    std::make_tuple(32000, 44100, 32000, 44100, 20, 15),
-                    std::make_tuple(32000, 44100, 16000, 44100, 20, 15),
+                    std::make_tuple(32000, 44100, 48000, 44100, 19, 20),
+                    std::make_tuple(32000, 44100, 32000, 44100, 19, 15),
+                    std::make_tuple(32000, 44100, 16000, 44100, 19, 15),
                     std::make_tuple(32000, 32000, 48000, 32000, 40, 35),
                     std::make_tuple(32000, 32000, 32000, 32000, 0, 0),
                     std::make_tuple(32000, 32000, 16000, 32000, 40, 20),
@@ -2455,16 +2456,16 @@
                     std::make_tuple(32000, 16000, 32000, 16000, 25, 20),
                     std::make_tuple(32000, 16000, 16000, 16000, 25, 0),
 
-                    std::make_tuple(16000, 48000, 48000, 48000, 25, 0),
-                    std::make_tuple(16000, 48000, 32000, 48000, 25, 30),
-                    std::make_tuple(16000, 48000, 16000, 48000, 25, 20),
+                    std::make_tuple(16000, 48000, 48000, 48000, 24, 0),
+                    std::make_tuple(16000, 48000, 32000, 48000, 24, 30),
+                    std::make_tuple(16000, 48000, 16000, 48000, 24, 20),
                     std::make_tuple(16000, 44100, 48000, 44100, 15, 20),
                     std::make_tuple(16000, 44100, 32000, 44100, 15, 15),
                     std::make_tuple(16000, 44100, 16000, 44100, 15, 15),
                     std::make_tuple(16000, 32000, 48000, 32000, 25, 35),
                     std::make_tuple(16000, 32000, 32000, 32000, 25, 0),
                     std::make_tuple(16000, 32000, 16000, 32000, 25, 20),
-                    std::make_tuple(16000, 16000, 48000, 16000, 40, 20),
+                    std::make_tuple(16000, 16000, 48000, 16000, 39, 20),
                     std::make_tuple(16000, 16000, 32000, 16000, 40, 20),
                     std::make_tuple(16000, 16000, 16000, 16000, 0, 0)));
 
@@ -2684,12 +2685,14 @@
   }
 
   // Disable all components except for an AEC and the residual echo detector.
+  // TODO(peah): Update this to also work on AEC3.
   AudioProcessing::Config apm_config;
   apm_config.residual_echo_detector.enabled = true;
   apm_config.high_pass_filter.enabled = false;
   apm_config.gain_controller2.enabled = false;
   apm_config.echo_canceller.enabled = true;
   apm_config.echo_canceller.mobile_mode = !use_AEC2;
+  apm_config.echo_canceller.use_legacy_aec = use_AEC2;
   apm->ApplyConfig(apm_config);
   EXPECT_EQ(apm->gain_control()->Enable(false), 0);
   EXPECT_EQ(apm->level_estimator()->Enable(false), 0);
@@ -2708,6 +2711,11 @@
   // Set up APM with AEC2 and process some audio.
   std::unique_ptr<AudioProcessing> apm = CreateApm(true);
   ASSERT_TRUE(apm);
+  AudioProcessing::Config apm_config;
+  apm_config.echo_canceller.enabled = true;
+  // TODO(peah): Update tests to instead use AEC3.
+  apm_config.echo_canceller.use_legacy_aec = true;
+  apm->ApplyConfig(apm_config);
 
   // Set up an audioframe.
   AudioFrame frame;
diff --git a/modules/audio_processing/echo_cancellation_impl.cc b/modules/audio_processing/echo_cancellation_impl.cc
index 73fe51b..96b9789 100644
--- a/modules/audio_processing/echo_cancellation_impl.cc
+++ b/modules/audio_processing/echo_cancellation_impl.cc
@@ -322,7 +322,12 @@
 }
 
 std::string EchoCancellationImpl::GetExperimentsDescription() {
-  return refined_adaptive_filter_enabled_ ? "RefinedAdaptiveFilter;" : "";
+  if (enabled_) {
+    return refined_adaptive_filter_enabled_
+               ? "Legacy AEC;RefinedAdaptiveFilter;"
+               : "Legacy AEC;";
+  }
+  return "";
 }
 
 bool EchoCancellationImpl::is_refined_adaptive_filter_enabled() const {
diff --git a/modules/audio_processing/test/audio_processing_simulator.cc b/modules/audio_processing/test/audio_processing_simulator.cc
index c2dad17..d980d88 100644
--- a/modules/audio_processing/test/audio_processing_simulator.cc
+++ b/modules/audio_processing/test/audio_processing_simulator.cc
@@ -370,27 +370,33 @@
         settings_.pre_amplifier_gain_factor;
   }
 
-  bool use_aec2 = settings_.use_aec && *settings_.use_aec;
-  bool use_aec3 = settings_.use_aec3 && *settings_.use_aec3;
-  bool use_aecm = settings_.use_aecm && *settings_.use_aecm;
-  if (use_aec2 || use_aec3 || use_aecm) {
+  const bool use_legacy_aec = settings_.use_aec && *settings_.use_aec &&
+                              settings_.use_legacy_aec &&
+                              *settings_.use_legacy_aec;
+  const bool use_aec = settings_.use_aec && *settings_.use_aec;
+  const bool use_aecm = settings_.use_aecm && *settings_.use_aecm;
+  if (use_legacy_aec || use_aec || use_aecm) {
     apm_config.echo_canceller.enabled = true;
     apm_config.echo_canceller.mobile_mode = use_aecm;
+    apm_config.echo_canceller.use_legacy_aec = use_legacy_aec;
   }
 
-  if (settings_.use_aec3 && *settings_.use_aec3) {
-    EchoCanceller3Config cfg;
-    if (settings_.aec3_settings_filename) {
-      if (settings_.use_verbose_logging) {
-        std::cout << "Reading AEC3 Parameters from JSON input." << std::endl;
-      }
-      cfg = ReadAec3ConfigFromJsonFile(*settings_.aec3_settings_filename);
-    }
-    echo_control_factory.reset(new EchoCanceller3Factory(cfg));
+  RTC_CHECK(!(use_legacy_aec && settings_.aec_settings_filename))
+      << "The legacy AEC cannot be configured using settings";
 
-    if (settings_.print_aec3_parameter_values) {
+  if (use_aec && !use_legacy_aec) {
+    EchoCanceller3Config cfg;
+    if (settings_.aec_settings_filename) {
+      if (settings_.use_verbose_logging) {
+        std::cout << "Reading AEC Parameters from JSON input." << std::endl;
+      }
+      cfg = ReadAec3ConfigFromJsonFile(*settings_.aec_settings_filename);
+      echo_control_factory.reset(new EchoCanceller3Factory(cfg));
+    }
+
+    if (settings_.print_aec_parameter_values) {
       if (!settings_.use_quiet_output) {
-        std::cout << "AEC3 settings:" << std::endl;
+        std::cout << "AEC settings:" << std::endl;
       }
       std::cout << Aec3ConfigToJsonString(cfg) << std::endl;
     }
diff --git a/modules/audio_processing/test/audio_processing_simulator.h b/modules/audio_processing/test/audio_processing_simulator.h
index 0ac25da..cba3134 100644
--- a/modules/audio_processing/test/audio_processing_simulator.h
+++ b/modules/audio_processing/test/audio_processing_simulator.h
@@ -64,7 +64,7 @@
   absl::optional<bool> use_delay_agnostic;
   absl::optional<bool> use_extended_filter;
   absl::optional<bool> use_drift_compensation;
-  absl::optional<bool> use_aec3;
+  absl::optional<bool> use_legacy_aec;
   absl::optional<bool> use_experimental_agc;
   absl::optional<bool> use_experimental_agc_agc2_level_estimator;
   absl::optional<bool> experimental_agc_disable_digital_adaptive;
@@ -93,11 +93,11 @@
   absl::optional<std::string> aec_dump_output_filename;
   bool fixed_interface = false;
   bool store_intermediate_output = false;
-  bool print_aec3_parameter_values = false;
+  bool print_aec_parameter_values = false;
   bool dump_internal_data = false;
   absl::optional<std::string> dump_internal_data_output_dir;
   absl::optional<std::string> custom_call_order_filename;
-  absl::optional<std::string> aec3_settings_filename;
+  absl::optional<std::string> aec_settings_filename;
 };
 
 // Holds a few statistics about a series of TickIntervals.
diff --git a/modules/audio_processing/test/audioproc_float_impl.cc b/modules/audio_processing/test/audioproc_float_impl.cc
index 0ff2806..af439b7 100644
--- a/modules/audio_processing/test/audioproc_float_impl.cc
+++ b/modules/audio_processing/test/audioproc_float_impl.cc
@@ -113,10 +113,9 @@
 WEBRTC_DEFINE_int(extended_filter,
                   kParameterNotSpecifiedValue,
                   "Activate (1) or deactivate(0) the AEC extended filter mode");
-WEBRTC_DEFINE_int(
-    aec3,
-    kParameterNotSpecifiedValue,
-    "Activate (1) or deactivate(0) the experimental AEC mode AEC3");
+WEBRTC_DEFINE_int(use_legacy_aec,
+                  kParameterNotSpecifiedValue,
+                  "Activate (1) or deactivate(0) the legacy AEC");
 WEBRTC_DEFINE_int(experimental_agc,
                   kParameterNotSpecifiedValue,
                   "Activate (1) or deactivate(0) the experimental AGC");
@@ -207,12 +206,12 @@
 WEBRTC_DEFINE_string(custom_call_order_file,
                      "",
                      "Custom process API call order file");
-WEBRTC_DEFINE_bool(print_aec3_parameter_values,
+WEBRTC_DEFINE_bool(print_aec_parameter_values,
                    false,
-                   "Print parameter values used in AEC3 in JSON-format");
-WEBRTC_DEFINE_string(aec3_settings,
+                   "Print parameter values used in AEC in JSON-format");
+WEBRTC_DEFINE_string(aec_settings,
                      "",
-                     "File in JSON-format with custom AEC3 settings");
+                     "File in JSON-format with custom AEC settings");
 WEBRTC_DEFINE_bool(dump_data,
                    false,
                    "Dump internal data during the call (requires build flag)");
@@ -314,7 +313,7 @@
   SetSettingIfFlagSet(FLAG_refined_adaptive_filter,
                       &settings.use_refined_adaptive_filter);
 
-  SetSettingIfFlagSet(FLAG_aec3, &settings.use_aec3);
+  SetSettingIfFlagSet(FLAG_use_legacy_aec, &settings.use_legacy_aec);
   SetSettingIfFlagSet(FLAG_experimental_agc, &settings.use_experimental_agc);
   SetSettingIfFlagSet(FLAG_experimental_agc_disable_digital_adaptive,
                       &settings.experimental_agc_disable_digital_adaptive);
@@ -341,7 +340,7 @@
                         &settings.stream_drift_samples);
   SetSettingIfSpecified(FLAG_custom_call_order_file,
                         &settings.custom_call_order_filename);
-  SetSettingIfSpecified(FLAG_aec3_settings, &settings.aec3_settings_filename);
+  SetSettingIfSpecified(FLAG_aec_settings, &settings.aec_settings_filename);
   settings.initial_mic_level = FLAG_initial_mic_level;
   settings.simulate_mic_gain = FLAG_simulate_mic_gain;
   SetSettingIfSpecified(FLAG_simulated_mic_kind, &settings.simulated_mic_kind);
@@ -352,7 +351,7 @@
   settings.discard_all_settings_in_aecdump = FLAG_discard_settings_in_aecdump;
   settings.fixed_interface = FLAG_fixed_interface;
   settings.store_intermediate_output = FLAG_store_intermediate_output;
-  settings.print_aec3_parameter_values = FLAG_print_aec3_parameter_values;
+  settings.print_aec_parameter_values = FLAG_print_aec_parameter_values;
   settings.dump_internal_data = FLAG_dump_data;
   SetSettingIfSpecified(FLAG_dump_data_output_dir,
                         &settings.dump_internal_data_output_dir);
diff --git a/modules/audio_processing/test/debug_dump_test.cc b/modules/audio_processing/test/debug_dump_test.cc
index 0f3ebff..be0af9b 100644
--- a/modules/audio_processing/test/debug_dump_test.cc
+++ b/modules/audio_processing/test/debug_dump_test.cc
@@ -48,15 +48,10 @@
                      int reverse_channels,
                      const Config& config,
                      const std::string& dump_file_name,
-                     bool enable_aec3,
                      bool enable_pre_amplifier);
 
   // Constructor that uses default input files.
   explicit DebugDumpGenerator(const Config& config,
-                              const AudioProcessing::Config& apm_config,
-                              bool enable_aec3);
-
-  explicit DebugDumpGenerator(const Config& config,
                               const AudioProcessing::Config& apm_config);
 
   ~DebugDumpGenerator();
@@ -129,7 +124,6 @@
                                        int reverse_channels,
                                        const Config& config,
                                        const std::string& dump_file_name,
-                                       bool enable_aec3,
                                        bool enable_pre_amplifier)
     : input_config_(input_rate_hz, input_channels),
       reverse_config_(reverse_rate_hz, reverse_channels),
@@ -148,17 +142,12 @@
       worker_queue_("debug_dump_generator_worker_queue"),
       dump_file_name_(dump_file_name) {
   AudioProcessingBuilder apm_builder;
-  if (enable_aec3) {
-    apm_builder.SetEchoControlFactory(
-        std::unique_ptr<EchoControlFactory>(new EchoCanceller3Factory()));
-  }
   apm_.reset(apm_builder.Create(config));
 }
 
 DebugDumpGenerator::DebugDumpGenerator(
     const Config& config,
-    const AudioProcessing::Config& apm_config,
-    bool enable_aec3)
+    const AudioProcessing::Config& apm_config)
     : DebugDumpGenerator(ResourcePath("near32_stereo", "pcm"),
                          32000,
                          2,
@@ -167,18 +156,10 @@
                          2,
                          config,
                          TempFilename(OutputPath(), "debug_aec"),
-                         enable_aec3,
                          apm_config.pre_amplifier.enabled) {
   apm_->ApplyConfig(apm_config);
 }
 
-DebugDumpGenerator::DebugDumpGenerator(
-    const Config& config,
-    const AudioProcessing::Config& apm_config)
-    : DebugDumpGenerator(config, apm_config, false) {
-  apm_->ApplyConfig(apm_config);
-}
-
 DebugDumpGenerator::~DebugDumpGenerator() {
   remove(dump_file_name_.c_str());
 }
@@ -360,22 +341,7 @@
 TEST_F(DebugDumpTest, ToggleAec) {
   Config config;
   AudioProcessing::Config apm_config;
-  DebugDumpGenerator generator(config, apm_config);
-  generator.StartRecording();
-  generator.Process(100);
-
   apm_config.echo_canceller.enabled = true;
-  generator.apm()->ApplyConfig(apm_config);
-
-  generator.Process(100);
-  generator.StopRecording();
-  VerifyDebugDump(generator.dump_file_name());
-}
-
-TEST_F(DebugDumpTest, ToggleDelayAgnosticAec) {
-  Config config;
-  config.Set<DelayAgnostic>(new DelayAgnostic(true));
-  AudioProcessing::Config apm_config;
   DebugDumpGenerator generator(config, apm_config);
   generator.StartRecording();
   generator.Process(100);
@@ -390,8 +356,11 @@
 
 TEST_F(DebugDumpTest, VerifyRefinedAdaptiveFilterExperimentalString) {
   Config config;
+  AudioProcessing::Config apm_config;
+  apm_config.echo_canceller.enabled = true;
+  apm_config.echo_canceller.use_legacy_aec = true;
   config.Set<RefinedAdaptiveFilter>(new RefinedAdaptiveFilter(true));
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
+  DebugDumpGenerator generator(config, apm_config);
   generator.StartRecording();
   generator.Process(100);
   generator.StopRecording();
@@ -408,6 +377,8 @@
       ASSERT_TRUE(msg->has_experiments_description());
       EXPECT_PRED_FORMAT2(testing::IsSubstring, "RefinedAdaptiveFilter",
                           msg->experiments_description().c_str());
+      EXPECT_PRED_FORMAT2(testing::IsSubstring, "Legacy AEC",
+                          msg->experiments_description().c_str());
     }
   }
 }
@@ -416,11 +387,9 @@
   Config config;
   AudioProcessing::Config apm_config;
   apm_config.echo_canceller.enabled = true;
-  config.Set<RefinedAdaptiveFilter>(new RefinedAdaptiveFilter(true));
   // Arbitrarily set clipping gain to 17, which will never be the default.
   config.Set<ExperimentalAgc>(new ExperimentalAgc(true, 0, 17));
-  bool enable_aec3 = true;
-  DebugDumpGenerator generator(config, apm_config, enable_aec3);
+  DebugDumpGenerator generator(config, apm_config);
   generator.StartRecording();
   generator.Process(100);
   generator.StopRecording();
@@ -435,10 +404,10 @@
     if (event->type() == audioproc::Event::CONFIG) {
       const audioproc::Config* msg = &event->config();
       ASSERT_TRUE(msg->has_experiments_description());
-      EXPECT_PRED_FORMAT2(testing::IsSubstring, "RefinedAdaptiveFilter",
-                          msg->experiments_description().c_str());
       EXPECT_PRED_FORMAT2(testing::IsSubstring, "EchoController",
                           msg->experiments_description().c_str());
+      EXPECT_PRED_FORMAT2(testing::IsNotSubstring, "Legacy AEC",
+                          msg->experiments_description().c_str());
       EXPECT_PRED_FORMAT2(testing::IsSubstring, "AgcClippingLevelExperiment",
                           msg->experiments_description().c_str());
     }
@@ -447,8 +416,10 @@
 
 TEST_F(DebugDumpTest, VerifyCombinedExperimentalStringExclusive) {
   Config config;
-  config.Set<RefinedAdaptiveFilter>(new RefinedAdaptiveFilter(true));
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
+  AudioProcessing::Config apm_config;
+  apm_config.echo_canceller.enabled = true;
+  apm_config.echo_canceller.use_legacy_aec = true;
+  DebugDumpGenerator generator(config, apm_config);
   generator.StartRecording();
   generator.Process(100);
   generator.StopRecording();
@@ -463,9 +434,7 @@
     if (event->type() == audioproc::Event::CONFIG) {
       const audioproc::Config* msg = &event->config();
       ASSERT_TRUE(msg->has_experiments_description());
-      EXPECT_PRED_FORMAT2(testing::IsSubstring, "RefinedAdaptiveFilter",
-                          msg->experiments_description().c_str());
-      EXPECT_PRED_FORMAT2(testing::IsNotSubstring, "AEC3",
+      EXPECT_PRED_FORMAT2(testing::IsNotSubstring, "EchoController",
                           msg->experiments_description().c_str());
       EXPECT_PRED_FORMAT2(testing::IsNotSubstring, "AgcClippingLevelExperiment",
                           msg->experiments_description().c_str());
@@ -477,7 +446,7 @@
   Config config;
   AudioProcessing::Config apm_config;
   apm_config.echo_canceller.enabled = true;
-  DebugDumpGenerator generator(config, apm_config, true);
+  DebugDumpGenerator generator(config, apm_config);
   generator.StartRecording();
   generator.Process(100);
   generator.StopRecording();
@@ -492,6 +461,8 @@
     if (event->type() == audioproc::Event::CONFIG) {
       const audioproc::Config* msg = &event->config();
       ASSERT_TRUE(msg->has_experiments_description());
+      EXPECT_PRED_FORMAT2(testing::IsNotSubstring, "Legacy AEC",
+                          msg->experiments_description().c_str());
       EXPECT_PRED_FORMAT2(testing::IsSubstring, "EchoController",
                           msg->experiments_description().c_str());
     }
@@ -545,23 +516,6 @@
   }
 }
 
-TEST_F(DebugDumpTest, ToggleAecLevel) {
-  Config config;
-  AudioProcessing::Config apm_config;
-  apm_config.echo_canceller.enabled = true;
-  apm_config.echo_canceller.mobile_mode = false;
-  apm_config.echo_canceller.legacy_moderate_suppression_level = true;
-  DebugDumpGenerator generator(config, apm_config);
-  generator.StartRecording();
-  generator.Process(100);
-
-  apm_config.echo_canceller.legacy_moderate_suppression_level = false;
-  generator.apm()->ApplyConfig(apm_config);
-  generator.Process(100);
-  generator.StopRecording();
-  VerifyDebugDump(generator.dump_file_name());
-}
-
 // AGC is not supported on Android or iOS.
 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
 #define MAYBE_ToggleAgc DISABLED_ToggleAgc
diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn
index 6eee940..862d59d 100644
--- a/test/fuzzers/BUILD.gn
+++ b/test/fuzzers/BUILD.gn
@@ -485,6 +485,7 @@
     "../../api/audio:aec3_factory",
     "../../modules/audio_processing",
     "../../modules/audio_processing:api",
+    "../../modules/audio_processing:audio_buffer",
     "../../modules/audio_processing/aec3",
     "../../modules/audio_processing/aec_dump",
     "../../modules/audio_processing/aec_dump:aec_dump_impl",
@@ -505,6 +506,7 @@
     ":fuzz_data_helper",
     "../../modules/audio_processing",
     "../../modules/audio_processing:api",
+    "../../modules/audio_processing:audio_buffer",
     "../../rtc_base:rtc_base_approved",
     "../../rtc_base:safe_minmax",
     "//third_party/abseil-cpp/absl/memory",