Move webrtc::AudioProcessing include to api/ folder

Bug: webrtc:15874
Change-Id: Ie8a6e031c0f0505cfe238f7d252c47e9c34408d4
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/347983
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Auto-Submit: Florent Castelli <orphis@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42128}
diff --git a/api/BUILD.gn b/api/BUILD.gn
index 709d242..67d463d 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -56,8 +56,8 @@
   deps = [
     ":enable_media",
     ":libjingle_peerconnection_api",
-    "../modules/audio_processing:api",
     "../rtc_base/system:rtc_export",
+    "audio:audio_processing",
     "audio_codecs:builtin_audio_decoder_factory",
     "audio_codecs:builtin_audio_encoder_factory",
     "task_queue:default_task_queue_factory",
@@ -81,13 +81,13 @@
       ":scoped_refptr",
       "../api/rtc_event_log:rtc_event_log_factory",
       "../modules/audio_device:audio_device_api",
-      "../modules/audio_processing:api",
       "../pc:peer_connection_factory",
       "../pc:webrtc_sdp",
       "../rtc_base:threading",
       "../rtc_base/system:rtc_export",
       "../stats:rtc_stats",
       "audio:audio_mixer_api",
+      "audio:audio_processing",
       "audio_codecs:audio_codecs_api",
       "task_queue:default_task_queue_factory",
       "transport:field_trial_based_config",
@@ -164,10 +164,10 @@
     ":scoped_refptr",
     ":sequence_checker",
     ":video_track_source_constraints",
-    "../modules/audio_processing:audio_processing_statistics",
     "../rtc_base:checks",
     "../rtc_base/system:no_unique_address",
     "../rtc_base/system:rtc_export",
+    "audio:audio_processing_statistics",
     "video:recordable_encoded_frame",
     "video:video_frame",
   ]
@@ -377,7 +377,6 @@
     # targets like pnacl. API should not depend on anything outside of this
     # file, really. All these should arguably go away in time.
     "../media:rtc_media_config",
-    "../modules/audio_processing:audio_processing_statistics",
     "../rtc_base:checks",
     "../rtc_base:ip_address",
     "../rtc_base:socket_address",
@@ -587,7 +586,6 @@
     ":track_id_stream_info_map",
     ":video_quality_analyzer_api",
     "../media:media_constants",
-    "../modules/audio_processing:api",
     "../rtc_base:checks",
     "../rtc_base:network",
     "../rtc_base:rtc_certificate_generator",
@@ -596,6 +594,7 @@
     "../rtc_base:threading",
     "../test:fileutils",
     "audio:audio_mixer_api",
+    "audio:audio_processing",
     "rtc_event_log",
     "task_queue",
     "test/pclf:media_configuration",
@@ -995,8 +994,8 @@
 
       deps = [
         "../modules/audio_processing",
-        "../modules/audio_processing:api",
         "../modules/audio_processing:audioproc_f_impl",
+        "audio:audio_processing",
       ]
     }
 
diff --git a/api/DEPS b/api/DEPS
index 5a5c285..f9fdb72 100644
--- a/api/DEPS
+++ b/api/DEPS
@@ -49,6 +49,7 @@
   ],
 
   ".*\.h": [
+    "+rtc_base/arraysize.h",
     "+rtc_base/checks.h",
     "+rtc_base/system/rtc_export.h",
     "+rtc_base/system/rtc_export_template.h",
@@ -95,10 +96,6 @@
     "+modules/include/module_fec_types.h",
   ],
 
-  "media_stream_interface\.h": [
-    "+modules/audio_processing/include/audio_processing_statistics.h",
-  ],
-
   "packet_socket_factory\.h": [
     "+rtc_base/proxy_info.h",
     "+rtc_base/async_packet_socket.h",
@@ -151,14 +148,6 @@
     "+rtc_base/buffer.h",
   ],
 
-  "audioproc_float\.h": [
-    "+modules/audio_processing/include/audio_processing.h",
-  ],
-
-  "echo_detector_creator\.h": [
-    "+modules/audio_processing/include/audio_processing.h",
-  ],
-
   "make_ref_counted\.h": [
     "+rtc_base/ref_counted_object.h",
   ],
diff --git a/api/audio/BUILD.gn b/api/audio/BUILD.gn
index 0ecab64..2fc4b19 100644
--- a/api/audio/BUILD.gn
+++ b/api/audio/BUILD.gn
@@ -42,6 +42,44 @@
   ]
 }
 
+rtc_source_set("audio_processing") {
+  visibility = [ "*" ]
+  sources = [
+    "audio_processing.cc",
+    "audio_processing.h",
+  ]
+  deps = [
+    ":aec3_config",
+    ":audio_processing_statistics",
+    ":echo_control",
+    "..:array_view",
+    "..:ref_count",
+    "..:scoped_refptr",
+    "../../rtc_base:checks",
+    "../../rtc_base:macromagic",
+    "../../rtc_base:stringutils",
+    "../../rtc_base/system:arch",
+    "../../rtc_base/system:file_wrapper",
+    "../../rtc_base/system:rtc_export",
+    "../task_queue",
+  ]
+  absl_deps = [
+    "//third_party/abseil-cpp/absl/base:nullability",
+    "//third_party/abseil-cpp/absl/strings:string_view",
+    "//third_party/abseil-cpp/absl/types:optional",
+  ]
+}
+
+rtc_source_set("audio_processing_statistics") {
+  visibility = [ "*" ]
+  sources = [
+    "audio_processing_statistics.cc",
+    "audio_processing_statistics.h",
+  ]
+  deps = [ "../../rtc_base/system:rtc_export" ]
+  absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
+}
+
 rtc_library("aec3_config") {
   visibility = [ "*" ]
   sources = [
@@ -85,9 +123,9 @@
     "echo_detector_creator.h",
   ]
   deps = [
+    ":audio_processing",
     "..:make_ref_counted",
     "../../api:scoped_refptr",
-    "../../modules/audio_processing:api",
     "../../modules/audio_processing:residual_echo_detector",
   ]
 }
diff --git a/modules/audio_processing/include/audio_processing.cc b/api/audio/audio_processing.cc
similarity index 98%
rename from modules/audio_processing/include/audio_processing.cc
rename to api/audio/audio_processing.cc
index 13ddcc5..2df2a78 100644
--- a/modules/audio_processing/include/audio_processing.cc
+++ b/api/audio/audio_processing.cc
@@ -8,10 +8,11 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#include "modules/audio_processing/include/audio_processing.h"
+#include "api/audio/audio_processing.h"
+#include <string>
 
+#include "rtc_base/checks.h"
 #include "rtc_base/strings/string_builder.h"
-#include "rtc_base/system/arch.h"
 
 namespace webrtc {
 namespace {
diff --git a/api/audio/audio_processing.h b/api/audio/audio_processing.h
new file mode 100644
index 0000000..d5cdb44
--- /dev/null
+++ b/api/audio/audio_processing.h
@@ -0,0 +1,945 @@
+/*
+ *  Copyright (c) 2012 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 API_AUDIO_AUDIO_PROCESSING_H_
+#define API_AUDIO_AUDIO_PROCESSING_H_
+
+// MSVC++ requires this to be set before any other includes to get M_PI.
+#ifndef _USE_MATH_DEFINES
+#define _USE_MATH_DEFINES
+#endif
+
+#include <math.h>
+#include <stddef.h>  // size_t
+#include <stdio.h>   // FILE
+#include <string.h>
+
+#include <array>
+#include <cstdint>
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "absl/base/nullability.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "api/audio/audio_processing_statistics.h"
+#include "api/audio/echo_control.h"
+#include "api/ref_count.h"
+#include "api/scoped_refptr.h"
+#include "api/task_queue/task_queue_base.h"
+#include "rtc_base/arraysize.h"
+#include "rtc_base/checks.h"
+#include "rtc_base/system/rtc_export.h"
+
+namespace webrtc {
+
+class AecDump;
+class AudioBuffer;
+
+class StreamConfig;
+class ProcessingConfig;
+
+class EchoDetector;
+class CustomAudioAnalyzer;
+class CustomProcessing;
+
+// The Audio Processing Module (APM) provides a collection of voice processing
+// components designed for real-time communications software.
+//
+// APM operates on two audio streams on a frame-by-frame basis. Frames of the
+// primary stream, on which all processing is applied, are passed to
+// `ProcessStream()`. Frames of the reverse direction stream are passed to
+// `ProcessReverseStream()`. On the client-side, this will typically be the
+// near-end (capture) and far-end (render) streams, respectively. APM should be
+// placed in the signal chain as close to the audio hardware abstraction layer
+// (HAL) as possible.
+//
+// On the server-side, the reverse stream will normally not be used, with
+// processing occurring on each incoming stream.
+//
+// Component interfaces follow a similar pattern and are accessed through
+// corresponding getters in APM. All components are disabled at create-time,
+// with default settings that are recommended for most situations. New settings
+// can be applied without enabling a component. Enabling a component triggers
+// memory allocation and initialization to allow it to start processing the
+// streams.
+//
+// Thread safety is provided with the following assumptions to reduce locking
+// overhead:
+//   1. The stream getters and setters are called from the same thread as
+//      ProcessStream(). More precisely, stream functions are never called
+//      concurrently with ProcessStream().
+//   2. Parameter getters are never called concurrently with the corresponding
+//      setter.
+//
+// APM accepts only linear PCM audio data in chunks of ~10 ms (see
+// AudioProcessing::GetFrameSize() for details) and sample rates ranging from
+// 8000 Hz to 384000 Hz. The int16 interfaces use interleaved data, while the
+// float interfaces use deinterleaved data.
+//
+// Usage example, omitting error checking:
+// rtc::scoped_refptr<AudioProcessing> apm = AudioProcessingBuilder().Create();
+//
+// AudioProcessing::Config config;
+// config.echo_canceller.enabled = true;
+// config.echo_canceller.mobile_mode = false;
+//
+// 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;
+//
+// apm->ApplyConfig(config)
+//
+// // Start a voice call...
+//
+// // ... Render frame arrives bound for the audio HAL ...
+// apm->ProcessReverseStream(render_frame);
+//
+// // ... Capture frame arrives from the audio HAL ...
+// // Call required set_stream_ functions.
+// apm->set_stream_delay_ms(delay_ms);
+// apm->set_stream_analog_level(analog_level);
+//
+// apm->ProcessStream(capture_frame);
+//
+// // Call required stream_ functions.
+// analog_level = apm->recommended_stream_analog_level();
+// has_voice = apm->stream_has_voice();
+//
+// // Repeat render and capture processing for the duration of the call...
+// // Start a new call...
+// apm->Initialize();
+//
+// // Close the application...
+// apm.reset();
+//
+class RTC_EXPORT AudioProcessing : public RefCountInterface {
+ public:
+  // The struct below constitutes the new parameter scheme for the audio
+  // processing. It is being introduced gradually and until it is fully
+  // introduced, it is prone to change.
+  // TODO(peah): Remove this comment once the new config scheme is fully rolled
+  // out.
+  //
+  // The parameters and behavior of the audio processing module are controlled
+  // by changing the default values in the AudioProcessing::Config struct.
+  // The config is applied by passing the struct to the ApplyConfig method.
+  //
+  // This config is intended to be used during setup, and to enable/disable
+  // top-level processing effects. Use during processing may cause undesired
+  // submodule resets, affecting the audio quality. Use the RuntimeSetting
+  // construct for runtime configuration.
+  struct RTC_EXPORT Config {
+    // Sets the properties of the audio processing pipeline.
+    struct RTC_EXPORT Pipeline {
+      // Ways to downmix a multi-channel track to mono.
+      enum class DownmixMethod {
+        kAverageChannels,  // Average across channels.
+        kUseFirstChannel   // Use the first channel.
+      };
+
+      // Maximum allowed processing rate used internally. May only be set to
+      // 32000 or 48000 and any differing values will be treated as 48000.
+      int maximum_internal_processing_rate = 48000;
+      // Allow multi-channel processing of render audio.
+      bool multi_channel_render = false;
+      // Allow multi-channel processing of capture audio when AEC3 is active
+      // or a custom AEC is injected..
+      bool multi_channel_capture = false;
+      // Indicates how to downmix multi-channel capture audio to mono (when
+      // needed).
+      DownmixMethod capture_downmix_method = DownmixMethod::kAverageChannels;
+    } pipeline;
+
+    // Enabled the pre-amplifier. It amplifies the capture signal
+    // before any other processing is done.
+    // TODO(webrtc:5298): Deprecate and use the pre-gain functionality in
+    // capture_level_adjustment instead.
+    struct PreAmplifier {
+      bool enabled = false;
+      float fixed_gain_factor = 1.0f;
+    } pre_amplifier;
+
+    // Functionality for general level adjustment in the capture pipeline. This
+    // should not be used together with the legacy PreAmplifier functionality.
+    struct CaptureLevelAdjustment {
+      bool operator==(const CaptureLevelAdjustment& rhs) const;
+      bool operator!=(const CaptureLevelAdjustment& rhs) const {
+        return !(*this == rhs);
+      }
+      bool enabled = false;
+      // The `pre_gain_factor` scales the signal before any processing is done.
+      float pre_gain_factor = 1.0f;
+      // The `post_gain_factor` scales the signal after all processing is done.
+      float post_gain_factor = 1.0f;
+      struct AnalogMicGainEmulation {
+        bool operator==(const AnalogMicGainEmulation& rhs) const;
+        bool operator!=(const AnalogMicGainEmulation& rhs) const {
+          return !(*this == rhs);
+        }
+        bool enabled = false;
+        // Initial analog gain level to use for the emulated analog gain. Must
+        // be in the range [0...255].
+        int initial_level = 255;
+      } analog_mic_gain_emulation;
+    } capture_level_adjustment;
+
+    struct HighPassFilter {
+      bool enabled = false;
+      bool apply_in_full_band = true;
+    } high_pass_filter;
+
+    struct EchoCanceller {
+      bool enabled = false;
+      bool mobile_mode = false;
+      bool export_linear_aec_output = false;
+      // Enforce the highpass filter to be on (has no effect for the mobile
+      // mode).
+      bool enforce_high_pass_filtering = true;
+    } echo_canceller;
+
+    // Enables background noise suppression.
+    struct NoiseSuppression {
+      bool enabled = false;
+      enum Level { kLow, kModerate, kHigh, kVeryHigh };
+      Level level = kModerate;
+      bool analyze_linear_aec_output_when_available = false;
+    } noise_suppression;
+
+    // Enables transient suppression.
+    struct TransientSuppression {
+      bool enabled = false;
+    } transient_suppression;
+
+    // Enables automatic gain control (AGC) functionality.
+    // The automatic gain control (AGC) component brings the signal to an
+    // appropriate range. This is done by applying a digital gain directly and,
+    // in the analog mode, prescribing an analog gain to be applied at the audio
+    // HAL.
+    // Recommended to be enabled on the client-side.
+    struct RTC_EXPORT GainController1 {
+      bool operator==(const GainController1& rhs) const;
+      bool operator!=(const GainController1& rhs) const {
+        return !(*this == rhs);
+      }
+
+      bool enabled = false;
+      enum Mode {
+        // Adaptive mode intended for use if an analog volume control is
+        // available on the capture device. It will require the user to provide
+        // coupling between the OS mixer controls and AGC through the
+        // stream_analog_level() functions.
+        // It consists of an analog gain prescription for the audio device and a
+        // digital compression stage.
+        kAdaptiveAnalog,
+        // Adaptive mode intended for situations in which an analog volume
+        // control is unavailable. It operates in a similar fashion to the
+        // adaptive analog mode, but with scaling instead applied in the digital
+        // domain. As with the analog mode, it additionally uses a digital
+        // compression stage.
+        kAdaptiveDigital,
+        // Fixed mode which enables only the digital compression stage also used
+        // by the two adaptive modes.
+        // It is distinguished from the adaptive modes by considering only a
+        // short time-window of the input signal. It applies a fixed gain
+        // through most of the input level range, and compresses (gradually
+        // reduces gain with increasing level) the input signal at higher
+        // levels. This mode is preferred on embedded devices where the capture
+        // signal level is predictable, so that a known gain can be applied.
+        kFixedDigital
+      };
+      Mode mode = kAdaptiveAnalog;
+      // Sets the target peak level (or envelope) of the AGC in dBFs (decibels
+      // from digital full-scale). The convention is to use positive values. For
+      // instance, passing in a value of 3 corresponds to -3 dBFs, or a target
+      // level 3 dB below full-scale. Limited to [0, 31].
+      int target_level_dbfs = 3;
+      // Sets the maximum gain the digital compression stage may apply, in dB. A
+      // higher number corresponds to greater compression, while a value of 0
+      // will leave the signal uncompressed. Limited to [0, 90].
+      // For updates after APM setup, use a RuntimeSetting instead.
+      int compression_gain_db = 9;
+      // When enabled, the compression stage will hard limit the signal to the
+      // target level. Otherwise, the signal will be compressed but not limited
+      // above the target level.
+      bool enable_limiter = true;
+
+      // Enables the analog gain controller functionality.
+      struct AnalogGainController {
+        bool enabled = true;
+        // TODO(bugs.webrtc.org/7494): Deprecated. Stop using and remove.
+        int startup_min_volume = 0;
+        // Lowest analog microphone level that will be applied in response to
+        // clipping.
+        int clipped_level_min = 70;
+        // If true, an adaptive digital gain is applied.
+        bool enable_digital_adaptive = true;
+        // Amount the microphone level is lowered with every clipping event.
+        // Limited to (0, 255].
+        int clipped_level_step = 15;
+        // Proportion of clipped samples required to declare a clipping event.
+        // Limited to (0.f, 1.f).
+        float clipped_ratio_threshold = 0.1f;
+        // Time in frames to wait after a clipping event before checking again.
+        // Limited to values higher than 0.
+        int clipped_wait_frames = 300;
+
+        // Enables clipping prediction functionality.
+        struct ClippingPredictor {
+          bool enabled = false;
+          enum Mode {
+            // Clipping event prediction mode with fixed step estimation.
+            kClippingEventPrediction,
+            // Clipped peak estimation mode with adaptive step estimation.
+            kAdaptiveStepClippingPeakPrediction,
+            // Clipped peak estimation mode with fixed step estimation.
+            kFixedStepClippingPeakPrediction,
+          };
+          Mode mode = kClippingEventPrediction;
+          // Number of frames in the sliding analysis window.
+          int window_length = 5;
+          // Number of frames in the sliding reference window.
+          int reference_window_length = 5;
+          // Reference window delay (unit: number of frames).
+          int reference_window_delay = 5;
+          // Clipping prediction threshold (dBFS).
+          float clipping_threshold = -1.0f;
+          // Crest factor drop threshold (dB).
+          float crest_factor_margin = 3.0f;
+          // If true, the recommended clipped level step is used to modify the
+          // analog gain. Otherwise, the predictor runs without affecting the
+          // analog gain.
+          bool use_predicted_step = true;
+        } clipping_predictor;
+      } analog_gain_controller;
+    } gain_controller1;
+
+    // Parameters for AGC2, an Automatic Gain Control (AGC) sub-module which
+    // replaces the AGC sub-module parametrized by `gain_controller1`.
+    // AGC2 brings the captured audio signal to the desired level by combining
+    // three different controllers (namely, input volume controller, adapative
+    // digital controller and fixed digital controller) and a limiter.
+    // TODO(bugs.webrtc.org:7494): Name `GainController` when AGC1 removed.
+    struct RTC_EXPORT GainController2 {
+      bool operator==(const GainController2& rhs) const;
+      bool operator!=(const GainController2& rhs) const {
+        return !(*this == rhs);
+      }
+
+      // AGC2 must be created if and only if `enabled` is true.
+      bool enabled = false;
+
+      // Parameters for the input volume controller, which adjusts the input
+      // volume applied when the audio is captured (e.g., microphone volume on
+      // a soundcard, input volume on HAL).
+      struct InputVolumeController {
+        bool operator==(const InputVolumeController& rhs) const;
+        bool operator!=(const InputVolumeController& rhs) const {
+          return !(*this == rhs);
+        }
+        bool enabled = false;
+      } input_volume_controller;
+
+      // Parameters for the adaptive digital controller, which adjusts and
+      // applies a digital gain after echo cancellation and after noise
+      // suppression.
+      struct RTC_EXPORT AdaptiveDigital {
+        bool operator==(const AdaptiveDigital& rhs) const;
+        bool operator!=(const AdaptiveDigital& rhs) const {
+          return !(*this == rhs);
+        }
+        bool enabled = false;
+        float headroom_db = 5.0f;
+        float max_gain_db = 50.0f;
+        float initial_gain_db = 15.0f;
+        float max_gain_change_db_per_second = 6.0f;
+        float max_output_noise_level_dbfs = -50.0f;
+      } adaptive_digital;
+
+      // Parameters for the fixed digital controller, which applies a fixed
+      // digital gain after the adaptive digital controller and before the
+      // limiter.
+      struct FixedDigital {
+        // By setting `gain_db` to a value greater than zero, the limiter can be
+        // turned into a compressor that first applies a fixed gain.
+        float gain_db = 0.0f;
+      } fixed_digital;
+    } gain_controller2;
+
+    std::string ToString() const;
+  };
+
+  // Specifies the properties of a setting to be passed to AudioProcessing at
+  // runtime.
+  class RuntimeSetting {
+   public:
+    enum class Type {
+      kNotSpecified,
+      kCapturePreGain,
+      kCaptureCompressionGain,
+      kCaptureFixedPostGain,
+      kPlayoutVolumeChange,
+      kCustomRenderProcessingRuntimeSetting,
+      kPlayoutAudioDeviceChange,
+      kCapturePostGain,
+      kCaptureOutputUsed
+    };
+
+    // Play-out audio device properties.
+    struct PlayoutAudioDeviceInfo {
+      int id;          // Identifies the audio device.
+      int max_volume;  // Maximum play-out volume.
+    };
+
+    RuntimeSetting() : type_(Type::kNotSpecified), value_(0.0f) {}
+    ~RuntimeSetting() = default;
+
+    static RuntimeSetting CreateCapturePreGain(float gain) {
+      return {Type::kCapturePreGain, gain};
+    }
+
+    static RuntimeSetting CreateCapturePostGain(float gain) {
+      return {Type::kCapturePostGain, gain};
+    }
+
+    // Corresponds to Config::GainController1::compression_gain_db, but for
+    // runtime configuration.
+    static RuntimeSetting CreateCompressionGainDb(int gain_db) {
+      RTC_DCHECK_GE(gain_db, 0);
+      RTC_DCHECK_LE(gain_db, 90);
+      return {Type::kCaptureCompressionGain, static_cast<float>(gain_db)};
+    }
+
+    // Corresponds to Config::GainController2::fixed_digital::gain_db, but for
+    // runtime configuration.
+    static RuntimeSetting CreateCaptureFixedPostGain(float gain_db) {
+      RTC_DCHECK_GE(gain_db, 0.0f);
+      RTC_DCHECK_LE(gain_db, 90.0f);
+      return {Type::kCaptureFixedPostGain, gain_db};
+    }
+
+    // Creates a runtime setting to notify play-out (aka render) audio device
+    // changes.
+    static RuntimeSetting CreatePlayoutAudioDeviceChange(
+        PlayoutAudioDeviceInfo audio_device) {
+      return {Type::kPlayoutAudioDeviceChange, audio_device};
+    }
+
+    // Creates a runtime setting to notify play-out (aka render) volume changes.
+    // `volume` is the unnormalized volume, the maximum of which
+    static RuntimeSetting CreatePlayoutVolumeChange(int volume) {
+      return {Type::kPlayoutVolumeChange, volume};
+    }
+
+    static RuntimeSetting CreateCustomRenderSetting(float payload) {
+      return {Type::kCustomRenderProcessingRuntimeSetting, payload};
+    }
+
+    static RuntimeSetting CreateCaptureOutputUsedSetting(
+        bool capture_output_used) {
+      return {Type::kCaptureOutputUsed, capture_output_used};
+    }
+
+    Type type() const { return type_; }
+    // Getters do not return a value but instead modify the argument to protect
+    // from implicit casting.
+    void GetFloat(float* value) const {
+      RTC_DCHECK(value);
+      *value = value_.float_value;
+    }
+    void GetInt(int* value) const {
+      RTC_DCHECK(value);
+      *value = value_.int_value;
+    }
+    void GetBool(bool* value) const {
+      RTC_DCHECK(value);
+      *value = value_.bool_value;
+    }
+    void GetPlayoutAudioDeviceInfo(PlayoutAudioDeviceInfo* value) const {
+      RTC_DCHECK(value);
+      *value = value_.playout_audio_device_info;
+    }
+
+   private:
+    RuntimeSetting(Type id, float value) : type_(id), value_(value) {}
+    RuntimeSetting(Type id, int value) : type_(id), value_(value) {}
+    RuntimeSetting(Type id, PlayoutAudioDeviceInfo value)
+        : type_(id), value_(value) {}
+    Type type_;
+    union U {
+      U() {}
+      U(int value) : int_value(value) {}
+      U(float value) : float_value(value) {}
+      U(PlayoutAudioDeviceInfo value) : playout_audio_device_info(value) {}
+      float float_value;
+      int int_value;
+      bool bool_value;
+      PlayoutAudioDeviceInfo playout_audio_device_info;
+    } value_;
+  };
+
+  ~AudioProcessing() override {}
+
+  // Initializes internal states, while retaining all user settings. This
+  // should be called before beginning to process a new audio stream. However,
+  // it is not necessary to call before processing the first stream after
+  // creation.
+  //
+  // It is also not necessary to call if the audio parameters (sample
+  // rate and number of channels) have changed. Passing updated parameters
+  // directly to `ProcessStream()` and `ProcessReverseStream()` is permissible.
+  // If the parameters are known at init-time though, they may be provided.
+  // TODO(webrtc:5298): Change to return void.
+  virtual int Initialize() = 0;
+
+  // The int16 interfaces require:
+  //   - only `NativeRate`s be used
+  //   - that the input, output and reverse rates must match
+  //   - that `processing_config.output_stream()` matches
+  //     `processing_config.input_stream()`.
+  //
+  // The float interfaces accept arbitrary rates and support differing input and
+  // output layouts, but the output must have either one channel or the same
+  // number of channels as the input.
+  virtual int Initialize(const ProcessingConfig& processing_config) = 0;
+
+  // TODO(peah): This method is a temporary solution used to take control
+  // over the parameters in the audio processing module and is likely to change.
+  virtual void ApplyConfig(const Config& config) = 0;
+
+  // TODO(ajm): Only intended for internal use. Make private and friend the
+  // necessary classes?
+  virtual int proc_sample_rate_hz() const = 0;
+  virtual int proc_split_sample_rate_hz() const = 0;
+  virtual size_t num_input_channels() const = 0;
+  virtual size_t num_proc_channels() const = 0;
+  virtual size_t num_output_channels() const = 0;
+  virtual size_t num_reverse_channels() const = 0;
+
+  // Set to true when the output of AudioProcessing will be muted or in some
+  // other way not used. Ideally, the captured audio would still be processed,
+  // but some components may change behavior based on this information.
+  // Default false. This method takes a lock. To achieve this in a lock-less
+  // manner the PostRuntimeSetting can instead be used.
+  virtual void set_output_will_be_muted(bool muted) = 0;
+
+  // Enqueues a runtime setting.
+  virtual void SetRuntimeSetting(RuntimeSetting setting) = 0;
+
+  // Enqueues a runtime setting. Returns a bool indicating whether the
+  // enqueueing was successfull.
+  virtual bool PostRuntimeSetting(RuntimeSetting setting) = 0;
+
+  // Accepts and produces a ~10 ms frame of interleaved 16 bit integer audio as
+  // specified in `input_config` and `output_config`. `src` and `dest` may use
+  // the same memory, if desired.
+  virtual int ProcessStream(const int16_t* const src,
+                            const StreamConfig& input_config,
+                            const StreamConfig& output_config,
+                            int16_t* const dest) = 0;
+
+  // Accepts deinterleaved float audio with the range [-1, 1]. Each element of
+  // `src` points to a channel buffer, arranged according to `input_stream`. At
+  // output, the channels will be arranged according to `output_stream` in
+  // `dest`.
+  //
+  // The output must have one channel or as many channels as the input. `src`
+  // and `dest` may use the same memory, if desired.
+  virtual int ProcessStream(const float* const* src,
+                            const StreamConfig& input_config,
+                            const StreamConfig& output_config,
+                            float* const* dest) = 0;
+
+  // Accepts and produces a ~10 ms frame of interleaved 16 bit integer audio for
+  // the reverse direction audio stream as specified in `input_config` and
+  // `output_config`. `src` and `dest` may use the same memory, if desired.
+  virtual int ProcessReverseStream(const int16_t* const src,
+                                   const StreamConfig& input_config,
+                                   const StreamConfig& output_config,
+                                   int16_t* const dest) = 0;
+
+  // Accepts deinterleaved float audio with the range [-1, 1]. Each element of
+  // `data` points to a channel buffer, arranged according to `reverse_config`.
+  virtual int ProcessReverseStream(const float* const* src,
+                                   const StreamConfig& input_config,
+                                   const StreamConfig& output_config,
+                                   float* const* dest) = 0;
+
+  // Accepts deinterleaved float audio with the range [-1, 1]. Each element
+  // of `data` points to a channel buffer, arranged according to
+  // `reverse_config`.
+  virtual int AnalyzeReverseStream(const float* const* data,
+                                   const StreamConfig& reverse_config) = 0;
+
+  // Returns the most recently produced ~10 ms of the linear AEC output at a
+  // rate of 16 kHz. If there is more than one capture channel, a mono
+  // representation of the input is returned. Returns true/false to indicate
+  // whether an output returned.
+  virtual bool GetLinearAecOutput(
+      rtc::ArrayView<std::array<float, 160>> linear_output) const = 0;
+
+  // This must be called prior to ProcessStream() if and only if adaptive analog
+  // gain control is enabled, to pass the current analog level from the audio
+  // HAL. Must be within the range [0, 255].
+  virtual void set_stream_analog_level(int level) = 0;
+
+  // When an analog mode is set, this should be called after
+  // `set_stream_analog_level()` and `ProcessStream()` to obtain the recommended
+  // new analog level for the audio HAL. It is the user's responsibility to
+  // apply this level.
+  virtual int recommended_stream_analog_level() const = 0;
+
+  // This must be called if and only if echo processing is enabled.
+  //
+  // Sets the `delay` in ms between ProcessReverseStream() receiving a far-end
+  // frame and ProcessStream() receiving a near-end frame containing the
+  // corresponding echo. On the client-side this can be expressed as
+  //   delay = (t_render - t_analyze) + (t_process - t_capture)
+  // where,
+  //   - t_analyze is the time a frame is passed to ProcessReverseStream() and
+  //     t_render is the time the first sample of the same frame is rendered by
+  //     the audio hardware.
+  //   - t_capture is the time the first sample of a frame is captured by the
+  //     audio hardware and t_process is the time the same frame is passed to
+  //     ProcessStream().
+  virtual int set_stream_delay_ms(int delay) = 0;
+  virtual int stream_delay_ms() const = 0;
+
+  // Call to signal that a key press occurred (true) or did not occur (false)
+  // with this chunk of audio.
+  virtual void set_stream_key_pressed(bool key_pressed) = 0;
+
+  // Creates and attaches an webrtc::AecDump for recording debugging
+  // information.
+  // The `worker_queue` may not be null and must outlive the created
+  // AecDump instance. |max_log_size_bytes == -1| means the log size
+  // will be unlimited. `handle` may not be null. The AecDump takes
+  // responsibility for `handle` and closes it in the destructor. A
+  // return value of true indicates that the file has been
+  // sucessfully opened, while a value of false indicates that
+  // opening the file failed.
+  virtual bool CreateAndAttachAecDump(
+      absl::string_view file_name,
+      int64_t max_log_size_bytes,
+      absl::Nonnull<TaskQueueBase*> worker_queue) = 0;
+  virtual bool CreateAndAttachAecDump(
+      absl::Nonnull<FILE*> handle,
+      int64_t max_log_size_bytes,
+      absl::Nonnull<TaskQueueBase*> worker_queue) = 0;
+
+  // TODO(webrtc:5298) Deprecated variant.
+  // Attaches provided webrtc::AecDump for recording debugging
+  // information. Log file and maximum file size logic is supposed to
+  // be handled by implementing instance of AecDump. Calling this
+  // method when another AecDump is attached resets the active AecDump
+  // with a new one. This causes the d-tor of the earlier AecDump to
+  // be called. The d-tor call may block until all pending logging
+  // tasks are completed.
+  virtual void AttachAecDump(std::unique_ptr<AecDump> aec_dump) = 0;
+
+  // If no AecDump is attached, this has no effect. If an AecDump is
+  // attached, it's destructor is called. The d-tor may block until
+  // all pending logging tasks are completed.
+  virtual void DetachAecDump() = 0;
+
+  // Get audio processing statistics.
+  virtual AudioProcessingStats GetStatistics() = 0;
+  // TODO(webrtc:5298) Deprecated variant. The `has_remote_tracks` argument
+  // should be set if there are active remote tracks (this would usually be true
+  // during a call). If there are no remote tracks some of the stats will not be
+  // set by AudioProcessing, because they only make sense if there is at least
+  // one remote track.
+  virtual AudioProcessingStats GetStatistics(bool has_remote_tracks) = 0;
+
+  // Returns the last applied configuration.
+  virtual AudioProcessing::Config GetConfig() const = 0;
+
+  enum Error {
+    // Fatal errors.
+    kNoError = 0,
+    kUnspecifiedError = -1,
+    kCreationFailedError = -2,
+    kUnsupportedComponentError = -3,
+    kUnsupportedFunctionError = -4,
+    kNullPointerError = -5,
+    kBadParameterError = -6,
+    kBadSampleRateError = -7,
+    kBadDataLengthError = -8,
+    kBadNumberChannelsError = -9,
+    kFileError = -10,
+    kStreamParameterNotSetError = -11,
+    kNotEnabledError = -12,
+
+    // Warnings are non-fatal.
+    // This results when a set_stream_ parameter is out of range. Processing
+    // will continue, but the parameter may have been truncated.
+    kBadStreamParameterWarning = -13
+  };
+
+  // Native rates supported by the integer interfaces.
+  enum NativeRate {
+    kSampleRate8kHz = 8000,
+    kSampleRate16kHz = 16000,
+    kSampleRate32kHz = 32000,
+    kSampleRate48kHz = 48000
+  };
+
+  // TODO(kwiberg): We currently need to support a compiler (Visual C++) that
+  // complains if we don't explicitly state the size of the array here. Remove
+  // the size when that's no longer the case.
+  static constexpr int kNativeSampleRatesHz[4] = {
+      kSampleRate8kHz, kSampleRate16kHz, kSampleRate32kHz, kSampleRate48kHz};
+  static constexpr size_t kNumNativeSampleRates =
+      arraysize(kNativeSampleRatesHz);
+  static constexpr int kMaxNativeSampleRateHz =
+      kNativeSampleRatesHz[kNumNativeSampleRates - 1];
+
+  // APM processes audio in chunks of about 10 ms. See GetFrameSize() for
+  // details.
+  static constexpr int kChunkSizeMs = 10;
+
+  // Returns floor(sample_rate_hz/100): the number of samples per channel used
+  // as input and output to the audio processing module in calls to
+  // ProcessStream, ProcessReverseStream, AnalyzeReverseStream, and
+  // GetLinearAecOutput.
+  //
+  // This is exactly 10 ms for sample rates divisible by 100. For example:
+  //  - 48000 Hz (480 samples per channel),
+  //  - 44100 Hz (441 samples per channel),
+  //  - 16000 Hz (160 samples per channel).
+  //
+  // Sample rates not divisible by 100 are received/produced in frames of
+  // approximately 10 ms. For example:
+  //  - 22050 Hz (220 samples per channel, or ~9.98 ms per frame),
+  //  - 11025 Hz (110 samples per channel, or ~9.98 ms per frame).
+  // These nondivisible sample rates yield lower audio quality compared to
+  // multiples of 100. Internal resampling to 10 ms frames causes a simulated
+  // clock drift effect which impacts the performance of (for example) echo
+  // cancellation.
+  static int GetFrameSize(int sample_rate_hz) { return sample_rate_hz / 100; }
+};
+
+class RTC_EXPORT AudioProcessingBuilder {
+ public:
+  AudioProcessingBuilder();
+  AudioProcessingBuilder(const AudioProcessingBuilder&) = delete;
+  AudioProcessingBuilder& operator=(const AudioProcessingBuilder&) = delete;
+  ~AudioProcessingBuilder();
+
+  // Sets the APM configuration.
+  AudioProcessingBuilder& SetConfig(const AudioProcessing::Config& config) {
+    config_ = config;
+    return *this;
+  }
+
+  // Sets the echo controller factory to inject when APM is created.
+  AudioProcessingBuilder& SetEchoControlFactory(
+      std::unique_ptr<EchoControlFactory> echo_control_factory) {
+    echo_control_factory_ = std::move(echo_control_factory);
+    return *this;
+  }
+
+  // Sets the capture post-processing sub-module to inject when APM is created.
+  AudioProcessingBuilder& SetCapturePostProcessing(
+      std::unique_ptr<CustomProcessing> capture_post_processing) {
+    capture_post_processing_ = std::move(capture_post_processing);
+    return *this;
+  }
+
+  // Sets the render pre-processing sub-module to inject when APM is created.
+  AudioProcessingBuilder& SetRenderPreProcessing(
+      std::unique_ptr<CustomProcessing> render_pre_processing) {
+    render_pre_processing_ = std::move(render_pre_processing);
+    return *this;
+  }
+
+  // Sets the echo detector to inject when APM is created.
+  AudioProcessingBuilder& SetEchoDetector(
+      rtc::scoped_refptr<EchoDetector> echo_detector) {
+    echo_detector_ = std::move(echo_detector);
+    return *this;
+  }
+
+  // Sets the capture analyzer sub-module to inject when APM is created.
+  AudioProcessingBuilder& SetCaptureAnalyzer(
+      std::unique_ptr<CustomAudioAnalyzer> capture_analyzer) {
+    capture_analyzer_ = std::move(capture_analyzer);
+    return *this;
+  }
+
+  // Creates an APM instance with the specified config or the default one if
+  // unspecified. Injects the specified components transferring the ownership
+  // to the newly created APM instance - i.e., except for the config, the
+  // builder is reset to its initial state.
+  rtc::scoped_refptr<AudioProcessing> Create();
+
+ private:
+  AudioProcessing::Config config_;
+  std::unique_ptr<EchoControlFactory> echo_control_factory_;
+  std::unique_ptr<CustomProcessing> capture_post_processing_;
+  std::unique_ptr<CustomProcessing> render_pre_processing_;
+  rtc::scoped_refptr<EchoDetector> echo_detector_;
+  std::unique_ptr<CustomAudioAnalyzer> capture_analyzer_;
+};
+
+class StreamConfig {
+ public:
+  // sample_rate_hz: The sampling rate of the stream.
+  // num_channels: The number of audio channels in the stream.
+  StreamConfig(int sample_rate_hz = 0,
+               size_t num_channels = 0)  // NOLINT(runtime/explicit)
+      : sample_rate_hz_(sample_rate_hz),
+        num_channels_(num_channels),
+        num_frames_(calculate_frames(sample_rate_hz)) {}
+
+  void set_sample_rate_hz(int value) {
+    sample_rate_hz_ = value;
+    num_frames_ = calculate_frames(value);
+  }
+  void set_num_channels(size_t value) { num_channels_ = value; }
+
+  int sample_rate_hz() const { return sample_rate_hz_; }
+
+  // The number of channels in the stream.
+  size_t num_channels() const { return num_channels_; }
+
+  size_t num_frames() const { return num_frames_; }
+  size_t num_samples() const { return num_channels_ * num_frames_; }
+
+  bool operator==(const StreamConfig& other) const {
+    return sample_rate_hz_ == other.sample_rate_hz_ &&
+           num_channels_ == other.num_channels_;
+  }
+
+  bool operator!=(const StreamConfig& other) const { return !(*this == other); }
+
+ private:
+  static size_t calculate_frames(int sample_rate_hz) {
+    return static_cast<size_t>(AudioProcessing::GetFrameSize(sample_rate_hz));
+  }
+
+  int sample_rate_hz_;
+  size_t num_channels_;
+  size_t num_frames_;
+};
+
+class ProcessingConfig {
+ public:
+  enum StreamName {
+    kInputStream,
+    kOutputStream,
+    kReverseInputStream,
+    kReverseOutputStream,
+    kNumStreamNames,
+  };
+
+  const StreamConfig& input_stream() const {
+    return streams[StreamName::kInputStream];
+  }
+  const StreamConfig& output_stream() const {
+    return streams[StreamName::kOutputStream];
+  }
+  const StreamConfig& reverse_input_stream() const {
+    return streams[StreamName::kReverseInputStream];
+  }
+  const StreamConfig& reverse_output_stream() const {
+    return streams[StreamName::kReverseOutputStream];
+  }
+
+  StreamConfig& input_stream() { return streams[StreamName::kInputStream]; }
+  StreamConfig& output_stream() { return streams[StreamName::kOutputStream]; }
+  StreamConfig& reverse_input_stream() {
+    return streams[StreamName::kReverseInputStream];
+  }
+  StreamConfig& reverse_output_stream() {
+    return streams[StreamName::kReverseOutputStream];
+  }
+
+  bool operator==(const ProcessingConfig& other) const {
+    for (int i = 0; i < StreamName::kNumStreamNames; ++i) {
+      if (this->streams[i] != other.streams[i]) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  bool operator!=(const ProcessingConfig& other) const {
+    return !(*this == other);
+  }
+
+  StreamConfig streams[StreamName::kNumStreamNames];
+};
+
+// Experimental interface for a custom analysis submodule.
+class CustomAudioAnalyzer {
+ public:
+  // (Re-) Initializes the submodule.
+  virtual void Initialize(int sample_rate_hz, int num_channels) = 0;
+  // Analyzes the given capture or render signal.
+  virtual void Analyze(const AudioBuffer* audio) = 0;
+  // Returns a string representation of the module state.
+  virtual std::string ToString() const = 0;
+
+  virtual ~CustomAudioAnalyzer() {}
+};
+
+// Interface for a custom processing submodule.
+class CustomProcessing {
+ public:
+  // (Re-)Initializes the submodule.
+  virtual void Initialize(int sample_rate_hz, int num_channels) = 0;
+  // Processes the given capture or render signal.
+  virtual void Process(AudioBuffer* audio) = 0;
+  // Returns a string representation of the module state.
+  virtual std::string ToString() const = 0;
+  // Handles RuntimeSettings. TODO(webrtc:9262): make pure virtual
+  // after updating dependencies.
+  virtual void SetRuntimeSetting(AudioProcessing::RuntimeSetting setting);
+
+  virtual ~CustomProcessing() {}
+};
+
+// Interface for an echo detector submodule.
+class EchoDetector : public RefCountInterface {
+ public:
+  // (Re-)Initializes the submodule.
+  virtual void Initialize(int capture_sample_rate_hz,
+                          int num_capture_channels,
+                          int render_sample_rate_hz,
+                          int num_render_channels) = 0;
+
+  // Analysis (not changing) of the first channel of the render signal.
+  virtual void AnalyzeRenderAudio(rtc::ArrayView<const float> render_audio) = 0;
+
+  // Analysis (not changing) of the capture signal.
+  virtual void AnalyzeCaptureAudio(
+      rtc::ArrayView<const float> capture_audio) = 0;
+
+  struct Metrics {
+    absl::optional<double> echo_likelihood;
+    absl::optional<double> echo_likelihood_recent_max;
+  };
+
+  // Collect current metrics from the echo detector.
+  virtual Metrics GetMetrics() const = 0;
+};
+
+}  // namespace webrtc
+
+#endif  // API_AUDIO_AUDIO_PROCESSING_H_
diff --git a/modules/audio_processing/include/audio_processing_statistics.cc b/api/audio/audio_processing_statistics.cc
similarity index 89%
rename from modules/audio_processing/include/audio_processing_statistics.cc
rename to api/audio/audio_processing_statistics.cc
index 7139ee5..90da7e8 100644
--- a/modules/audio_processing/include/audio_processing_statistics.cc
+++ b/api/audio/audio_processing_statistics.cc
@@ -8,7 +8,7 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#include "modules/audio_processing/include/audio_processing_statistics.h"
+#include "api/audio/audio_processing_statistics.h"
 
 namespace webrtc {
 
diff --git a/api/audio/audio_processing_statistics.h b/api/audio/audio_processing_statistics.h
new file mode 100644
index 0000000..6f77d07
--- /dev/null
+++ b/api/audio/audio_processing_statistics.h
@@ -0,0 +1,67 @@
+/*
+ *  Copyright 2017 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 API_AUDIO_AUDIO_PROCESSING_STATISTICS_H_
+#define API_AUDIO_AUDIO_PROCESSING_STATISTICS_H_
+
+#include <stdint.h>
+
+#include "absl/types/optional.h"
+#include "rtc_base/system/rtc_export.h"
+
+namespace webrtc {
+// This version of the stats uses Optionals, it will replace the regular
+// AudioProcessingStatistics struct.
+struct RTC_EXPORT AudioProcessingStats {
+  AudioProcessingStats();
+  AudioProcessingStats(const AudioProcessingStats& other);
+  ~AudioProcessingStats();
+
+  // Deprecated.
+  // TODO(bugs.webrtc.org/11226): Remove.
+  // True if voice is detected in the last capture frame, after processing.
+  // It is conservative in flagging audio as speech, with low likelihood of
+  // incorrectly flagging a frame as voice.
+  // Only reported if voice detection is enabled in AudioProcessing::Config.
+  absl::optional<bool> voice_detected;
+
+  // AEC Statistics.
+  // ERL = 10log_10(P_far / P_echo)
+  absl::optional<double> echo_return_loss;
+  // ERLE = 10log_10(P_echo / P_out)
+  absl::optional<double> echo_return_loss_enhancement;
+  // Fraction of time that the AEC linear filter is divergent, in a 1-second
+  // non-overlapped aggregation window.
+  absl::optional<double> divergent_filter_fraction;
+
+  // The delay metrics consists of the delay median and standard deviation. It
+  // also consists of the fraction of delay estimates that can make the echo
+  // cancellation perform poorly. The values are aggregated until the first
+  // call to `GetStatistics()` and afterwards aggregated and updated every
+  // second. Note that if there are several clients pulling metrics from
+  // `GetStatistics()` during a session the first call from any of them will
+  // change to one second aggregation window for all.
+  absl::optional<int32_t> delay_median_ms;
+  absl::optional<int32_t> delay_standard_deviation_ms;
+
+  // Residual echo detector likelihood.
+  absl::optional<double> residual_echo_likelihood;
+  // Maximum residual echo likelihood from the last time period.
+  absl::optional<double> residual_echo_likelihood_recent_max;
+
+  // The instantaneous delay estimate produced in the AEC. The unit is in
+  // milliseconds and the value is the instantaneous value at the time of the
+  // call to `GetStatistics()`.
+  absl::optional<int32_t> delay_ms;
+};
+
+}  // namespace webrtc
+
+#endif  // API_AUDIO_AUDIO_PROCESSING_STATISTICS_H_
diff --git a/api/audio/echo_detector_creator.h b/api/audio/echo_detector_creator.h
index 5ba171d..27dd58c 100644
--- a/api/audio/echo_detector_creator.h
+++ b/api/audio/echo_detector_creator.h
@@ -11,8 +11,8 @@
 #ifndef API_AUDIO_ECHO_DETECTOR_CREATOR_H_
 #define API_AUDIO_ECHO_DETECTOR_CREATOR_H_
 
+#include "api/audio/audio_processing.h"
 #include "api/scoped_refptr.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 
diff --git a/api/create_peerconnection_factory.cc b/api/create_peerconnection_factory.cc
index bd77f74..42bfa60 100644
--- a/api/create_peerconnection_factory.cc
+++ b/api/create_peerconnection_factory.cc
@@ -13,6 +13,7 @@
 #include <memory>
 #include <utility>
 
+#include "api/audio/audio_processing.h"
 #include "api/enable_media.h"
 #include "api/peer_connection_interface.h"
 #include "api/rtc_event_log/rtc_event_log_factory.h"
@@ -20,7 +21,6 @@
 #include "api/task_queue/default_task_queue_factory.h"
 #include "api/transport/field_trial_based_config.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "rtc_base/thread.h"
 
 namespace webrtc {
diff --git a/api/create_peerconnection_factory.h b/api/create_peerconnection_factory.h
index 6ca4cb0..adb4de9 100644
--- a/api/create_peerconnection_factory.h
+++ b/api/create_peerconnection_factory.h
@@ -14,6 +14,7 @@
 #include <memory>
 
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
 #include "api/field_trials_view.h"
@@ -34,7 +35,6 @@
 
 class AudioDeviceModule;
 class AudioFrameProcessor;
-class AudioProcessing;
 
 // Create a new instance of PeerConnectionFactoryInterface with optional video
 // codec factories. These video factories represents all video codecs, i.e. no
diff --git a/api/enable_media_with_defaults.cc b/api/enable_media_with_defaults.cc
index 81462f7..ace2247 100644
--- a/api/enable_media_with_defaults.cc
+++ b/api/enable_media_with_defaults.cc
@@ -10,13 +10,13 @@
 
 #include "api/enable_media_with_defaults.h"
 
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/enable_media.h"
 #include "api/task_queue/default_task_queue_factory.h"
 #include "api/video_codecs/builtin_video_decoder_factory.h"
 #include "api/video_codecs/builtin_video_encoder_factory.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 
diff --git a/api/media_stream_interface.h b/api/media_stream_interface.h
index 4f9bffa..d050fe7 100644
--- a/api/media_stream_interface.h
+++ b/api/media_stream_interface.h
@@ -22,6 +22,7 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing_statistics.h"
 #include "api/audio_options.h"
 #include "api/ref_count.h"
 #include "api/scoped_refptr.h"
@@ -30,7 +31,6 @@
 #include "api/video/video_sink_interface.h"
 #include "api/video/video_source_interface.h"
 #include "api/video_track_source_constraints.h"
-#include "modules/audio_processing/include/audio_processing_statistics.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
diff --git a/api/test/audioproc_float.h b/api/test/audioproc_float.h
index 1ef1c98..021bc73 100644
--- a/api/test/audioproc_float.h
+++ b/api/test/audioproc_float.h
@@ -14,7 +14,7 @@
 #include <memory>
 #include <vector>
 
-#include "modules/audio_processing/include/audio_processing.h"
+#include "api/audio/audio_processing.h"
 
 namespace webrtc {
 namespace test {
diff --git a/api/test/pclf/BUILD.gn b/api/test/pclf/BUILD.gn
index 68f1688..0dc8f570 100644
--- a/api/test/pclf/BUILD.gn
+++ b/api/test/pclf/BUILD.gn
@@ -32,7 +32,6 @@
     "../..:stats_observer_interface",
     "../..:track_id_stream_info_map",
     "../..:video_quality_analyzer_api",
-    "../../../modules/audio_processing:api",
     "../../../rtc_base:checks",
     "../../../rtc_base:network",
     "../../../rtc_base:rtc_certificate_generator",
@@ -43,6 +42,7 @@
     "../../../test:video_test_support",
     "../../../test/pc/e2e/analyzer/video:video_dumping",
     "../../audio:audio_mixer_api",
+    "../../audio:audio_processing",
     "../../rtc_event_log",
     "../../task_queue",
     "../../transport:network_control",
@@ -73,7 +73,6 @@
     "../../../api/rtc_event_log",
     "../../../api/transport:network_control",
     "../../../api/video_codecs:video_codecs_api",
-    "../../../modules/audio_processing:api",
     "../../../p2p:connection",
     "../../../p2p:port_allocator",
     "../../../p2p:rtc_p2p",
@@ -81,6 +80,7 @@
     "../../../rtc_base:rtc_certificate_generator",
     "../../../rtc_base:ssl",
     "../../../rtc_base:threading",
+    "../../audio:audio_processing",
   ]
 }
 
@@ -110,10 +110,10 @@
     "../../../api/transport:bitrate_settings",
     "../../../api/transport:network_control",
     "../../../api/video_codecs:video_codecs_api",
-    "../../../modules/audio_processing:api",
     "../../../rtc_base:checks",
     "../../../rtc_base:rtc_certificate_generator",
     "../../../rtc_base:ssl",
+    "../../audio:audio_processing",
   ]
   absl_deps = [
     "//third_party/abseil-cpp/absl/strings",
diff --git a/api/test/pclf/media_configuration.h b/api/test/pclf/media_configuration.h
index ad29e17..737e4b1 100644
--- a/api/test/pclf/media_configuration.h
+++ b/api/test/pclf/media_configuration.h
@@ -25,6 +25,7 @@
 #include "absl/types/optional.h"
 #include "api/array_view.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_options.h"
 #include "api/fec_controller.h"
 #include "api/function_view.h"
@@ -46,7 +47,6 @@
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder.h"
 #include "api/video_codecs/video_encoder_factory.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/network.h"
 #include "rtc_base/rtc_certificate_generator.h"
diff --git a/api/test/pclf/media_quality_test_params.h b/api/test/pclf/media_quality_test_params.h
index 8a3a13a..f1baf46 100644
--- a/api/test/pclf/media_quality_test_params.h
+++ b/api/test/pclf/media_quality_test_params.h
@@ -17,6 +17,7 @@
 
 #include "api/async_dns_resolver.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/fec_controller.h"
 #include "api/field_trials_view.h"
 #include "api/rtc_event_log/rtc_event_log_factory_interface.h"
@@ -24,7 +25,6 @@
 #include "api/transport/network_control.h"
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder_factory.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "p2p/base/port_allocator.h"
 #include "rtc_base/network.h"
 #include "rtc_base/rtc_certificate_generator.h"
diff --git a/api/test/pclf/peer_configurer.cc b/api/test/pclf/peer_configurer.cc
index ac0d028..765ec2d 100644
--- a/api/test/pclf/peer_configurer.cc
+++ b/api/test/pclf/peer_configurer.cc
@@ -20,6 +20,7 @@
 #include "absl/types/optional.h"
 #include "api/async_dns_resolver.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
 #include "api/fec_controller.h"
@@ -38,7 +39,6 @@
 #include "api/transport/network_control.h"
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder_factory.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/rtc_certificate_generator.h"
 #include "rtc_base/ssl_certificate.h"
diff --git a/api/test/pclf/peer_configurer.h b/api/test/pclf/peer_configurer.h
index 1c6fb4c..3c88d9b 100644
--- a/api/test/pclf/peer_configurer.h
+++ b/api/test/pclf/peer_configurer.h
@@ -19,6 +19,7 @@
 #include "absl/types/variant.h"
 #include "api/async_dns_resolver.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
 #include "api/fec_controller.h"
@@ -36,7 +37,6 @@
 #include "api/transport/network_control.h"
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder_factory.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "rtc_base/rtc_certificate_generator.h"
 #include "rtc_base/ssl_certificate.h"
 
diff --git a/api/test/peerconnection_quality_test_fixture.h b/api/test/peerconnection_quality_test_fixture.h
index 7e19eb1..0b1e69e 100644
--- a/api/test/peerconnection_quality_test_fixture.h
+++ b/api/test/peerconnection_quality_test_fixture.h
@@ -26,6 +26,7 @@
 #include "absl/types/optional.h"
 #include "api/array_view.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/fec_controller.h"
 #include "api/function_view.h"
 #include "api/media_stream_interface.h"
@@ -50,7 +51,6 @@
 #include "api/video_codecs/video_encoder.h"
 #include "api/video_codecs/video_encoder_factory.h"
 #include "media/base/media_constants.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/network.h"
 #include "rtc_base/rtc_certificate_generator.h"
diff --git a/api/voip/BUILD.gn b/api/voip/BUILD.gn
index 714490a..f175c30 100644
--- a/api/voip/BUILD.gn
+++ b/api/voip/BUILD.gn
@@ -41,8 +41,8 @@
     "..:scoped_refptr",
     "../../audio/voip:voip_core",
     "../../modules/audio_device:audio_device_api",
-    "../../modules/audio_processing:api",
     "../../rtc_base:logging",
+    "../audio:audio_processing",
     "../audio_codecs:audio_codecs_api",
     "../task_queue",
   ]
diff --git a/api/voip/voip_engine_factory.h b/api/voip/voip_engine_factory.h
index 62fe801..3abced7 100644
--- a/api/voip/voip_engine_factory.h
+++ b/api/voip/voip_engine_factory.h
@@ -13,13 +13,13 @@
 
 #include <memory>
 
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
 #include "api/scoped_refptr.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "api/voip/voip_engine.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 
diff --git a/audio/BUILD.gn b/audio/BUILD.gn
index 536e192..07a0006 100644
--- a/audio/BUILD.gn
+++ b/audio/BUILD.gn
@@ -52,6 +52,7 @@
     "../api/audio:audio_frame_api",
     "../api/audio:audio_frame_processor",
     "../api/audio:audio_mixer_api",
+    "../api/audio:audio_processing",
     "../api/audio_codecs:audio_codecs_api",
     "../api/crypto:frame_decryptor_interface",
     "../api/crypto:frame_encryptor_interface",
@@ -80,7 +81,6 @@
     "../modules/audio_coding:red",
     "../modules/audio_device",
     "../modules/audio_processing",
-    "../modules/audio_processing:api",
     "../modules/audio_processing:audio_frame_proxies",
     "../modules/audio_processing:rms_level",
     "../modules/pacing",
@@ -171,6 +171,7 @@
       "../api:mock_transformable_audio_frame",
       "../api:scoped_refptr",
       "../api/audio:audio_frame_api",
+      "../api/audio:audio_processing_statistics",
       "../api/audio_codecs:audio_codecs_api",
       "../api/audio_codecs:builtin_audio_encoder_factory",
       "../api/audio_codecs/opus:audio_decoder_opus",
@@ -195,7 +196,6 @@
       "../modules/audio_device:mock_audio_device",
       "../modules/audio_mixer:audio_mixer_impl",
       "../modules/audio_mixer:audio_mixer_test_utils",
-      "../modules/audio_processing:audio_processing_statistics",
       "../modules/audio_processing:mocks",
       "../modules/pacing",
       "../modules/rtp_rtcp:mock_rtp_rtcp",
diff --git a/audio/audio_send_stream.cc b/audio/audio_send_stream.cc
index 59b0ea5..27c733f 100644
--- a/audio/audio_send_stream.cc
+++ b/audio/audio_send_stream.cc
@@ -15,6 +15,7 @@
 #include <utility>
 #include <vector>
 
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
 #include "api/audio_codecs/audio_format.h"
@@ -34,7 +35,6 @@
 #include "media/base/media_channel.h"
 #include "modules/audio_coding/codecs/cng/audio_encoder_cng.h"
 #include "modules/audio_coding/codecs/red/audio_encoder_copy_red.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/rtp_rtcp/source/rtp_header_extensions.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
diff --git a/audio/audio_send_stream_unittest.cc b/audio/audio_send_stream_unittest.cc
index 60d87eb..d71776e 100644
--- a/audio/audio_send_stream_unittest.cc
+++ b/audio/audio_send_stream_unittest.cc
@@ -16,6 +16,7 @@
 #include <utility>
 #include <vector>
 
+#include "api/audio/audio_processing_statistics.h"
 #include "api/task_queue/default_task_queue_factory.h"
 #include "api/test/mock_frame_encryptor.h"
 #include "audio/audio_state.h"
@@ -27,7 +28,6 @@
 #include "modules/audio_device/include/mock_audio_device.h"
 #include "modules/audio_mixer/audio_mixer_impl.h"
 #include "modules/audio_mixer/sine_wave_generator.h"
-#include "modules/audio_processing/include/audio_processing_statistics.h"
 #include "modules/audio_processing/include/mock_audio_processing.h"
 #include "modules/rtp_rtcp/mocks/mock_network_link_rtcp_observer.h"
 #include "modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
diff --git a/audio/audio_transport_impl.h b/audio/audio_transport_impl.h
index 24b09d2..d7a4b7d 100644
--- a/audio/audio_transport_impl.h
+++ b/audio/audio_transport_impl.h
@@ -15,11 +15,11 @@
 #include <vector>
 
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/scoped_refptr.h"
 #include "common_audio/resampler/include/push_resampler.h"
 #include "modules/async_audio_processing/async_audio_processing.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "rtc_base/synchronization/mutex.h"
 #include "rtc_base/thread_annotations.h"
 
diff --git a/audio/voip/BUILD.gn b/audio/voip/BUILD.gn
index 75f20a6..2b07179 100644
--- a/audio/voip/BUILD.gn
+++ b/audio/voip/BUILD.gn
@@ -17,12 +17,12 @@
     ":audio_channel",
     "..:audio",
     "../../api:scoped_refptr",
+    "../../api/audio:audio_processing",
     "../../api/audio_codecs:audio_codecs_api",
     "../../api/task_queue",
     "../../api/voip:voip_api",
     "../../modules/audio_device:audio_device_api",
     "../../modules/audio_mixer:audio_mixer_impl",
-    "../../modules/audio_processing:api",
     "../../rtc_base:criticalsection",
     "../../rtc_base:logging",
     "../../rtc_base/synchronization:mutex",
diff --git a/audio/voip/voip_core.h b/audio/voip/voip_core.h
index 6c3aec6..2c7c7ee 100644
--- a/audio/voip/voip_core.h
+++ b/audio/voip/voip_core.h
@@ -17,6 +17,7 @@
 #include <unordered_map>
 #include <vector>
 
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
 #include "api/scoped_refptr.h"
@@ -32,7 +33,6 @@
 #include "audio/voip/audio_channel.h"
 #include "modules/audio_device/include/audio_device.h"
 #include "modules/audio_mixer/audio_mixer_impl.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "rtc_base/synchronization/mutex.h"
 
 namespace webrtc {
diff --git a/call/BUILD.gn b/call/BUILD.gn
index c472fa0..43e32a3 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -52,6 +52,8 @@
     "../api/adaptation:resource_adaptation_api",
     "../api/audio:audio_frame_processor",
     "../api/audio:audio_mixer_api",
+    "../api/audio:audio_processing",
+    "../api/audio:audio_processing_statistics",
     "../api/audio_codecs:audio_codecs_api",
     "../api/crypto:frame_encryptor_interface",
     "../api/crypto:options",
@@ -64,8 +66,6 @@
     "../modules/async_audio_processing",
     "../modules/audio_device",
     "../modules/audio_processing",
-    "../modules/audio_processing:api",
-    "../modules/audio_processing:audio_processing_statistics",
     "../modules/rtp_rtcp",
     "../modules/rtp_rtcp:rtp_rtcp_format",
     "../rtc_base:audio_format_to_string",
diff --git a/call/audio_send_stream.h b/call/audio_send_stream.h
index 9c2fad6..798b1cd 100644
--- a/call/audio_send_stream.h
+++ b/call/audio_send_stream.h
@@ -16,6 +16,7 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing_statistics.h"
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
@@ -29,7 +30,6 @@
 #include "api/scoped_refptr.h"
 #include "call/audio_sender.h"
 #include "call/rtp_config.h"
-#include "modules/audio_processing/include/audio_processing_statistics.h"
 #include "modules/rtp_rtcp/include/report_block_data.h"
 
 namespace webrtc {
diff --git a/call/audio_state.h b/call/audio_state.h
index 79fb5cf..8f6bc7d 100644
--- a/call/audio_state.h
+++ b/call/audio_state.h
@@ -11,10 +11,10 @@
 #define CALL_AUDIO_STATE_H_
 
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/scoped_refptr.h"
 #include "modules/async_audio_processing/async_audio_processing.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "rtc_base/ref_count.h"
 
 namespace webrtc {
diff --git a/examples/BUILD.gn b/examples/BUILD.gn
index 026c974..c66f282 100644
--- a/examples/BUILD.gn
+++ b/examples/BUILD.gn
@@ -489,12 +489,12 @@
         "../api:libjingle_peerconnection_api",
         "../api:scoped_refptr",
         "../api:sequence_checker",
+        "../api/audio:audio_processing",
         "../api/audio_codecs:builtin_audio_decoder_factory",
         "../api/audio_codecs:builtin_audio_encoder_factory",
         "../api/rtc_event_log:rtc_event_log_factory",
         "../api/task_queue:default_task_queue_factory",
         "../modules/audio_processing",
-        "../modules/audio_processing:api",
         "../pc:libjingle_peerconnection",
         "../rtc_base/synchronization:mutex",
         "../sdk:base_objc",
@@ -690,6 +690,7 @@
       "../api:rtp_sender_interface",
       "../api:scoped_refptr",
       "../api/audio:audio_mixer_api",
+      "../api/audio:audio_processing",
       "../api/audio_codecs:audio_codecs_api",
       "../api/task_queue:pending_task_safety_flag",
       "../api/units:time_delta",
@@ -768,7 +769,6 @@
       "../media:rtc_audio_video",
       "../modules/audio_device",
       "../modules/audio_processing",
-      "../modules/audio_processing:api",
       "../modules/video_capture:video_capture_module",
       "../pc:libjingle_peerconnection",
       "../rtc_base:rtc_json",
diff --git a/examples/objcnativeapi/objc/objc_call_client.mm b/examples/objcnativeapi/objc/objc_call_client.mm
index 2601bee..a794f96 100644
--- a/examples/objcnativeapi/objc/objc_call_client.mm
+++ b/examples/objcnativeapi/objc/objc_call_client.mm
@@ -18,13 +18,13 @@
 #import "sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h"
 #import "sdk/objc/helpers/RTCCameraPreviewView.h"
 
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/enable_media.h"
 #include "api/peer_connection_interface.h"
 #include "api/rtc_event_log/rtc_event_log_factory.h"
 #include "api/task_queue/default_task_queue_factory.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "sdk/objc/native/api/video_capturer.h"
 #include "sdk/objc/native/api/video_decoder_factory.h"
 #include "sdk/objc/native/api/video_encoder_factory.h"
diff --git a/examples/peerconnection/client/conductor.cc b/examples/peerconnection/client/conductor.cc
index f94a981..1dd9dcd 100644
--- a/examples/peerconnection/client/conductor.cc
+++ b/examples/peerconnection/client/conductor.cc
@@ -20,6 +20,7 @@
 #include "absl/memory/memory.h"
 #include "absl/types/optional.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
@@ -41,7 +42,6 @@
 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h"
 #include "examples/peerconnection/client/defaults.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/video_capture/video_capture.h"
 #include "modules/video_capture/video_capture_factory.h"
 #include "p2p/base/port_allocator.h"
diff --git a/media/BUILD.gn b/media/BUILD.gn
index 6568944..6a13f78 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -106,7 +106,6 @@
     "../common_video",
     "../modules/async_audio_processing",
     "../modules/audio_device",
-    "../modules/audio_processing:audio_processing_statistics",
     "../modules/rtp_rtcp:rtp_rtcp_format",
     "../rtc_base:async_packet_socket",
     "../rtc_base:buffer",
@@ -329,6 +328,7 @@
     "../api:rtp_parameters",
     "../api:rtp_sender_interface",
     "../api:scoped_refptr",
+    "../api/audio:audio_processing_statistics",
     "../api/audio_codecs:audio_codecs_api",
     "../api/crypto:frame_decryptor_interface",
     "../api/crypto:frame_encryptor_interface",
@@ -344,7 +344,6 @@
     "../api/video_codecs:video_codecs_api",
     "../call:video_stream_api",
     "../common_video",
-    "../modules/audio_processing:audio_processing_statistics",
     "../modules/rtp_rtcp:rtp_rtcp_format",
     "../rtc_base:async_packet_socket",
     "../rtc_base:buffer",
@@ -581,6 +580,8 @@
     "../api/audio:audio_frame_api",
     "../api/audio:audio_frame_processor",
     "../api/audio:audio_mixer_api",
+    "../api/audio:audio_processing",
+    "../api/audio:audio_processing_statistics",
     "../api/audio_codecs:audio_codecs_api",
     "../api/crypto:frame_decryptor_interface",
     "../api/crypto:frame_encryptor_interface",
@@ -615,8 +616,6 @@
     "../modules/audio_device",
     "../modules/audio_device:audio_device_impl",
     "../modules/audio_mixer:audio_mixer_impl",
-    "../modules/audio_processing:api",
-    "../modules/audio_processing:audio_processing_statistics",
     "../modules/audio_processing/aec_dump",
     "../modules/audio_processing/agc:gain_control_interface",
     "../modules/rtp_rtcp",
@@ -807,6 +806,7 @@
       "../api:fec_controller_api",
       "../api:rtp_parameters",
       "../api:scoped_refptr",
+      "../api/audio:audio_processing",
       "../api/environment",
       "../api/task_queue",
       "../api/task_queue:pending_task_safety_flag",
@@ -821,7 +821,6 @@
       "../call:video_stream_api",
       "../common_video",
       "../modules/audio_processing",
-      "../modules/audio_processing:api",
       "../modules/rtp_rtcp:rtp_rtcp_format",
       "../modules/video_coding:video_codec_interface",
       "../modules/video_coding:video_coding_utility",
@@ -955,7 +954,6 @@
         "../modules/audio_device:mock_audio_device",
         "../modules/audio_mixer:audio_mixer_impl",
         "../modules/audio_processing",
-        "../modules/audio_processing:api",
         "../modules/audio_processing:mocks",
         "../modules/rtp_rtcp",
         "../modules/rtp_rtcp:rtp_rtcp_format",
diff --git a/media/base/fake_media_engine.h b/media/base/fake_media_engine.h
index eddc760..6453890 100644
--- a/media/base/fake_media_engine.h
+++ b/media/base/fake_media_engine.h
@@ -23,6 +23,7 @@
 
 #include "absl/algorithm/container.h"
 #include "absl/functional/any_invocable.h"
+#include "api/audio/audio_processing.h"
 #include "api/call/audio_sink.h"
 #include "api/media_types.h"
 #include "media/base/audio_source.h"
@@ -32,7 +33,6 @@
 #include "media/base/rtp_utils.h"
 #include "media/base/stream_params.h"
 #include "media/engine/webrtc_video_engine.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
 #include "rtc_base/copy_on_write_buffer.h"
 #include "rtc_base/network_route.h"
diff --git a/media/base/media_channel.h b/media/base/media_channel.h
index 124f68c..3721e5f 100644
--- a/media/base/media_channel.h
+++ b/media/base/media_channel.h
@@ -19,6 +19,7 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing_statistics.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_options.h"
 #include "api/call/audio_sink.h"
@@ -45,7 +46,6 @@
 #include "media/base/codec.h"
 #include "media/base/media_constants.h"
 #include "media/base/stream_params.h"
-#include "modules/audio_processing/include/audio_processing_statistics.h"
 #include "modules/rtp_rtcp/include/report_block_data.h"
 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
 #include "rtc_base/async_packet_socket.h"
diff --git a/media/base/media_engine.h b/media/base/media_engine.h
index b054893..8d5b01c 100644
--- a/media/base/media_engine.h
+++ b/media/base/media_engine.h
@@ -32,7 +32,6 @@
 namespace webrtc {
 class AudioDeviceModule;
 class AudioMixer;
-class AudioProcessing;
 class Call;
 }  // namespace webrtc
 
diff --git a/media/engine/webrtc_voice_engine.cc b/media/engine/webrtc_voice_engine.cc
index 23a1b19..704544c 100644
--- a/media/engine/webrtc_voice_engine.cc
+++ b/media/engine/webrtc_voice_engine.cc
@@ -29,6 +29,8 @@
 #include "absl/types/optional.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio/audio_frame_processor.h"
+#include "api/audio/audio_processing.h"
+#include "api/audio/audio_processing_statistics.h"
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/call/audio_sink.h"
@@ -57,8 +59,6 @@
 #include "media/engine/webrtc_media_engine.h"
 #include "modules/async_audio_processing/async_audio_processing.h"
 #include "modules/audio_mixer/audio_mixer_impl.h"
-#include "modules/audio_processing/include/audio_processing.h"
-#include "modules/audio_processing/include/audio_processing_statistics.h"
 #include "modules/rtp_rtcp/include/report_block_data.h"
 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
diff --git a/media/engine/webrtc_voice_engine.h b/media/engine/webrtc_voice_engine.h
index b28b965..d668287 100644
--- a/media/engine/webrtc_voice_engine.h
+++ b/media/engine/webrtc_voice_engine.h
@@ -26,6 +26,7 @@
 #include "absl/types/optional.h"
 #include "api/audio/audio_frame_processor.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
@@ -59,7 +60,6 @@
 #include "media/base/stream_params.h"
 #include "modules/async_audio_processing/async_audio_processing.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
 #include "rtc_base/buffer.h"
diff --git a/modules/audio_mixer/BUILD.gn b/modules/audio_mixer/BUILD.gn
index fb038bf..d97d180 100644
--- a/modules/audio_mixer/BUILD.gn
+++ b/modules/audio_mixer/BUILD.gn
@@ -43,6 +43,8 @@
     "../../api:scoped_refptr",
     "../../api/audio:audio_frame_api",
     "../../api/audio:audio_mixer_api",
+    "../../api/audio:audio_processing",
+    "../../api/audio:audio_processing",
     "../../audio/utility:audio_frame_operations",
     "../../common_audio",
     "../../rtc_base:checks",
@@ -55,7 +57,6 @@
     "../../rtc_base/synchronization:mutex",
     "../../system_wrappers",
     "../../system_wrappers:metrics",
-    "../audio_processing:api",
     "../audio_processing:apm_logging",
     "../audio_processing:audio_frame_view",
     "../audio_processing/agc2:fixed_digital",
diff --git a/modules/audio_mixer/default_output_rate_calculator.cc b/modules/audio_mixer/default_output_rate_calculator.cc
index 5f24b65..e0e7417 100644
--- a/modules/audio_mixer/default_output_rate_calculator.cc
+++ b/modules/audio_mixer/default_output_rate_calculator.cc
@@ -13,7 +13,7 @@
 #include <algorithm>
 #include <iterator>
 
-#include "modules/audio_processing/include/audio_processing.h"
+#include "api/audio/audio_processing.h"
 #include "rtc_base/checks.h"
 
 namespace webrtc {
diff --git a/modules/audio_mixer/frame_combiner.cc b/modules/audio_mixer/frame_combiner.cc
index 96c62f6..96d1d86 100644
--- a/modules/audio_mixer/frame_combiner.cc
+++ b/modules/audio_mixer/frame_combiner.cc
@@ -20,13 +20,13 @@
 #include <vector>
 
 #include "api/array_view.h"
+#include "api/audio/audio_processing.h"
 #include "api/rtp_packet_info.h"
 #include "api/rtp_packet_infos.h"
 #include "common_audio/include/audio_util.h"
 #include "modules/audio_mixer/audio_frame_manipulator.h"
 #include "modules/audio_mixer/audio_mixer_impl.h"
 #include "modules/audio_processing/include/audio_frame_view.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 #include "rtc_base/arraysize.h"
 #include "rtc_base/checks.h"
diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn
index ba9ec95..0bfee01 100644
--- a/modules/audio_processing/BUILD.gn
+++ b/modules/audio_processing/BUILD.gn
@@ -21,33 +21,8 @@
 
 rtc_library("api") {
   visibility = [ "*" ]
-  sources = [
-    "include/audio_processing.cc",
-    "include/audio_processing.h",
-  ]
-  deps = [
-    ":audio_frame_view",
-    ":audio_processing_statistics",
-    "../../api:array_view",
-    "../../api:ref_count",
-    "../../api:scoped_refptr",
-    "../../api/audio:aec3_config",
-    "../../api/audio:audio_frame_api",
-    "../../api/audio:echo_control",
-    "../../api/task_queue",
-    "../../rtc_base:macromagic",
-    "../../rtc_base:refcount",
-    "../../rtc_base:stringutils",
-    "../../rtc_base/system:arch",
-    "../../rtc_base/system:file_wrapper",
-    "../../rtc_base/system:rtc_export",
-    "agc:gain_control_interface",
-  ]
-  absl_deps = [
-    "//third_party/abseil-cpp/absl/base:nullability",
-    "//third_party/abseil-cpp/absl/strings",
-    "//third_party/abseil-cpp/absl/types:optional",
-  ]
+  sources = [ "include/audio_processing.h" ]
+  deps = [ "../../api/audio:audio_processing" ]
 }
 
 rtc_library("audio_frame_proxies") {
@@ -57,9 +32,9 @@
     "include/audio_frame_proxies.h",
   ]
   deps = [
-    ":api",
     ":audio_frame_view",
     "../../api/audio:audio_frame_api",
+    "../../api/audio:audio_processing",
   ]
 }
 
@@ -80,8 +55,8 @@
   defines = []
 
   deps = [
-    ":api",
     "../../api:array_view",
+    "../../api/audio:audio_processing",
     "../../common_audio",
     "../../common_audio:common_audio_c",
     "../../rtc_base:checks",
@@ -114,8 +89,8 @@
   ]
 
   deps = [
-    ":api",
     ":audio_frame_view",
+    "../../api/audio:audio_processing",
   ]
   absl_deps = [
     "//third_party/abseil-cpp/absl/base:core_headers",
@@ -132,10 +107,10 @@
   defines = []
   deps = [
     ":aec_dump_interface",
-    ":api",
     ":apm_logging",
     ":audio_buffer",
     ":audio_frame_view",
+    "../../api/audio:audio_processing",
     "../../common_audio",
     "../../rtc_base:checks",
     "../../rtc_base:logging",
@@ -171,12 +146,10 @@
   defines = []
   deps = [
     ":aec_dump_interface",
-    ":api",
     ":apm_logging",
     ":audio_buffer",
     ":audio_frame_proxies",
     ":audio_frame_view",
-    ":audio_processing_statistics",
     ":gain_controller2",
     ":high_pass_filter",
     ":optionally_built_submodule_creators",
@@ -186,6 +159,8 @@
     "../../api:make_ref_counted",
     "../../api/audio:aec3_config",
     "../../api/audio:audio_frame_api",
+    "../../api/audio:audio_processing",
+    "../../api/audio:audio_processing_statistics",
     "../../api/audio:echo_control",
     "../../api/task_queue",
     "../../audio/utility:audio_frame_operations",
@@ -255,9 +230,9 @@
     "residual_echo_detector.h",
   ]
   deps = [
-    ":api",
     ":apm_logging",
     "../../api:array_view",
+    "../../api/audio:audio_processing",
     "../../rtc_base:checks",
     "../../rtc_base:logging",
     "../../system_wrappers:metrics",
@@ -291,12 +266,8 @@
 
 rtc_library("audio_processing_statistics") {
   visibility = [ "*" ]
-  sources = [
-    "include/audio_processing_statistics.cc",
-    "include/audio_processing_statistics.h",
-  ]
-  deps = [ "../../rtc_base/system:rtc_export" ]
-  absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
+  sources = [ "include/audio_processing_statistics.h" ]
+  deps = [ "../../api/audio:audio_processing_statistics" ]
 }
 
 rtc_source_set("audio_frame_view") {
@@ -337,10 +308,10 @@
     sources = [ "include/mock_audio_processing.h" ]
     deps = [
       ":aec_dump_interface",
-      ":api",
       ":audio_buffer",
       ":audio_processing",
-      ":audio_processing_statistics",
+      "../../api/audio:audio_processing",
+      "../../api/audio:audio_processing_statistics",
       "../../api/task_queue",
       "../../test:test_support",
     ]
@@ -386,7 +357,6 @@
       deps = [
         ":aec3_config_json",
         ":analog_mic_simulation",
-        ":api",
         ":apm_logging",
         ":audio_buffer",
         ":audio_frame_view",
@@ -400,6 +370,7 @@
         "../../api:scoped_refptr",
         "../../api/audio:aec3_config",
         "../../api/audio:aec3_factory",
+        "../../api/audio:audio_processing",
         "../../api/audio:echo_detector_creator",
         "../../common_audio",
         "../../common_audio:common_audio_c",
@@ -568,7 +539,6 @@
       deps = [
         ":aec3_config_json",
         ":analog_mic_simulation",
-        ":api",
         ":apm_logging",
         ":audio_processing",
         ":audioproc_debug_proto",
@@ -576,6 +546,7 @@
         ":audioproc_test_utils",
         ":runtime_settings_protobuf_utils",
         "../../api/audio:aec3_factory",
+        "../../api/audio:audio_processing",
         "../../api/audio:echo_detector_creator",
         "../../common_audio",
         "../../rtc_base:checks",
@@ -631,9 +602,9 @@
       ]
 
       deps = [
-        ":api",
         ":audioproc_debug_proto",
         ":audioproc_protobuf_utils",
+        "../../api/audio:audio_processing",
         "../../rtc_base:checks",
       ]
     }
@@ -661,11 +632,11 @@
   configs += [ ":apm_debug_dump" ]
 
   deps = [
-    ":api",
     ":audio_buffer",
     ":audio_processing",
     "../../api:array_view",
     "../../api/audio:audio_frame_api",
+    "../../api/audio:audio_processing",
     "../../common_audio",
     "../../rtc_base:checks",
     "../../rtc_base:random",
diff --git a/modules/audio_processing/aec_dump/BUILD.gn b/modules/audio_processing/aec_dump/BUILD.gn
index 5193e28..2757a28 100644
--- a/modules/audio_processing/aec_dump/BUILD.gn
+++ b/modules/audio_processing/aec_dump/BUILD.gn
@@ -47,9 +47,9 @@
 
     deps = [
       ":mock_aec_dump",
-      "..:api",
       "..:audioproc_test_utils",
       "../",
+      "../../../api/audio:audio_processing",
       "//testing/gtest",
     ]
   }
diff --git a/modules/audio_processing/aec_dump/aec_dump_integration_test.cc b/modules/audio_processing/aec_dump/aec_dump_integration_test.cc
index 503135d..067e373 100644
--- a/modules/audio_processing/aec_dump/aec_dump_integration_test.cc
+++ b/modules/audio_processing/aec_dump/aec_dump_integration_test.cc
@@ -12,9 +12,9 @@
 #include <memory>
 #include <utility>
 
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/aec_dump/mock_aec_dump.h"
 #include "modules/audio_processing/audio_processing_impl.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/test/audio_processing_builder_for_testing.h"
 
 using ::testing::_;
diff --git a/modules/audio_processing/agc/BUILD.gn b/modules/audio_processing/agc/BUILD.gn
index 508f901..2831282 100644
--- a/modules/audio_processing/agc/BUILD.gn
+++ b/modules/audio_processing/agc/BUILD.gn
@@ -21,11 +21,11 @@
   deps = [
     ":gain_control_interface",
     ":level_estimation",
-    "..:api",
     "..:apm_logging",
     "..:audio_buffer",
     "..:audio_frame_view",
     "../../../api:array_view",
+    "../../../api/audio:audio_processing",
     "../../../common_audio",
     "../../../common_audio:common_audio_c",
     "../../../rtc_base:checks",
diff --git a/modules/audio_processing/agc/agc_manager_direct.h b/modules/audio_processing/agc/agc_manager_direct.h
index adb2f5a..62b0e0e 100644
--- a/modules/audio_processing/agc/agc_manager_direct.h
+++ b/modules/audio_processing/agc/agc_manager_direct.h
@@ -16,10 +16,10 @@
 
 #include "absl/types/optional.h"
 #include "api/array_view.h"
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/agc/agc.h"
 #include "modules/audio_processing/agc2/clipping_predictor.h"
 #include "modules/audio_processing/audio_buffer.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 #include "rtc_base/gtest_prod_util.h"
 
diff --git a/modules/audio_processing/agc2/BUILD.gn b/modules/audio_processing/agc2/BUILD.gn
index bd59ad3..5cc3db0 100644
--- a/modules/audio_processing/agc2/BUILD.gn
+++ b/modules/audio_processing/agc2/BUILD.gn
@@ -23,9 +23,9 @@
 
   deps = [
     ":common",
-    "..:api",
     "..:apm_logging",
     "../../../api:array_view",
+    "../../../api/audio:audio_processing",
     "../../../rtc_base:checks",
     "../../../rtc_base:logging",
     "../../../rtc_base:safe_minmax",
@@ -48,9 +48,9 @@
   deps = [
     ":common",
     ":gain_applier",
-    "..:api",
     "..:apm_logging",
     "..:audio_frame_view",
+    "../../../api/audio:audio_processing",
     "../../../common_audio",
     "../../../rtc_base:checks",
     "../../../rtc_base:logging",
@@ -112,8 +112,8 @@
 
   deps = [
     ":gain_map",
-    "..:api",
     "..:audio_frame_view",
+    "../../../api/audio:audio_processing",
     "../../../common_audio",
     "../../../rtc_base:checks",
     "../../../rtc_base:logging",
@@ -209,10 +209,10 @@
     ":clipping_predictor",
     ":gain_map",
     ":input_volume_stats_reporter",
-    "..:api",
     "..:audio_buffer",
     "..:audio_frame_view",
     "../../../api:array_view",
+    "../../../api/audio:audio_processing",
     "../../../rtc_base:checks",
     "../../../rtc_base:checks",
     "../../../rtc_base:gtest_prod",
@@ -303,8 +303,8 @@
   deps = [
     ":common",
     ":speech_level_estimator",
-    "..:api",
     "..:apm_logging",
+    "../../../api/audio:audio_processing",
     "../../../rtc_base:gunit_helpers",
     "../../../test:test_support",
   ]
@@ -320,9 +320,9 @@
     ":adaptive_digital_gain_controller",
     ":common",
     ":test_utils",
-    "..:api",
     "..:apm_logging",
     "..:audio_frame_view",
+    "../../../api/audio:audio_processing",
     "../../../common_audio",
     "../../../rtc_base:gunit_helpers",
     "../../../test:test_support",
@@ -413,7 +413,6 @@
     ":clipping_predictor",
     ":gain_map",
     ":input_volume_controller",
-    "..:api",
     "../../../api:array_view",
     "../../../rtc_base:checks",
     "../../../rtc_base:random",
diff --git a/modules/audio_processing/agc2/adaptive_digital_gain_controller.h b/modules/audio_processing/agc2/adaptive_digital_gain_controller.h
index 01335e7..9ae74a2 100644
--- a/modules/audio_processing/agc2/adaptive_digital_gain_controller.h
+++ b/modules/audio_processing/agc2/adaptive_digital_gain_controller.h
@@ -13,9 +13,9 @@
 
 #include <vector>
 
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/agc2/gain_applier.h"
 #include "modules/audio_processing/include/audio_frame_view.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 
diff --git a/modules/audio_processing/agc2/adaptive_digital_gain_controller_unittest.cc b/modules/audio_processing/agc2/adaptive_digital_gain_controller_unittest.cc
index cff9b4e..88fb792 100644
--- a/modules/audio_processing/agc2/adaptive_digital_gain_controller_unittest.cc
+++ b/modules/audio_processing/agc2/adaptive_digital_gain_controller_unittest.cc
@@ -13,10 +13,10 @@
 #include <algorithm>
 #include <memory>
 
+#include "api/audio/audio_processing.h"
 #include "common_audio/include/audio_util.h"
 #include "modules/audio_processing/agc2/agc2_common.h"
 #include "modules/audio_processing/agc2/vector_float_frame.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 #include "rtc_base/gunit.h"
 
diff --git a/modules/audio_processing/agc2/clipping_predictor.h b/modules/audio_processing/agc2/clipping_predictor.h
index 1461250..5332719 100644
--- a/modules/audio_processing/agc2/clipping_predictor.h
+++ b/modules/audio_processing/agc2/clipping_predictor.h
@@ -15,8 +15,8 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/include/audio_frame_view.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 
diff --git a/modules/audio_processing/agc2/input_volume_controller.h b/modules/audio_processing/agc2/input_volume_controller.h
index 0bec7af..b61f68f 100644
--- a/modules/audio_processing/agc2/input_volume_controller.h
+++ b/modules/audio_processing/agc2/input_volume_controller.h
@@ -16,9 +16,9 @@
 
 #include "absl/types/optional.h"
 #include "api/array_view.h"
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/agc2/clipping_predictor.h"
 #include "modules/audio_processing/audio_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/agc2/speech_level_estimator.h b/modules/audio_processing/agc2/speech_level_estimator.h
index 4d9f106..adbf84c 100644
--- a/modules/audio_processing/agc2/speech_level_estimator.h
+++ b/modules/audio_processing/agc2/speech_level_estimator.h
@@ -15,8 +15,8 @@
 
 #include <type_traits>
 
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/agc2/agc2_common.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 class ApmDataDumper;
diff --git a/modules/audio_processing/agc2/speech_level_estimator_unittest.cc b/modules/audio_processing/agc2/speech_level_estimator_unittest.cc
index 2e627a4..939b114 100644
--- a/modules/audio_processing/agc2/speech_level_estimator_unittest.cc
+++ b/modules/audio_processing/agc2/speech_level_estimator_unittest.cc
@@ -12,8 +12,8 @@
 
 #include <memory>
 
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/agc2/agc2_common.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 #include "rtc_base/gunit.h"
 
diff --git a/modules/audio_processing/audio_buffer.h b/modules/audio_processing/audio_buffer.h
index b9ea300..fd69f74 100644
--- a/modules/audio_processing/audio_buffer.h
+++ b/modules/audio_processing/audio_buffer.h
@@ -17,8 +17,8 @@
 #include <memory>
 #include <vector>
 
+#include "api/audio/audio_processing.h"
 #include "common_audio/channel_buffer.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 
diff --git a/modules/audio_processing/audio_processing_builder_impl.cc b/modules/audio_processing/audio_processing_builder_impl.cc
index a246448..d02ac82 100644
--- a/modules/audio_processing/audio_processing_builder_impl.cc
+++ b/modules/audio_processing/audio_processing_builder_impl.cc
@@ -10,9 +10,9 @@
 
 #include <memory>
 
+#include "api/audio/audio_processing.h"
 #include "api/make_ref_counted.h"
 #include "modules/audio_processing/audio_processing_impl.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 
diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h
index 2c0ab19..51b9ffd 100644
--- a/modules/audio_processing/audio_processing_impl.h
+++ b/modules/audio_processing/audio_processing_impl.h
@@ -23,6 +23,8 @@
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
 #include "api/array_view.h"
+#include "api/audio/audio_processing.h"
+#include "api/audio/audio_processing_statistics.h"
 #include "api/function_view.h"
 #include "api/task_queue/task_queue_base.h"
 #include "modules/audio_processing/aec3/echo_canceller3.h"
@@ -37,8 +39,6 @@
 #include "modules/audio_processing/high_pass_filter.h"
 #include "modules/audio_processing/include/aec_dump.h"
 #include "modules/audio_processing/include/audio_frame_proxies.h"
-#include "modules/audio_processing/include/audio_processing.h"
-#include "modules/audio_processing/include/audio_processing_statistics.h"
 #include "modules/audio_processing/ns/noise_suppressor.h"
 #include "modules/audio_processing/optionally_built_submodule_creators.h"
 #include "modules/audio_processing/render_queue_item_verifier.h"
diff --git a/modules/audio_processing/audio_processing_impl_unittest.cc b/modules/audio_processing/audio_processing_impl_unittest.cc
index e03f966..8bcc94c 100644
--- a/modules/audio_processing/audio_processing_impl_unittest.cc
+++ b/modules/audio_processing/audio_processing_impl_unittest.cc
@@ -16,9 +16,9 @@
 #include <tuple>
 
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing.h"
 #include "api/make_ref_counted.h"
 #include "api/scoped_refptr.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/optionally_built_submodule_creators.h"
 #include "modules/audio_processing/test/audio_processing_builder_for_testing.h"
 #include "modules/audio_processing/test/echo_canceller_test_tools.h"
diff --git a/modules/audio_processing/audio_processing_unittest.cc b/modules/audio_processing/audio_processing_unittest.cc
index 2d3684e..4d3fc65 100644
--- a/modules/audio_processing/audio_processing_unittest.cc
+++ b/modules/audio_processing/audio_processing_unittest.cc
@@ -7,7 +7,7 @@
  *  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/include/audio_processing.h"
+#include "api/audio/audio_processing.h"
 
 #include <math.h>
 #include <stdio.h>
diff --git a/modules/audio_processing/echo_control_mobile_impl.cc b/modules/audio_processing/echo_control_mobile_impl.cc
index fa5cb8f..1dc66ab 100644
--- a/modules/audio_processing/echo_control_mobile_impl.cc
+++ b/modules/audio_processing/echo_control_mobile_impl.cc
@@ -14,9 +14,9 @@
 
 #include <cstdint>
 
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/aecm/echo_control_mobile.h"
 #include "modules/audio_processing/audio_buffer.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "rtc_base/checks.h"
 
 namespace webrtc {
diff --git a/modules/audio_processing/echo_control_mobile_unittest.cc b/modules/audio_processing/echo_control_mobile_unittest.cc
index ed03930..dc11a81 100644
--- a/modules/audio_processing/echo_control_mobile_unittest.cc
+++ b/modules/audio_processing/echo_control_mobile_unittest.cc
@@ -11,8 +11,8 @@
 #include <array>
 #include <vector>
 
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/echo_control_mobile_impl.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "test/gtest.h"
 
 namespace webrtc {
diff --git a/modules/audio_processing/gain_control_impl.cc b/modules/audio_processing/gain_control_impl.cc
index 5f2b487..2a7f527 100644
--- a/modules/audio_processing/gain_control_impl.cc
+++ b/modules/audio_processing/gain_control_impl.cc
@@ -13,9 +13,9 @@
 #include <cstdint>
 
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/agc/legacy/gain_control.h"
 #include "modules/audio_processing/audio_buffer.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
diff --git a/modules/audio_processing/gain_controller2.h b/modules/audio_processing/gain_controller2.h
index 43b5828..f6be48a 100644
--- a/modules/audio_processing/gain_controller2.h
+++ b/modules/audio_processing/gain_controller2.h
@@ -15,6 +15,7 @@
 #include <memory>
 #include <string>
 
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/agc2/adaptive_digital_gain_controller.h"
 #include "modules/audio_processing/agc2/cpu_features.h"
 #include "modules/audio_processing/agc2/gain_applier.h"
@@ -24,7 +25,6 @@
 #include "modules/audio_processing/agc2/saturation_protector.h"
 #include "modules/audio_processing/agc2/speech_level_estimator.h"
 #include "modules/audio_processing/agc2/vad_wrapper.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 
 namespace webrtc {
diff --git a/modules/audio_processing/include/aec_dump.h b/modules/audio_processing/include/aec_dump.h
index 6f2eb64..f07b911 100644
--- a/modules/audio_processing/include/aec_dump.h
+++ b/modules/audio_processing/include/aec_dump.h
@@ -17,8 +17,8 @@
 
 #include "absl/base/attributes.h"
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/include/audio_frame_view.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 
diff --git a/modules/audio_processing/include/audio_frame_proxies.cc b/modules/audio_processing/include/audio_frame_proxies.cc
index 7cc4fb7..e37645e 100644
--- a/modules/audio_processing/include/audio_frame_proxies.cc
+++ b/modules/audio_processing/include/audio_frame_proxies.cc
@@ -11,7 +11,7 @@
 #include "modules/audio_processing/include/audio_frame_proxies.h"
 
 #include "api/audio/audio_frame.h"
-#include "modules/audio_processing/include/audio_processing.h"
+#include "api/audio/audio_processing.h"
 
 namespace webrtc {
 
diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h
index 02fb497..fe938f8 100644
--- a/modules/audio_processing/include/audio_processing.h
+++ b/modules/audio_processing/include/audio_processing.h
@@ -11,931 +11,8 @@
 #ifndef MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_PROCESSING_H_
 #define MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_PROCESSING_H_
 
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#ifndef _USE_MATH_DEFINES
-#define _USE_MATH_DEFINES
-#endif
-
-#include <math.h>
-#include <stddef.h>  // size_t
-#include <stdio.h>   // FILE
-#include <string.h>
-
-#include <vector>
-
-#include "absl/base/nullability.h"
-#include "absl/strings/string_view.h"
-#include "absl/types/optional.h"
-#include "api/array_view.h"
-#include "api/audio/echo_canceller3_config.h"
-#include "api/audio/echo_control.h"
-#include "api/ref_count.h"
-#include "api/scoped_refptr.h"
-#include "api/task_queue/task_queue_base.h"
-#include "modules/audio_processing/include/audio_processing_statistics.h"
-#include "rtc_base/arraysize.h"
-#include "rtc_base/system/file_wrapper.h"
-#include "rtc_base/system/rtc_export.h"
-
-namespace webrtc {
-
-class AecDump;
-class AudioBuffer;
-
-class StreamConfig;
-class ProcessingConfig;
-
-class EchoDetector;
-class CustomAudioAnalyzer;
-class CustomProcessing;
-
-// The Audio Processing Module (APM) provides a collection of voice processing
-// components designed for real-time communications software.
-//
-// APM operates on two audio streams on a frame-by-frame basis. Frames of the
-// primary stream, on which all processing is applied, are passed to
-// `ProcessStream()`. Frames of the reverse direction stream are passed to
-// `ProcessReverseStream()`. On the client-side, this will typically be the
-// near-end (capture) and far-end (render) streams, respectively. APM should be
-// placed in the signal chain as close to the audio hardware abstraction layer
-// (HAL) as possible.
-//
-// On the server-side, the reverse stream will normally not be used, with
-// processing occurring on each incoming stream.
-//
-// Component interfaces follow a similar pattern and are accessed through
-// corresponding getters in APM. All components are disabled at create-time,
-// with default settings that are recommended for most situations. New settings
-// can be applied without enabling a component. Enabling a component triggers
-// memory allocation and initialization to allow it to start processing the
-// streams.
-//
-// Thread safety is provided with the following assumptions to reduce locking
-// overhead:
-//   1. The stream getters and setters are called from the same thread as
-//      ProcessStream(). More precisely, stream functions are never called
-//      concurrently with ProcessStream().
-//   2. Parameter getters are never called concurrently with the corresponding
-//      setter.
-//
-// APM accepts only linear PCM audio data in chunks of ~10 ms (see
-// AudioProcessing::GetFrameSize() for details) and sample rates ranging from
-// 8000 Hz to 384000 Hz. The int16 interfaces use interleaved data, while the
-// float interfaces use deinterleaved data.
-//
-// Usage example, omitting error checking:
-// rtc::scoped_refptr<AudioProcessing> apm = AudioProcessingBuilder().Create();
-//
-// AudioProcessing::Config config;
-// config.echo_canceller.enabled = true;
-// config.echo_canceller.mobile_mode = false;
-//
-// 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;
-//
-// apm->ApplyConfig(config)
-//
-// // Start a voice call...
-//
-// // ... Render frame arrives bound for the audio HAL ...
-// apm->ProcessReverseStream(render_frame);
-//
-// // ... Capture frame arrives from the audio HAL ...
-// // Call required set_stream_ functions.
-// apm->set_stream_delay_ms(delay_ms);
-// apm->set_stream_analog_level(analog_level);
-//
-// apm->ProcessStream(capture_frame);
-//
-// // Call required stream_ functions.
-// analog_level = apm->recommended_stream_analog_level();
-// has_voice = apm->stream_has_voice();
-//
-// // Repeat render and capture processing for the duration of the call...
-// // Start a new call...
-// apm->Initialize();
-//
-// // Close the application...
-// apm.reset();
-//
-class RTC_EXPORT AudioProcessing : public RefCountInterface {
- public:
-  // The struct below constitutes the new parameter scheme for the audio
-  // processing. It is being introduced gradually and until it is fully
-  // introduced, it is prone to change.
-  // TODO(peah): Remove this comment once the new config scheme is fully rolled
-  // out.
-  //
-  // The parameters and behavior of the audio processing module are controlled
-  // by changing the default values in the AudioProcessing::Config struct.
-  // The config is applied by passing the struct to the ApplyConfig method.
-  //
-  // This config is intended to be used during setup, and to enable/disable
-  // top-level processing effects. Use during processing may cause undesired
-  // submodule resets, affecting the audio quality. Use the RuntimeSetting
-  // construct for runtime configuration.
-  struct RTC_EXPORT Config {
-    // Sets the properties of the audio processing pipeline.
-    struct RTC_EXPORT Pipeline {
-      // Ways to downmix a multi-channel track to mono.
-      enum class DownmixMethod {
-        kAverageChannels,  // Average across channels.
-        kUseFirstChannel   // Use the first channel.
-      };
-
-      // Maximum allowed processing rate used internally. May only be set to
-      // 32000 or 48000 and any differing values will be treated as 48000.
-      int maximum_internal_processing_rate = 48000;
-      // Allow multi-channel processing of render audio.
-      bool multi_channel_render = false;
-      // Allow multi-channel processing of capture audio when AEC3 is active
-      // or a custom AEC is injected..
-      bool multi_channel_capture = false;
-      // Indicates how to downmix multi-channel capture audio to mono (when
-      // needed).
-      DownmixMethod capture_downmix_method = DownmixMethod::kAverageChannels;
-    } pipeline;
-
-    // Enabled the pre-amplifier. It amplifies the capture signal
-    // before any other processing is done.
-    // TODO(webrtc:5298): Deprecate and use the pre-gain functionality in
-    // capture_level_adjustment instead.
-    struct PreAmplifier {
-      bool enabled = false;
-      float fixed_gain_factor = 1.0f;
-    } pre_amplifier;
-
-    // Functionality for general level adjustment in the capture pipeline. This
-    // should not be used together with the legacy PreAmplifier functionality.
-    struct CaptureLevelAdjustment {
-      bool operator==(const CaptureLevelAdjustment& rhs) const;
-      bool operator!=(const CaptureLevelAdjustment& rhs) const {
-        return !(*this == rhs);
-      }
-      bool enabled = false;
-      // The `pre_gain_factor` scales the signal before any processing is done.
-      float pre_gain_factor = 1.0f;
-      // The `post_gain_factor` scales the signal after all processing is done.
-      float post_gain_factor = 1.0f;
-      struct AnalogMicGainEmulation {
-        bool operator==(const AnalogMicGainEmulation& rhs) const;
-        bool operator!=(const AnalogMicGainEmulation& rhs) const {
-          return !(*this == rhs);
-        }
-        bool enabled = false;
-        // Initial analog gain level to use for the emulated analog gain. Must
-        // be in the range [0...255].
-        int initial_level = 255;
-      } analog_mic_gain_emulation;
-    } capture_level_adjustment;
-
-    struct HighPassFilter {
-      bool enabled = false;
-      bool apply_in_full_band = true;
-    } high_pass_filter;
-
-    struct EchoCanceller {
-      bool enabled = false;
-      bool mobile_mode = false;
-      bool export_linear_aec_output = false;
-      // Enforce the highpass filter to be on (has no effect for the mobile
-      // mode).
-      bool enforce_high_pass_filtering = true;
-    } echo_canceller;
-
-    // Enables background noise suppression.
-    struct NoiseSuppression {
-      bool enabled = false;
-      enum Level { kLow, kModerate, kHigh, kVeryHigh };
-      Level level = kModerate;
-      bool analyze_linear_aec_output_when_available = false;
-    } noise_suppression;
-
-    // Enables transient suppression.
-    struct TransientSuppression {
-      bool enabled = false;
-    } transient_suppression;
-
-    // Enables automatic gain control (AGC) functionality.
-    // The automatic gain control (AGC) component brings the signal to an
-    // appropriate range. This is done by applying a digital gain directly and,
-    // in the analog mode, prescribing an analog gain to be applied at the audio
-    // HAL.
-    // Recommended to be enabled on the client-side.
-    struct RTC_EXPORT GainController1 {
-      bool operator==(const GainController1& rhs) const;
-      bool operator!=(const GainController1& rhs) const {
-        return !(*this == rhs);
-      }
-
-      bool enabled = false;
-      enum Mode {
-        // Adaptive mode intended for use if an analog volume control is
-        // available on the capture device. It will require the user to provide
-        // coupling between the OS mixer controls and AGC through the
-        // stream_analog_level() functions.
-        // It consists of an analog gain prescription for the audio device and a
-        // digital compression stage.
-        kAdaptiveAnalog,
-        // Adaptive mode intended for situations in which an analog volume
-        // control is unavailable. It operates in a similar fashion to the
-        // adaptive analog mode, but with scaling instead applied in the digital
-        // domain. As with the analog mode, it additionally uses a digital
-        // compression stage.
-        kAdaptiveDigital,
-        // Fixed mode which enables only the digital compression stage also used
-        // by the two adaptive modes.
-        // It is distinguished from the adaptive modes by considering only a
-        // short time-window of the input signal. It applies a fixed gain
-        // through most of the input level range, and compresses (gradually
-        // reduces gain with increasing level) the input signal at higher
-        // levels. This mode is preferred on embedded devices where the capture
-        // signal level is predictable, so that a known gain can be applied.
-        kFixedDigital
-      };
-      Mode mode = kAdaptiveAnalog;
-      // Sets the target peak level (or envelope) of the AGC in dBFs (decibels
-      // from digital full-scale). The convention is to use positive values. For
-      // instance, passing in a value of 3 corresponds to -3 dBFs, or a target
-      // level 3 dB below full-scale. Limited to [0, 31].
-      int target_level_dbfs = 3;
-      // Sets the maximum gain the digital compression stage may apply, in dB. A
-      // higher number corresponds to greater compression, while a value of 0
-      // will leave the signal uncompressed. Limited to [0, 90].
-      // For updates after APM setup, use a RuntimeSetting instead.
-      int compression_gain_db = 9;
-      // When enabled, the compression stage will hard limit the signal to the
-      // target level. Otherwise, the signal will be compressed but not limited
-      // above the target level.
-      bool enable_limiter = true;
-
-      // Enables the analog gain controller functionality.
-      struct AnalogGainController {
-        bool enabled = true;
-        // TODO(bugs.webrtc.org/7494): Deprecated. Stop using and remove.
-        int startup_min_volume = 0;
-        // Lowest analog microphone level that will be applied in response to
-        // clipping.
-        int clipped_level_min = 70;
-        // If true, an adaptive digital gain is applied.
-        bool enable_digital_adaptive = true;
-        // Amount the microphone level is lowered with every clipping event.
-        // Limited to (0, 255].
-        int clipped_level_step = 15;
-        // Proportion of clipped samples required to declare a clipping event.
-        // Limited to (0.f, 1.f).
-        float clipped_ratio_threshold = 0.1f;
-        // Time in frames to wait after a clipping event before checking again.
-        // Limited to values higher than 0.
-        int clipped_wait_frames = 300;
-
-        // Enables clipping prediction functionality.
-        struct ClippingPredictor {
-          bool enabled = false;
-          enum Mode {
-            // Clipping event prediction mode with fixed step estimation.
-            kClippingEventPrediction,
-            // Clipped peak estimation mode with adaptive step estimation.
-            kAdaptiveStepClippingPeakPrediction,
-            // Clipped peak estimation mode with fixed step estimation.
-            kFixedStepClippingPeakPrediction,
-          };
-          Mode mode = kClippingEventPrediction;
-          // Number of frames in the sliding analysis window.
-          int window_length = 5;
-          // Number of frames in the sliding reference window.
-          int reference_window_length = 5;
-          // Reference window delay (unit: number of frames).
-          int reference_window_delay = 5;
-          // Clipping prediction threshold (dBFS).
-          float clipping_threshold = -1.0f;
-          // Crest factor drop threshold (dB).
-          float crest_factor_margin = 3.0f;
-          // If true, the recommended clipped level step is used to modify the
-          // analog gain. Otherwise, the predictor runs without affecting the
-          // analog gain.
-          bool use_predicted_step = true;
-        } clipping_predictor;
-      } analog_gain_controller;
-    } gain_controller1;
-
-    // Parameters for AGC2, an Automatic Gain Control (AGC) sub-module which
-    // replaces the AGC sub-module parametrized by `gain_controller1`.
-    // AGC2 brings the captured audio signal to the desired level by combining
-    // three different controllers (namely, input volume controller, adapative
-    // digital controller and fixed digital controller) and a limiter.
-    // TODO(bugs.webrtc.org:7494): Name `GainController` when AGC1 removed.
-    struct RTC_EXPORT GainController2 {
-      bool operator==(const GainController2& rhs) const;
-      bool operator!=(const GainController2& rhs) const {
-        return !(*this == rhs);
-      }
-
-      // AGC2 must be created if and only if `enabled` is true.
-      bool enabled = false;
-
-      // Parameters for the input volume controller, which adjusts the input
-      // volume applied when the audio is captured (e.g., microphone volume on
-      // a soundcard, input volume on HAL).
-      struct InputVolumeController {
-        bool operator==(const InputVolumeController& rhs) const;
-        bool operator!=(const InputVolumeController& rhs) const {
-          return !(*this == rhs);
-        }
-        bool enabled = false;
-      } input_volume_controller;
-
-      // Parameters for the adaptive digital controller, which adjusts and
-      // applies a digital gain after echo cancellation and after noise
-      // suppression.
-      struct RTC_EXPORT AdaptiveDigital {
-        bool operator==(const AdaptiveDigital& rhs) const;
-        bool operator!=(const AdaptiveDigital& rhs) const {
-          return !(*this == rhs);
-        }
-        bool enabled = false;
-        float headroom_db = 5.0f;
-        float max_gain_db = 50.0f;
-        float initial_gain_db = 15.0f;
-        float max_gain_change_db_per_second = 6.0f;
-        float max_output_noise_level_dbfs = -50.0f;
-      } adaptive_digital;
-
-      // Parameters for the fixed digital controller, which applies a fixed
-      // digital gain after the adaptive digital controller and before the
-      // limiter.
-      struct FixedDigital {
-        // By setting `gain_db` to a value greater than zero, the limiter can be
-        // turned into a compressor that first applies a fixed gain.
-        float gain_db = 0.0f;
-      } fixed_digital;
-    } gain_controller2;
-
-    std::string ToString() const;
-  };
-
-  // Specifies the properties of a setting to be passed to AudioProcessing at
-  // runtime.
-  class RuntimeSetting {
-   public:
-    enum class Type {
-      kNotSpecified,
-      kCapturePreGain,
-      kCaptureCompressionGain,
-      kCaptureFixedPostGain,
-      kPlayoutVolumeChange,
-      kCustomRenderProcessingRuntimeSetting,
-      kPlayoutAudioDeviceChange,
-      kCapturePostGain,
-      kCaptureOutputUsed
-    };
-
-    // Play-out audio device properties.
-    struct PlayoutAudioDeviceInfo {
-      int id;          // Identifies the audio device.
-      int max_volume;  // Maximum play-out volume.
-    };
-
-    RuntimeSetting() : type_(Type::kNotSpecified), value_(0.0f) {}
-    ~RuntimeSetting() = default;
-
-    static RuntimeSetting CreateCapturePreGain(float gain) {
-      return {Type::kCapturePreGain, gain};
-    }
-
-    static RuntimeSetting CreateCapturePostGain(float gain) {
-      return {Type::kCapturePostGain, gain};
-    }
-
-    // Corresponds to Config::GainController1::compression_gain_db, but for
-    // runtime configuration.
-    static RuntimeSetting CreateCompressionGainDb(int gain_db) {
-      RTC_DCHECK_GE(gain_db, 0);
-      RTC_DCHECK_LE(gain_db, 90);
-      return {Type::kCaptureCompressionGain, static_cast<float>(gain_db)};
-    }
-
-    // Corresponds to Config::GainController2::fixed_digital::gain_db, but for
-    // runtime configuration.
-    static RuntimeSetting CreateCaptureFixedPostGain(float gain_db) {
-      RTC_DCHECK_GE(gain_db, 0.0f);
-      RTC_DCHECK_LE(gain_db, 90.0f);
-      return {Type::kCaptureFixedPostGain, gain_db};
-    }
-
-    // Creates a runtime setting to notify play-out (aka render) audio device
-    // changes.
-    static RuntimeSetting CreatePlayoutAudioDeviceChange(
-        PlayoutAudioDeviceInfo audio_device) {
-      return {Type::kPlayoutAudioDeviceChange, audio_device};
-    }
-
-    // Creates a runtime setting to notify play-out (aka render) volume changes.
-    // `volume` is the unnormalized volume, the maximum of which
-    static RuntimeSetting CreatePlayoutVolumeChange(int volume) {
-      return {Type::kPlayoutVolumeChange, volume};
-    }
-
-    static RuntimeSetting CreateCustomRenderSetting(float payload) {
-      return {Type::kCustomRenderProcessingRuntimeSetting, payload};
-    }
-
-    static RuntimeSetting CreateCaptureOutputUsedSetting(
-        bool capture_output_used) {
-      return {Type::kCaptureOutputUsed, capture_output_used};
-    }
-
-    Type type() const { return type_; }
-    // Getters do not return a value but instead modify the argument to protect
-    // from implicit casting.
-    void GetFloat(float* value) const {
-      RTC_DCHECK(value);
-      *value = value_.float_value;
-    }
-    void GetInt(int* value) const {
-      RTC_DCHECK(value);
-      *value = value_.int_value;
-    }
-    void GetBool(bool* value) const {
-      RTC_DCHECK(value);
-      *value = value_.bool_value;
-    }
-    void GetPlayoutAudioDeviceInfo(PlayoutAudioDeviceInfo* value) const {
-      RTC_DCHECK(value);
-      *value = value_.playout_audio_device_info;
-    }
-
-   private:
-    RuntimeSetting(Type id, float value) : type_(id), value_(value) {}
-    RuntimeSetting(Type id, int value) : type_(id), value_(value) {}
-    RuntimeSetting(Type id, PlayoutAudioDeviceInfo value)
-        : type_(id), value_(value) {}
-    Type type_;
-    union U {
-      U() {}
-      U(int value) : int_value(value) {}
-      U(float value) : float_value(value) {}
-      U(PlayoutAudioDeviceInfo value) : playout_audio_device_info(value) {}
-      float float_value;
-      int int_value;
-      bool bool_value;
-      PlayoutAudioDeviceInfo playout_audio_device_info;
-    } value_;
-  };
-
-  ~AudioProcessing() override {}
-
-  // Initializes internal states, while retaining all user settings. This
-  // should be called before beginning to process a new audio stream. However,
-  // it is not necessary to call before processing the first stream after
-  // creation.
-  //
-  // It is also not necessary to call if the audio parameters (sample
-  // rate and number of channels) have changed. Passing updated parameters
-  // directly to `ProcessStream()` and `ProcessReverseStream()` is permissible.
-  // If the parameters are known at init-time though, they may be provided.
-  // TODO(webrtc:5298): Change to return void.
-  virtual int Initialize() = 0;
-
-  // The int16 interfaces require:
-  //   - only `NativeRate`s be used
-  //   - that the input, output and reverse rates must match
-  //   - that `processing_config.output_stream()` matches
-  //     `processing_config.input_stream()`.
-  //
-  // The float interfaces accept arbitrary rates and support differing input and
-  // output layouts, but the output must have either one channel or the same
-  // number of channels as the input.
-  virtual int Initialize(const ProcessingConfig& processing_config) = 0;
-
-  // TODO(peah): This method is a temporary solution used to take control
-  // over the parameters in the audio processing module and is likely to change.
-  virtual void ApplyConfig(const Config& config) = 0;
-
-  // TODO(ajm): Only intended for internal use. Make private and friend the
-  // necessary classes?
-  virtual int proc_sample_rate_hz() const = 0;
-  virtual int proc_split_sample_rate_hz() const = 0;
-  virtual size_t num_input_channels() const = 0;
-  virtual size_t num_proc_channels() const = 0;
-  virtual size_t num_output_channels() const = 0;
-  virtual size_t num_reverse_channels() const = 0;
-
-  // Set to true when the output of AudioProcessing will be muted or in some
-  // other way not used. Ideally, the captured audio would still be processed,
-  // but some components may change behavior based on this information.
-  // Default false. This method takes a lock. To achieve this in a lock-less
-  // manner the PostRuntimeSetting can instead be used.
-  virtual void set_output_will_be_muted(bool muted) = 0;
-
-  // Enqueues a runtime setting.
-  virtual void SetRuntimeSetting(RuntimeSetting setting) = 0;
-
-  // Enqueues a runtime setting. Returns a bool indicating whether the
-  // enqueueing was successfull.
-  virtual bool PostRuntimeSetting(RuntimeSetting setting) = 0;
-
-  // Accepts and produces a ~10 ms frame of interleaved 16 bit integer audio as
-  // specified in `input_config` and `output_config`. `src` and `dest` may use
-  // the same memory, if desired.
-  virtual int ProcessStream(const int16_t* const src,
-                            const StreamConfig& input_config,
-                            const StreamConfig& output_config,
-                            int16_t* const dest) = 0;
-
-  // Accepts deinterleaved float audio with the range [-1, 1]. Each element of
-  // `src` points to a channel buffer, arranged according to `input_stream`. At
-  // output, the channels will be arranged according to `output_stream` in
-  // `dest`.
-  //
-  // The output must have one channel or as many channels as the input. `src`
-  // and `dest` may use the same memory, if desired.
-  virtual int ProcessStream(const float* const* src,
-                            const StreamConfig& input_config,
-                            const StreamConfig& output_config,
-                            float* const* dest) = 0;
-
-  // Accepts and produces a ~10 ms frame of interleaved 16 bit integer audio for
-  // the reverse direction audio stream as specified in `input_config` and
-  // `output_config`. `src` and `dest` may use the same memory, if desired.
-  virtual int ProcessReverseStream(const int16_t* const src,
-                                   const StreamConfig& input_config,
-                                   const StreamConfig& output_config,
-                                   int16_t* const dest) = 0;
-
-  // Accepts deinterleaved float audio with the range [-1, 1]. Each element of
-  // `data` points to a channel buffer, arranged according to `reverse_config`.
-  virtual int ProcessReverseStream(const float* const* src,
-                                   const StreamConfig& input_config,
-                                   const StreamConfig& output_config,
-                                   float* const* dest) = 0;
-
-  // Accepts deinterleaved float audio with the range [-1, 1]. Each element
-  // of `data` points to a channel buffer, arranged according to
-  // `reverse_config`.
-  virtual int AnalyzeReverseStream(const float* const* data,
-                                   const StreamConfig& reverse_config) = 0;
-
-  // Returns the most recently produced ~10 ms of the linear AEC output at a
-  // rate of 16 kHz. If there is more than one capture channel, a mono
-  // representation of the input is returned. Returns true/false to indicate
-  // whether an output returned.
-  virtual bool GetLinearAecOutput(
-      rtc::ArrayView<std::array<float, 160>> linear_output) const = 0;
-
-  // This must be called prior to ProcessStream() if and only if adaptive analog
-  // gain control is enabled, to pass the current analog level from the audio
-  // HAL. Must be within the range [0, 255].
-  virtual void set_stream_analog_level(int level) = 0;
-
-  // When an analog mode is set, this should be called after
-  // `set_stream_analog_level()` and `ProcessStream()` to obtain the recommended
-  // new analog level for the audio HAL. It is the user's responsibility to
-  // apply this level.
-  virtual int recommended_stream_analog_level() const = 0;
-
-  // This must be called if and only if echo processing is enabled.
-  //
-  // Sets the `delay` in ms between ProcessReverseStream() receiving a far-end
-  // frame and ProcessStream() receiving a near-end frame containing the
-  // corresponding echo. On the client-side this can be expressed as
-  //   delay = (t_render - t_analyze) + (t_process - t_capture)
-  // where,
-  //   - t_analyze is the time a frame is passed to ProcessReverseStream() and
-  //     t_render is the time the first sample of the same frame is rendered by
-  //     the audio hardware.
-  //   - t_capture is the time the first sample of a frame is captured by the
-  //     audio hardware and t_process is the time the same frame is passed to
-  //     ProcessStream().
-  virtual int set_stream_delay_ms(int delay) = 0;
-  virtual int stream_delay_ms() const = 0;
-
-  // Call to signal that a key press occurred (true) or did not occur (false)
-  // with this chunk of audio.
-  virtual void set_stream_key_pressed(bool key_pressed) = 0;
-
-  // Creates and attaches an webrtc::AecDump for recording debugging
-  // information.
-  // The `worker_queue` may not be null and must outlive the created
-  // AecDump instance. |max_log_size_bytes == -1| means the log size
-  // will be unlimited. `handle` may not be null. The AecDump takes
-  // responsibility for `handle` and closes it in the destructor. A
-  // return value of true indicates that the file has been
-  // sucessfully opened, while a value of false indicates that
-  // opening the file failed.
-  virtual bool CreateAndAttachAecDump(
-      absl::string_view file_name,
-      int64_t max_log_size_bytes,
-      absl::Nonnull<TaskQueueBase*> worker_queue) = 0;
-  virtual bool CreateAndAttachAecDump(
-      absl::Nonnull<FILE*> handle,
-      int64_t max_log_size_bytes,
-      absl::Nonnull<TaskQueueBase*> worker_queue) = 0;
-
-  // TODO(webrtc:5298) Deprecated variant.
-  // Attaches provided webrtc::AecDump for recording debugging
-  // information. Log file and maximum file size logic is supposed to
-  // be handled by implementing instance of AecDump. Calling this
-  // method when another AecDump is attached resets the active AecDump
-  // with a new one. This causes the d-tor of the earlier AecDump to
-  // be called. The d-tor call may block until all pending logging
-  // tasks are completed.
-  virtual void AttachAecDump(std::unique_ptr<AecDump> aec_dump) = 0;
-
-  // If no AecDump is attached, this has no effect. If an AecDump is
-  // attached, it's destructor is called. The d-tor may block until
-  // all pending logging tasks are completed.
-  virtual void DetachAecDump() = 0;
-
-  // Get audio processing statistics.
-  virtual AudioProcessingStats GetStatistics() = 0;
-  // TODO(webrtc:5298) Deprecated variant. The `has_remote_tracks` argument
-  // should be set if there are active remote tracks (this would usually be true
-  // during a call). If there are no remote tracks some of the stats will not be
-  // set by AudioProcessing, because they only make sense if there is at least
-  // one remote track.
-  virtual AudioProcessingStats GetStatistics(bool has_remote_tracks) = 0;
-
-  // Returns the last applied configuration.
-  virtual AudioProcessing::Config GetConfig() const = 0;
-
-  enum Error {
-    // Fatal errors.
-    kNoError = 0,
-    kUnspecifiedError = -1,
-    kCreationFailedError = -2,
-    kUnsupportedComponentError = -3,
-    kUnsupportedFunctionError = -4,
-    kNullPointerError = -5,
-    kBadParameterError = -6,
-    kBadSampleRateError = -7,
-    kBadDataLengthError = -8,
-    kBadNumberChannelsError = -9,
-    kFileError = -10,
-    kStreamParameterNotSetError = -11,
-    kNotEnabledError = -12,
-
-    // Warnings are non-fatal.
-    // This results when a set_stream_ parameter is out of range. Processing
-    // will continue, but the parameter may have been truncated.
-    kBadStreamParameterWarning = -13
-  };
-
-  // Native rates supported by the integer interfaces.
-  enum NativeRate {
-    kSampleRate8kHz = 8000,
-    kSampleRate16kHz = 16000,
-    kSampleRate32kHz = 32000,
-    kSampleRate48kHz = 48000
-  };
-
-  // TODO(kwiberg): We currently need to support a compiler (Visual C++) that
-  // complains if we don't explicitly state the size of the array here. Remove
-  // the size when that's no longer the case.
-  static constexpr int kNativeSampleRatesHz[4] = {
-      kSampleRate8kHz, kSampleRate16kHz, kSampleRate32kHz, kSampleRate48kHz};
-  static constexpr size_t kNumNativeSampleRates =
-      arraysize(kNativeSampleRatesHz);
-  static constexpr int kMaxNativeSampleRateHz =
-      kNativeSampleRatesHz[kNumNativeSampleRates - 1];
-
-  // APM processes audio in chunks of about 10 ms. See GetFrameSize() for
-  // details.
-  static constexpr int kChunkSizeMs = 10;
-
-  // Returns floor(sample_rate_hz/100): the number of samples per channel used
-  // as input and output to the audio processing module in calls to
-  // ProcessStream, ProcessReverseStream, AnalyzeReverseStream, and
-  // GetLinearAecOutput.
-  //
-  // This is exactly 10 ms for sample rates divisible by 100. For example:
-  //  - 48000 Hz (480 samples per channel),
-  //  - 44100 Hz (441 samples per channel),
-  //  - 16000 Hz (160 samples per channel).
-  //
-  // Sample rates not divisible by 100 are received/produced in frames of
-  // approximately 10 ms. For example:
-  //  - 22050 Hz (220 samples per channel, or ~9.98 ms per frame),
-  //  - 11025 Hz (110 samples per channel, or ~9.98 ms per frame).
-  // These nondivisible sample rates yield lower audio quality compared to
-  // multiples of 100. Internal resampling to 10 ms frames causes a simulated
-  // clock drift effect which impacts the performance of (for example) echo
-  // cancellation.
-  static int GetFrameSize(int sample_rate_hz) { return sample_rate_hz / 100; }
-};
-
-class RTC_EXPORT AudioProcessingBuilder {
- public:
-  AudioProcessingBuilder();
-  AudioProcessingBuilder(const AudioProcessingBuilder&) = delete;
-  AudioProcessingBuilder& operator=(const AudioProcessingBuilder&) = delete;
-  ~AudioProcessingBuilder();
-
-  // Sets the APM configuration.
-  AudioProcessingBuilder& SetConfig(const AudioProcessing::Config& config) {
-    config_ = config;
-    return *this;
-  }
-
-  // Sets the echo controller factory to inject when APM is created.
-  AudioProcessingBuilder& SetEchoControlFactory(
-      std::unique_ptr<EchoControlFactory> echo_control_factory) {
-    echo_control_factory_ = std::move(echo_control_factory);
-    return *this;
-  }
-
-  // Sets the capture post-processing sub-module to inject when APM is created.
-  AudioProcessingBuilder& SetCapturePostProcessing(
-      std::unique_ptr<CustomProcessing> capture_post_processing) {
-    capture_post_processing_ = std::move(capture_post_processing);
-    return *this;
-  }
-
-  // Sets the render pre-processing sub-module to inject when APM is created.
-  AudioProcessingBuilder& SetRenderPreProcessing(
-      std::unique_ptr<CustomProcessing> render_pre_processing) {
-    render_pre_processing_ = std::move(render_pre_processing);
-    return *this;
-  }
-
-  // Sets the echo detector to inject when APM is created.
-  AudioProcessingBuilder& SetEchoDetector(
-      rtc::scoped_refptr<EchoDetector> echo_detector) {
-    echo_detector_ = std::move(echo_detector);
-    return *this;
-  }
-
-  // Sets the capture analyzer sub-module to inject when APM is created.
-  AudioProcessingBuilder& SetCaptureAnalyzer(
-      std::unique_ptr<CustomAudioAnalyzer> capture_analyzer) {
-    capture_analyzer_ = std::move(capture_analyzer);
-    return *this;
-  }
-
-  // Creates an APM instance with the specified config or the default one if
-  // unspecified. Injects the specified components transferring the ownership
-  // to the newly created APM instance - i.e., except for the config, the
-  // builder is reset to its initial state.
-  rtc::scoped_refptr<AudioProcessing> Create();
-
- private:
-  AudioProcessing::Config config_;
-  std::unique_ptr<EchoControlFactory> echo_control_factory_;
-  std::unique_ptr<CustomProcessing> capture_post_processing_;
-  std::unique_ptr<CustomProcessing> render_pre_processing_;
-  rtc::scoped_refptr<EchoDetector> echo_detector_;
-  std::unique_ptr<CustomAudioAnalyzer> capture_analyzer_;
-};
-
-class StreamConfig {
- public:
-  // sample_rate_hz: The sampling rate of the stream.
-  // num_channels: The number of audio channels in the stream.
-  StreamConfig(int sample_rate_hz = 0, size_t num_channels = 0)
-      : sample_rate_hz_(sample_rate_hz),
-        num_channels_(num_channels),
-        num_frames_(calculate_frames(sample_rate_hz)) {}
-
-  void set_sample_rate_hz(int value) {
-    sample_rate_hz_ = value;
-    num_frames_ = calculate_frames(value);
-  }
-  void set_num_channels(size_t value) { num_channels_ = value; }
-
-  int sample_rate_hz() const { return sample_rate_hz_; }
-
-  // The number of channels in the stream.
-  size_t num_channels() const { return num_channels_; }
-
-  size_t num_frames() const { return num_frames_; }
-  size_t num_samples() const { return num_channels_ * num_frames_; }
-
-  bool operator==(const StreamConfig& other) const {
-    return sample_rate_hz_ == other.sample_rate_hz_ &&
-           num_channels_ == other.num_channels_;
-  }
-
-  bool operator!=(const StreamConfig& other) const { return !(*this == other); }
-
- private:
-  static size_t calculate_frames(int sample_rate_hz) {
-    return static_cast<size_t>(AudioProcessing::GetFrameSize(sample_rate_hz));
-  }
-
-  int sample_rate_hz_;
-  size_t num_channels_;
-  size_t num_frames_;
-};
-
-class ProcessingConfig {
- public:
-  enum StreamName {
-    kInputStream,
-    kOutputStream,
-    kReverseInputStream,
-    kReverseOutputStream,
-    kNumStreamNames,
-  };
-
-  const StreamConfig& input_stream() const {
-    return streams[StreamName::kInputStream];
-  }
-  const StreamConfig& output_stream() const {
-    return streams[StreamName::kOutputStream];
-  }
-  const StreamConfig& reverse_input_stream() const {
-    return streams[StreamName::kReverseInputStream];
-  }
-  const StreamConfig& reverse_output_stream() const {
-    return streams[StreamName::kReverseOutputStream];
-  }
-
-  StreamConfig& input_stream() { return streams[StreamName::kInputStream]; }
-  StreamConfig& output_stream() { return streams[StreamName::kOutputStream]; }
-  StreamConfig& reverse_input_stream() {
-    return streams[StreamName::kReverseInputStream];
-  }
-  StreamConfig& reverse_output_stream() {
-    return streams[StreamName::kReverseOutputStream];
-  }
-
-  bool operator==(const ProcessingConfig& other) const {
-    for (int i = 0; i < StreamName::kNumStreamNames; ++i) {
-      if (this->streams[i] != other.streams[i]) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  bool operator!=(const ProcessingConfig& other) const {
-    return !(*this == other);
-  }
-
-  StreamConfig streams[StreamName::kNumStreamNames];
-};
-
-// Experimental interface for a custom analysis submodule.
-class CustomAudioAnalyzer {
- public:
-  // (Re-) Initializes the submodule.
-  virtual void Initialize(int sample_rate_hz, int num_channels) = 0;
-  // Analyzes the given capture or render signal.
-  virtual void Analyze(const AudioBuffer* audio) = 0;
-  // Returns a string representation of the module state.
-  virtual std::string ToString() const = 0;
-
-  virtual ~CustomAudioAnalyzer() {}
-};
-
-// Interface for a custom processing submodule.
-class CustomProcessing {
- public:
-  // (Re-)Initializes the submodule.
-  virtual void Initialize(int sample_rate_hz, int num_channels) = 0;
-  // Processes the given capture or render signal.
-  virtual void Process(AudioBuffer* audio) = 0;
-  // Returns a string representation of the module state.
-  virtual std::string ToString() const = 0;
-  // Handles RuntimeSettings. TODO(webrtc:9262): make pure virtual
-  // after updating dependencies.
-  virtual void SetRuntimeSetting(AudioProcessing::RuntimeSetting setting);
-
-  virtual ~CustomProcessing() {}
-};
-
-// Interface for an echo detector submodule.
-class EchoDetector : public RefCountInterface {
- public:
-  // (Re-)Initializes the submodule.
-  virtual void Initialize(int capture_sample_rate_hz,
-                          int num_capture_channels,
-                          int render_sample_rate_hz,
-                          int num_render_channels) = 0;
-
-  // Analysis (not changing) of the first channel of the render signal.
-  virtual void AnalyzeRenderAudio(rtc::ArrayView<const float> render_audio) = 0;
-
-  // Analysis (not changing) of the capture signal.
-  virtual void AnalyzeCaptureAudio(
-      rtc::ArrayView<const float> capture_audio) = 0;
-
-  struct Metrics {
-    absl::optional<double> echo_likelihood;
-    absl::optional<double> echo_likelihood_recent_max;
-  };
-
-  // Collect current metrics from the echo detector.
-  virtual Metrics GetMetrics() const = 0;
-};
-
-}  // namespace webrtc
+// This is a transitional header forwarding to the new version in the api/
+// folder.
+#include "api/audio/audio_processing.h"
 
 #endif  // MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_PROCESSING_H_
diff --git a/modules/audio_processing/include/audio_processing_statistics.h b/modules/audio_processing/include/audio_processing_statistics.h
index 3b43319..594d3f5 100644
--- a/modules/audio_processing/include/audio_processing_statistics.h
+++ b/modules/audio_processing/include/audio_processing_statistics.h
@@ -11,57 +11,8 @@
 #ifndef MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_PROCESSING_STATISTICS_H_
 #define MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_PROCESSING_STATISTICS_H_
 
-#include <stdint.h>
-
-#include "absl/types/optional.h"
-#include "rtc_base/system/rtc_export.h"
-
-namespace webrtc {
-// This version of the stats uses Optionals, it will replace the regular
-// AudioProcessingStatistics struct.
-struct RTC_EXPORT AudioProcessingStats {
-  AudioProcessingStats();
-  AudioProcessingStats(const AudioProcessingStats& other);
-  ~AudioProcessingStats();
-
-  // Deprecated.
-  // TODO(bugs.webrtc.org/11226): Remove.
-  // True if voice is detected in the last capture frame, after processing.
-  // It is conservative in flagging audio as speech, with low likelihood of
-  // incorrectly flagging a frame as voice.
-  // Only reported if voice detection is enabled in AudioProcessing::Config.
-  absl::optional<bool> voice_detected;
-
-  // AEC Statistics.
-  // ERL = 10log_10(P_far / P_echo)
-  absl::optional<double> echo_return_loss;
-  // ERLE = 10log_10(P_echo / P_out)
-  absl::optional<double> echo_return_loss_enhancement;
-  // Fraction of time that the AEC linear filter is divergent, in a 1-second
-  // non-overlapped aggregation window.
-  absl::optional<double> divergent_filter_fraction;
-
-  // The delay metrics consists of the delay median and standard deviation. It
-  // also consists of the fraction of delay estimates that can make the echo
-  // cancellation perform poorly. The values are aggregated until the first
-  // call to `GetStatistics()` and afterwards aggregated and updated every
-  // second. Note that if there are several clients pulling metrics from
-  // `GetStatistics()` during a session the first call from any of them will
-  // change to one second aggregation window for all.
-  absl::optional<int32_t> delay_median_ms;
-  absl::optional<int32_t> delay_standard_deviation_ms;
-
-  // Residual echo detector likelihood.
-  absl::optional<double> residual_echo_likelihood;
-  // Maximum residual echo likelihood from the last time period.
-  absl::optional<double> residual_echo_likelihood_recent_max;
-
-  // The instantaneous delay estimate produced in the AEC. The unit is in
-  // milliseconds and the value is the instantaneous value at the time of the
-  // call to `GetStatistics()`.
-  absl::optional<int32_t> delay_ms;
-};
-
-}  // namespace webrtc
+// This is a transitional header forwarding to the new version in the api/
+// folder.
+#include "api/audio/audio_processing_statistics.h"
 
 #endif  // MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_PROCESSING_STATISTICS_H_
diff --git a/modules/audio_processing/include/mock_audio_processing.h b/modules/audio_processing/include/mock_audio_processing.h
index dfe7d84..f8c76bf 100644
--- a/modules/audio_processing/include/mock_audio_processing.h
+++ b/modules/audio_processing/include/mock_audio_processing.h
@@ -15,10 +15,10 @@
 
 #include "absl/base/nullability.h"
 #include "absl/strings/string_view.h"
+#include "api/audio/audio_processing.h"
+#include "api/audio/audio_processing_statistics.h"
 #include "api/task_queue/task_queue_base.h"
 #include "modules/audio_processing/include/aec_dump.h"
-#include "modules/audio_processing/include/audio_processing.h"
-#include "modules/audio_processing/include/audio_processing_statistics.h"
 #include "test/gmock.h"
 
 namespace webrtc {
diff --git a/modules/audio_processing/residual_echo_detector.h b/modules/audio_processing/residual_echo_detector.h
index ac554b1..83773ae 100644
--- a/modules/audio_processing/residual_echo_detector.h
+++ b/modules/audio_processing/residual_echo_detector.h
@@ -15,11 +15,11 @@
 #include <vector>
 
 #include "api/array_view.h"
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/echo_detector/circular_buffer.h"
 #include "modules/audio_processing/echo_detector/mean_variance_estimator.h"
 #include "modules/audio_processing/echo_detector/moving_max.h"
 #include "modules/audio_processing/echo_detector/normalized_covariance_estimator.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 
diff --git a/modules/audio_processing/test/audio_buffer_tools.h b/modules/audio_processing/test/audio_buffer_tools.h
index faac4bf..c4e4b09 100644
--- a/modules/audio_processing/test/audio_buffer_tools.h
+++ b/modules/audio_processing/test/audio_buffer_tools.h
@@ -14,8 +14,8 @@
 #include <vector>
 
 #include "api/array_view.h"
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/audio_buffer.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 namespace test {
diff --git a/modules/audio_processing/test/audio_processing_builder_for_testing.h b/modules/audio_processing/test/audio_processing_builder_for_testing.h
index e73706c..d61d189 100644
--- a/modules/audio_processing/test/audio_processing_builder_for_testing.h
+++ b/modules/audio_processing/test/audio_processing_builder_for_testing.h
@@ -16,7 +16,7 @@
 #include <utility>
 #include <vector>
 
-#include "modules/audio_processing/include/audio_processing.h"
+#include "api/audio/audio_processing.h"
 
 namespace webrtc {
 
diff --git a/modules/audio_processing/test/audio_processing_simulator.cc b/modules/audio_processing/test/audio_processing_simulator.cc
index 500005f..a47e4b5 100644
--- a/modules/audio_processing/test/audio_processing_simulator.cc
+++ b/modules/audio_processing/test/audio_processing_simulator.cc
@@ -19,11 +19,11 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio/echo_canceller3_factory.h"
 #include "api/audio/echo_detector_creator.h"
 #include "modules/audio_processing/aec_dump/aec_dump_factory.h"
 #include "modules/audio_processing/echo_control_mobile_impl.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 #include "modules/audio_processing/test/echo_canceller3_config_json.h"
 #include "modules/audio_processing/test/fake_recording_device.h"
diff --git a/modules/audio_processing/test/audio_processing_simulator.h b/modules/audio_processing/test/audio_processing_simulator.h
index e40d818..82e22cc 100644
--- a/modules/audio_processing/test/audio_processing_simulator.h
+++ b/modules/audio_processing/test/audio_processing_simulator.h
@@ -18,9 +18,9 @@
 #include <string>
 
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing.h"
 #include "common_audio/channel_buffer.h"
 #include "common_audio/include/audio_util.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/test/api_call_statistics.h"
 #include "modules/audio_processing/test/fake_recording_device.h"
 #include "modules/audio_processing/test/test_utils.h"
diff --git a/modules/audio_processing/test/audioproc_float_impl.cc b/modules/audio_processing/test/audioproc_float_impl.cc
index c23ec74..980b80a 100644
--- a/modules/audio_processing/test/audioproc_float_impl.cc
+++ b/modules/audio_processing/test/audioproc_float_impl.cc
@@ -21,7 +21,7 @@
 #include "absl/flags/flag.h"
 #include "absl/flags/parse.h"
 #include "absl/strings/string_view.h"
-#include "modules/audio_processing/include/audio_processing.h"
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/test/aec_dump_based_simulator.h"
 #include "modules/audio_processing/test/audio_processing_simulator.h"
 #include "modules/audio_processing/test/wav_based_simulator.h"
diff --git a/modules/audio_processing/test/audioproc_float_impl.h b/modules/audio_processing/test/audioproc_float_impl.h
index 5ed3aef..55ded26 100644
--- a/modules/audio_processing/test/audioproc_float_impl.h
+++ b/modules/audio_processing/test/audioproc_float_impl.h
@@ -13,7 +13,7 @@
 
 #include <memory>
 
-#include "modules/audio_processing/include/audio_processing.h"
+#include "api/audio/audio_processing.h"
 
 namespace webrtc {
 namespace test {
diff --git a/modules/audio_processing/test/debug_dump_replayer.h b/modules/audio_processing/test/debug_dump_replayer.h
index 077147e..2768f18 100644
--- a/modules/audio_processing/test/debug_dump_replayer.h
+++ b/modules/audio_processing/test/debug_dump_replayer.h
@@ -14,8 +14,8 @@
 #include <memory>
 
 #include "absl/strings/string_view.h"
+#include "api/audio/audio_processing.h"
 #include "common_audio/channel_buffer.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 // Generated at build-time by the protobuf compiler.
 #include "modules/audio_processing/debug.pb.h"
diff --git a/modules/audio_processing/test/runtime_setting_util.h b/modules/audio_processing/test/runtime_setting_util.h
index d8cbe82..85ed5ec 100644
--- a/modules/audio_processing/test/runtime_setting_util.h
+++ b/modules/audio_processing/test/runtime_setting_util.h
@@ -11,7 +11,7 @@
 #ifndef MODULES_AUDIO_PROCESSING_TEST_RUNTIME_SETTING_UTIL_H_
 #define MODULES_AUDIO_PROCESSING_TEST_RUNTIME_SETTING_UTIL_H_
 
-#include "modules/audio_processing/include/audio_processing.h"
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/test/protobuf_utils.h"
 
 namespace webrtc {
diff --git a/modules/audio_processing/test/simulator_buffers.h b/modules/audio_processing/test/simulator_buffers.h
index 36dcf30..4e1b086 100644
--- a/modules/audio_processing/test/simulator_buffers.h
+++ b/modules/audio_processing/test/simulator_buffers.h
@@ -14,8 +14,8 @@
 #include <memory>
 #include <vector>
 
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/audio_buffer.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "rtc_base/random.h"
 
 namespace webrtc {
diff --git a/modules/audio_processing/test/test_utils.h b/modules/audio_processing/test/test_utils.h
index bf82f9d..04e980f 100644
--- a/modules/audio_processing/test/test_utils.h
+++ b/modules/audio_processing/test/test_utils.h
@@ -21,9 +21,9 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
+#include "api/audio/audio_processing.h"
 #include "common_audio/channel_buffer.h"
 #include "common_audio/wav_file.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 1e1e4ba..42763b4 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -907,6 +907,7 @@
     "../api:rtp_parameters",
     "../api:scoped_refptr",
     "../api:sequence_checker",
+    "../api/audio:audio_processing_statistics",
     "../api/task_queue:task_queue",
     "../api/units:time_delta",
     "../api/video:video_rtp_headers",
@@ -916,7 +917,6 @@
     "../media:media_channel",
     "../media:media_channel_impl",
     "../modules/audio_device",
-    "../modules/audio_processing:audio_processing_statistics",
     "../modules/rtp_rtcp:rtp_rtcp_format",
     "../p2p:connection",
     "../p2p:connection_info",
@@ -1225,11 +1225,11 @@
     "../api:rtp_sender_interface",
     "../api:scoped_refptr",
     "../api:sequence_checker",
+    "../api/audio:audio_processing_statistics",
     "../api/audio_codecs:audio_codecs_api",
     "../api/video:video_rtp_headers",
     "../call:call_interfaces",
     "../media:media_channel",
-    "../modules/audio_processing:audio_processing_statistics",
     "../p2p:connection",
     "../p2p:connection_info",
     "../p2p:ice_transport_internal",
@@ -2146,6 +2146,7 @@
       "../api:rtc_stats_api",
       "../api:scoped_refptr",
       "../api/audio:audio_mixer_api",
+      "../api/audio:audio_processing",
       "../api/audio_codecs:audio_codecs_api",
       "../api/audio_codecs:builtin_audio_decoder_factory",
       "../api/audio_codecs:builtin_audio_encoder_factory",
@@ -2164,7 +2165,6 @@
       "../api/video_codecs:video_encoder_factory_template_open_h264_adapter",
       "../media:rtc_media_tests_utils",
       "../modules/audio_device:audio_device_api",
-      "../modules/audio_processing:api",
       "../p2p:basic_port_allocator",
       "../p2p:connection",
       "../p2p:p2p_test_utils",
@@ -2368,6 +2368,8 @@
       "../api:scoped_refptr",
       "../api/adaptation:resource_adaptation_api",
       "../api/audio:audio_mixer_api",
+      "../api/audio:audio_processing",
+      "../api/audio:audio_processing_statistics",
       "../api/crypto:frame_decryptor_interface",
       "../api/crypto:frame_encryptor_interface",
       "../api/crypto:options",
@@ -2403,7 +2405,6 @@
       "../media:rtc_media_config",
       "../media:stream_params",
       "../modules/audio_device:audio_device_api",
-      "../modules/audio_processing:audio_processing_statistics",
       "../modules/rtp_rtcp:rtp_rtcp_format",
       "../p2p:basic_port_allocator",
       "../p2p:connection",
@@ -2501,7 +2502,6 @@
       "../media:rtc_audio_video",
       "../media:rtc_media_tests_utils",
       "../modules/audio_processing",
-      "../modules/audio_processing:api",
       "../p2p:p2p_test_utils",
       "../p2p:rtc_p2p",
       "../rtc_base:safe_conversions",
@@ -2598,6 +2598,7 @@
       "../api:rtp_transceiver_direction",
       "../api:scoped_refptr",
       "../api/audio:audio_mixer_api",
+      "../api/audio:audio_processing",
       "../api/crypto:frame_decryptor_interface",
       "../api/crypto:frame_encryptor_interface",
       "../api/crypto:options",
@@ -2620,8 +2621,6 @@
       "../media:rtc_media_tests_utils",
       "../media:stream_params",
       "../modules/audio_device:audio_device_api",
-      "../modules/audio_processing:api",
-      "../modules/audio_processing:audio_processing_statistics",
       "../modules/audio_processing:audioproc_test_utils",
       "../modules/rtp_rtcp:rtp_rtcp_format",
       "../p2p:basic_port_allocator",
@@ -2750,6 +2749,7 @@
       "../api:scoped_refptr",
       "../api:sequence_checker",
       "../api/audio:audio_mixer_api",
+      "../api/audio:audio_processing",
       "../api/audio_codecs:audio_codecs_api",
       "../api/environment",
       "../api/environment:environment_factory",
@@ -2780,7 +2780,6 @@
       "../media:video_broadcaster",
       "../modules/audio_device",
       "../modules/audio_processing",
-      "../modules/audio_processing:api",
       "../modules/rtp_rtcp:rtp_rtcp_format",
       "../p2p:connection",
       "../p2p:fake_port_allocator",
diff --git a/pc/legacy_stats_collector.cc b/pc/legacy_stats_collector.cc
index 45e6872..800f63c 100644
--- a/pc/legacy_stats_collector.cc
+++ b/pc/legacy_stats_collector.cc
@@ -22,6 +22,7 @@
 
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing_statistics.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/candidate.h"
 #include "api/data_channel_interface.h"
@@ -34,7 +35,6 @@
 #include "api/video/video_timing.h"
 #include "call/call.h"
 #include "media/base/media_channel.h"
-#include "modules/audio_processing/include/audio_processing_statistics.h"
 #include "p2p/base/ice_transport_internal.h"
 #include "p2p/base/p2p_constants.h"
 #include "pc/channel.h"
diff --git a/pc/legacy_stats_collector_unittest.cc b/pc/legacy_stats_collector_unittest.cc
index af3d303..f372dca 100644
--- a/pc/legacy_stats_collector_unittest.cc
+++ b/pc/legacy_stats_collector_unittest.cc
@@ -16,6 +16,7 @@
 
 #include "absl/algorithm/container.h"
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing_statistics.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/candidate.h"
 #include "api/data_channel_interface.h"
@@ -25,7 +26,6 @@
 #include "api/scoped_refptr.h"
 #include "call/call.h"
 #include "media/base/media_channel.h"
-#include "modules/audio_processing/include/audio_processing_statistics.h"
 #include "p2p/base/ice_transport_internal.h"
 #include "pc/media_stream.h"
 #include "pc/rtp_receiver.h"
diff --git a/pc/peer_connection_bundle_unittest.cc b/pc/peer_connection_bundle_unittest.cc
index 12ab994..269f6c7 100644
--- a/pc/peer_connection_bundle_unittest.cc
+++ b/pc/peer_connection_bundle_unittest.cc
@@ -20,6 +20,7 @@
 #include <vector>
 
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/candidate.h"
@@ -46,7 +47,6 @@
 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h"
 #include "media/base/stream_params.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "p2p/base/p2p_constants.h"
 #include "p2p/base/port.h"
 #include "p2p/base/port_allocator.h"
diff --git a/pc/peer_connection_crypto_unittest.cc b/pc/peer_connection_crypto_unittest.cc
index 1d90e04..57c6c1a 100644
--- a/pc/peer_connection_crypto_unittest.cc
+++ b/pc/peer_connection_crypto_unittest.cc
@@ -20,6 +20,7 @@
 
 #include "absl/types/optional.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/create_peerconnection_factory.h"
@@ -38,7 +39,6 @@
 #include "api/video_codecs/video_encoder_factory_template_libvpx_vp9_adapter.h"
 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "p2p/base/fake_port_allocator.h"
 #include "p2p/base/port_allocator.h"
 #include "p2p/base/transport_description.h"
diff --git a/pc/peer_connection_factory_unittest.cc b/pc/peer_connection_factory_unittest.cc
index 618ac68..d2e8938 100644
--- a/pc/peer_connection_factory_unittest.cc
+++ b/pc/peer_connection_factory_unittest.cc
@@ -16,6 +16,7 @@
 #include <vector>
 
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/create_peerconnection_factory.h"
@@ -38,7 +39,6 @@
 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h"
 #include "media/base/fake_frame_source.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "p2p/base/fake_port_allocator.h"
 #include "p2p/base/port.h"
 #include "p2p/base/port_allocator.h"
diff --git a/pc/peer_connection_ice_unittest.cc b/pc/peer_connection_ice_unittest.cc
index 78d3103..a4b29af 100644
--- a/pc/peer_connection_ice_unittest.cc
+++ b/pc/peer_connection_ice_unittest.cc
@@ -20,6 +20,7 @@
 
 #include "absl/types/optional.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/candidate.h"
 #include "api/ice_transport_interface.h"
 #include "api/jsep.h"
@@ -28,7 +29,6 @@
 #include "api/rtc_error.h"
 #include "api/scoped_refptr.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "p2p/base/fake_port_allocator.h"
 #include "p2p/base/ice_transport_internal.h"
 #include "p2p/base/p2p_constants.h"
diff --git a/pc/peer_connection_interface_unittest.cc b/pc/peer_connection_interface_unittest.cc
index 71c85d4..97934ba 100644
--- a/pc/peer_connection_interface_unittest.cc
+++ b/pc/peer_connection_interface_unittest.cc
@@ -20,6 +20,7 @@
 #include "absl/strings/str_replace.h"
 #include "absl/types/optional.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/create_peerconnection_factory.h"
@@ -55,7 +56,6 @@
 #include "media/engine/webrtc_media_engine.h"
 #include "media/sctp/sctp_transport_internal.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "p2p/base/fake_port_allocator.h"
 #include "p2p/base/p2p_constants.h"
 #include "p2p/base/port.h"
diff --git a/pc/peer_connection_rampup_tests.cc b/pc/peer_connection_rampup_tests.cc
index cc645a0..60e7abc 100644
--- a/pc/peer_connection_rampup_tests.cc
+++ b/pc/peer_connection_rampup_tests.cc
@@ -15,6 +15,7 @@
 
 #include "absl/types/optional.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/audio_options.h"
@@ -40,7 +41,6 @@
 #include "api/video_codecs/video_encoder_factory_template_libvpx_vp9_adapter.h"
 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "p2p/base/port_allocator.h"
 #include "p2p/base/port_interface.h"
 #include "p2p/base/test_turn_server.h"
diff --git a/pc/peer_connection_rtp_unittest.cc b/pc/peer_connection_rtp_unittest.cc
index 77c8cec..c162dfd 100644
--- a/pc/peer_connection_rtp_unittest.cc
+++ b/pc/peer_connection_rtp_unittest.cc
@@ -18,6 +18,7 @@
 
 #include "absl/types/optional.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/create_peerconnection_factory.h"
@@ -46,7 +47,6 @@
 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h"
 #include "media/base/stream_params.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "p2p/base/port_allocator.h"
 #include "pc/media_session.h"
 #include "pc/peer_connection_wrapper.h"
diff --git a/pc/peer_connection_signaling_unittest.cc b/pc/peer_connection_signaling_unittest.cc
index 7764be9..64d393a 100644
--- a/pc/peer_connection_signaling_unittest.cc
+++ b/pc/peer_connection_signaling_unittest.cc
@@ -25,6 +25,7 @@
 
 #include "absl/types/optional.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/create_peerconnection_factory.h"
@@ -51,7 +52,6 @@
 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h"
 #include "media/base/codec.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "p2p/base/port_allocator.h"
 #include "pc/peer_connection.h"
 #include "pc/peer_connection_proxy.h"
diff --git a/pc/peer_connection_simulcast_unittest.cc b/pc/peer_connection_simulcast_unittest.cc
index 06f3884..b4b998a 100644
--- a/pc/peer_connection_simulcast_unittest.cc
+++ b/pc/peer_connection_simulcast_unittest.cc
@@ -21,6 +21,7 @@
 #include "absl/strings/match.h"
 #include "absl/strings/string_view.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/audio_codecs/opus_audio_decoder_factory.h"
@@ -51,7 +52,6 @@
 #include "media/base/rid_description.h"
 #include "media/base/stream_params.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "pc/channel_interface.h"
 #include "pc/peer_connection_wrapper.h"
 #include "pc/sdp_utils.h"
diff --git a/pc/rtc_stats_collector.cc b/pc/rtc_stats_collector.cc
index 1f94b0e..1342fff 100644
--- a/pc/rtc_stats_collector.cc
+++ b/pc/rtc_stats_collector.cc
@@ -25,6 +25,7 @@
 #include "absl/functional/bind_front.h"
 #include "absl/strings/string_view.h"
 #include "api/array_view.h"
+#include "api/audio/audio_processing_statistics.h"
 #include "api/candidate.h"
 #include "api/dtls_transport_interface.h"
 #include "api/media_stream_interface.h"
@@ -40,7 +41,6 @@
 #include "media/base/media_channel.h"
 #include "media/base/media_channel_impl.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing_statistics.h"
 #include "modules/rtp_rtcp/include/report_block_data.h"
 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "p2p/base/connection_info.h"
diff --git a/pc/rtc_stats_collector_unittest.cc b/pc/rtc_stats_collector_unittest.cc
index 6c4cd69..7b3160e 100644
--- a/pc/rtc_stats_collector_unittest.cc
+++ b/pc/rtc_stats_collector_unittest.cc
@@ -24,6 +24,7 @@
 
 #include "absl/strings/str_replace.h"
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing_statistics.h"
 #include "api/candidate.h"
 #include "api/dtls_transport_interface.h"
 #include "api/media_stream_interface.h"
@@ -46,7 +47,6 @@
 #include "common_video/include/quality_limitation_reason.h"
 #include "media/base/media_channel.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing_statistics.h"
 #include "modules/rtp_rtcp/include/report_block_data.h"
 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "p2p/base/connection_info.h"
diff --git a/pc/sdp_offer_answer_unittest.cc b/pc/sdp_offer_answer_unittest.cc
index 2e77f88..2043ae8 100644
--- a/pc/sdp_offer_answer_unittest.cc
+++ b/pc/sdp_offer_answer_unittest.cc
@@ -14,6 +14,7 @@
 
 #include "absl/strings/str_replace.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/create_peerconnection_factory.h"
@@ -32,7 +33,6 @@
 #include "api/video_codecs/video_encoder_factory_template_libvpx_vp9_adapter.h"
 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "p2p/base/port_allocator.h"
 #include "pc/peer_connection_wrapper.h"
 #include "pc/session_description.h"
diff --git a/pc/test/integration_test_helpers.h b/pc/test/integration_test_helpers.h
index e1de1b3..b539a87 100644
--- a/pc/test/integration_test_helpers.h
+++ b/pc/test/integration_test_helpers.h
@@ -30,6 +30,7 @@
 #include "absl/memory/memory.h"
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio_options.h"
 #include "api/candidate.h"
 #include "api/crypto/crypto_options.h"
@@ -69,7 +70,6 @@
 #include "media/base/stream_params.h"
 #include "media/engine/fake_webrtc_video_engine.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/test/audio_processing_builder_for_testing.h"
 #include "p2p/base/fake_ice_transport.h"
 #include "p2p/base/ice_transport_internal.h"
diff --git a/pc/test/peer_connection_test_wrapper.cc b/pc/test/peer_connection_test_wrapper.cc
index 63e9912..068768b 100644
--- a/pc/test/peer_connection_test_wrapper.cc
+++ b/pc/test/peer_connection_test_wrapper.cc
@@ -20,6 +20,7 @@
 #include "absl/strings/match.h"
 #include "absl/types/optional.h"
 #include "api/audio/audio_mixer.h"
+#include "api/audio/audio_processing.h"
 #include "api/create_peerconnection_factory.h"
 #include "api/environment/environment.h"
 #include "api/media_types.h"
@@ -38,7 +39,6 @@
 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h"
 #include "media/engine/simulcast_encoder_adapter.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "p2p/base/fake_port_allocator.h"
 #include "p2p/base/port_allocator.h"
 #include "pc/test/fake_periodic_video_source.h"
diff --git a/rtc_tools/BUILD.gn b/rtc_tools/BUILD.gn
index f14877d..fa0ab39 100644
--- a/rtc_tools/BUILD.gn
+++ b/rtc_tools/BUILD.gn
@@ -639,8 +639,8 @@
         sources = [ "audioproc_f/audioproc_float_main.cc" ]
         deps = [
           "../api:audioproc_f_api",
+          "../api/audio:audio_processing",
           "../modules/audio_processing",
-          "../modules/audio_processing:api",
         ]
       }
 
diff --git a/rtc_tools/audioproc_f/audioproc_float_main.cc b/rtc_tools/audioproc_f/audioproc_float_main.cc
index 3cc6d43..3acf8fa 100644
--- a/rtc_tools/audioproc_f/audioproc_float_main.cc
+++ b/rtc_tools/audioproc_f/audioproc_float_main.cc
@@ -10,8 +10,8 @@
 
 #include <memory>
 
+#include "api/audio/audio_processing.h"
 #include "api/test/audioproc_float.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 int main(int argc, char* argv[]) {
   return webrtc::test::AudioprocFloat(
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index d31673e..8dba298 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -1066,6 +1066,7 @@
         "../api:rtp_parameters",
         "../api:rtp_sender_interface",
         "../api:scoped_refptr",
+        "../api/audio:audio_processing",
         "../api/audio_codecs:audio_codecs_api",
         "../api/audio_codecs:builtin_audio_decoder_factory",
         "../api/audio_codecs:builtin_audio_encoder_factory",
@@ -1082,7 +1083,6 @@
         "../media:rtc_media_base",
         "../modules/audio_device:audio_device_api",
         "../modules/audio_processing",
-        "../modules/audio_processing:api",
         "../modules/video_coding:video_codec_interface",
         "../pc:peer_connection_factory",
         "../pc:webrtc_sdp",
@@ -1169,6 +1169,7 @@
             ":videosource_objc",
             ":videotoolbox_objc",
             "../api:scoped_refptr",
+            "../api/audio:audio_processing",
             "../api/audio_codecs:builtin_audio_decoder_factory",
             "../api/audio_codecs:builtin_audio_encoder_factory",
             "../api/environment:environment_factory",
@@ -1180,7 +1181,6 @@
             "../media:rtc_media_base",
             "../media:rtc_media_tests_utils",
             "../modules/audio_device:audio_device_api",
-            "../modules/audio_processing:api",
             "../modules/video_coding:video_codec_interface",
             "../rtc_base:gunit_helpers",
             "../rtc_base:macromagic",
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 8858d21..ea640ab 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -573,8 +573,8 @@
       "../../api:field_trials_view",
       "../../api:scoped_refptr",
       "../../api:sequence_checker",
+      "../../api/audio:audio_processing",
       "../../api/task_queue:pending_task_safety_flag",
-      "../../modules/audio_processing:api",
       "../../rtc_base:checks",
       "../../rtc_base:ip_address",
       "../../rtc_base:logging",
@@ -598,8 +598,8 @@
 
     deps = [
       ":base_jni",
+      "../../api/audio:audio_processing",
       "../../modules/audio_processing",
-      "../../modules/audio_processing:api",
     ]
   }
 
@@ -782,6 +782,7 @@
       "../../api:rtp_parameters",
       "../../api:rtp_sender_interface",
       "../../api:turn_customizer",
+      "../../api/audio:audio_processing",
       "../../api/crypto:options",
       "../../api/rtc_event_log:rtc_event_log_factory",
       "../../api/task_queue:default_task_queue_factory",
@@ -789,7 +790,6 @@
       "../../call:call_interfaces",
       "../../media:rtc_media_base",
       "../../modules/audio_device",
-      "../../modules/audio_processing:api",
       "../../modules/utility",
       "../../pc:media_stream_observer",
       "../../pc:peer_connection_factory",
@@ -1659,7 +1659,6 @@
       "../../media:rtc_internal_video_codecs",
       "../../modules/audio_device",
       "../../modules/audio_device:mock_audio_device",
-      "../../modules/audio_processing:api",
       "../../modules/utility",
       "../../pc:libjingle_peerconnection",
       "../../rtc_base:checks",
diff --git a/sdk/android/src/jni/pc/audio.cc b/sdk/android/src/jni/pc/audio.cc
index 74c8b55..bf99203 100644
--- a/sdk/android/src/jni/pc/audio.cc
+++ b/sdk/android/src/jni/pc/audio.cc
@@ -10,7 +10,7 @@
 
 #include "sdk/android/src/jni/pc/audio.h"
 
-#include "modules/audio_processing/include/audio_processing.h"
+#include "api/audio/audio_processing.h"
 
 namespace webrtc {
 namespace jni {
diff --git a/sdk/android/src/jni/pc/audio.h b/sdk/android/src/jni/pc/audio.h
index 09fcaf1..41aaa08 100644
--- a/sdk/android/src/jni/pc/audio.h
+++ b/sdk/android/src/jni/pc/audio.h
@@ -11,8 +11,8 @@
 #ifndef SDK_ANDROID_SRC_JNI_PC_AUDIO_H_
 #define SDK_ANDROID_SRC_JNI_PC_AUDIO_H_
 
+#include "api/audio/audio_processing.h"
 #include "api/scoped_refptr.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 namespace jni {
diff --git a/sdk/android/src/jni/pc/peer_connection_factory.cc b/sdk/android/src/jni/pc/peer_connection_factory.cc
index 9a21e10..ace3a56 100644
--- a/sdk/android/src/jni/pc/peer_connection_factory.cc
+++ b/sdk/android/src/jni/pc/peer_connection_factory.cc
@@ -14,13 +14,13 @@
 #include <utility>
 
 #include "absl/memory/memory.h"
+#include "api/audio/audio_processing.h"
 #include "api/enable_media.h"
 #include "api/rtc_event_log/rtc_event_log_factory.h"
 #include "api/task_queue/default_task_queue_factory.h"
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder_factory.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/utility/include/jvm_android.h"
 #include "rtc_base/event_tracer.h"
 #include "rtc_base/physical_socket_server.h"
diff --git a/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm b/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm
index 64be41a..6a393b0 100644
--- a/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm
+++ b/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm
@@ -31,6 +31,7 @@
 #include "sdk/objc/native/api/ssl_certificate_verifier.h"
 #include "system_wrappers/include/field_trial.h"
 
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/enable_media.h"
@@ -41,7 +42,6 @@
 #import "components/video_codec/RTCVideoEncoderFactoryH264.h"
 #include "media/base/media_constants.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 #include "sdk/objc/native/api/objc_audio_device_module.h"
 #include "sdk/objc/native/api/video_decoder_factory.h"
diff --git a/sdk/objc/api/peerconnection/RTCPeerConnectionFactoryBuilder.mm b/sdk/objc/api/peerconnection/RTCPeerConnectionFactoryBuilder.mm
index 627909a..caec4a6 100644
--- a/sdk/objc/api/peerconnection/RTCPeerConnectionFactoryBuilder.mm
+++ b/sdk/objc/api/peerconnection/RTCPeerConnectionFactoryBuilder.mm
@@ -11,12 +11,12 @@
 #import "RTCPeerConnectionFactoryBuilder.h"
 #import "RTCPeerConnectionFactory+Native.h"
 
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder_factory.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 @implementation RTCPeerConnectionFactoryBuilder {
   std::unique_ptr<webrtc::VideoEncoderFactory> _videoEncoderFactory;
diff --git a/sdk/objc/unittests/RTCPeerConnectionFactoryBuilderTest.mm b/sdk/objc/unittests/RTCPeerConnectionFactoryBuilderTest.mm
index 5ba5a52..83dc38e 100644
--- a/sdk/objc/unittests/RTCPeerConnectionFactoryBuilderTest.mm
+++ b/sdk/objc/unittests/RTCPeerConnectionFactoryBuilderTest.mm
@@ -21,12 +21,12 @@
 #import "api/peerconnection/RTCPeerConnectionFactoryBuilder+DefaultComponents.h"
 #import "api/peerconnection/RTCPeerConnectionFactoryBuilder.h"
 
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder_factory.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 #include "rtc_base/gunit.h"
 #include "rtc_base/system/unused.h"
diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn
index 3f5074e..623347e 100644
--- a/test/fuzzers/BUILD.gn
+++ b/test/fuzzers/BUILD.gn
@@ -490,8 +490,8 @@
   deps = [
     ":fuzz_data_helper",
     "../../api/audio:audio_frame_api",
+    "../../api/audio:audio_processing",
     "../../modules/audio_processing",
-    "../../modules/audio_processing:api",
     "../../modules/audio_processing:audio_frame_proxies",
     "../../rtc_base:checks",
   ]
@@ -504,11 +504,11 @@
     ":audio_processing_fuzzer_helper",
     "../../api:scoped_refptr",
     "../../api/audio:aec3_factory",
+    "../../api/audio:audio_processing",
     "../../api/audio:echo_detector_creator",
     "../../api/task_queue",
     "../../api/task_queue:default_task_queue_factory",
     "../../modules/audio_processing",
-    "../../modules/audio_processing:api",
     "../../modules/audio_processing:audio_buffer",
     "../../modules/audio_processing:audioproc_test_utils",
     "../../modules/audio_processing/aec3",
@@ -530,8 +530,8 @@
   deps = [
     "../../api:scoped_refptr",
     "../../api/audio:audio_frame_api",
+    "../../api/audio:audio_processing",
     "../../modules/audio_processing",
-    "../../modules/audio_processing:api",
     "../../modules/audio_processing:audio_frame_proxies",
     "../../modules/audio_processing:audioproc_test_utils",
     "../../rtc_base:checks",
@@ -544,8 +544,8 @@
   sources = [ "agc_fuzzer.cc" ]
   deps = [
     ":fuzz_data_helper",
+    "../../api/audio:audio_processing",
     "../../modules/audio_processing",
-    "../../modules/audio_processing:api",
     "../../modules/audio_processing:audio_buffer",
     "../../rtc_base:macromagic",
     "../../rtc_base:safe_minmax",
@@ -575,7 +575,7 @@
   sources = [ "aec3_fuzzer.cc" ]
   deps = [
     ":fuzz_data_helper",
-    "../../modules/audio_processing:api",
+    "../../api/audio:audio_processing",
     "../../modules/audio_processing:audio_buffer",
     "../../modules/audio_processing/aec3",
   ]
diff --git a/test/fuzzers/aec3_fuzzer.cc b/test/fuzzers/aec3_fuzzer.cc
index a12ca30..2e6d12e 100644
--- a/test/fuzzers/aec3_fuzzer.cc
+++ b/test/fuzzers/aec3_fuzzer.cc
@@ -9,9 +9,9 @@
  */
 
 #include "absl/types/optional.h"
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/aec3/echo_canceller3.h"
 #include "modules/audio_processing/audio_buffer.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "test/fuzzers/fuzz_data_helper.h"
 
 namespace webrtc {
diff --git a/test/fuzzers/agc_fuzzer.cc b/test/fuzzers/agc_fuzzer.cc
index 0586708..de64c8e 100644
--- a/test/fuzzers/agc_fuzzer.cc
+++ b/test/fuzzers/agc_fuzzer.cc
@@ -10,9 +10,9 @@
 
 #include <memory>
 
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/audio_buffer.h"
 #include "modules/audio_processing/gain_control_impl.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "rtc_base/numerics/safe_minmax.h"
 #include "rtc_base/thread_annotations.h"
 #include "test/fuzzers/fuzz_data_helper.h"
diff --git a/test/fuzzers/audio_processing_configs_fuzzer.cc b/test/fuzzers/audio_processing_configs_fuzzer.cc
index 93bce2f..89c0b5b 100644
--- a/test/fuzzers/audio_processing_configs_fuzzer.cc
+++ b/test/fuzzers/audio_processing_configs_fuzzer.cc
@@ -13,12 +13,12 @@
 
 #include "absl/base/nullability.h"
 #include "absl/memory/memory.h"
+#include "api/audio/audio_processing.h"
 #include "api/audio/echo_canceller3_factory.h"
 #include "api/audio/echo_detector_creator.h"
 #include "api/task_queue/default_task_queue_factory.h"
 #include "api/task_queue/task_queue_base.h"
 #include "modules/audio_processing/aec_dump/aec_dump_factory.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "modules/audio_processing/test/audio_processing_builder_for_testing.h"
 #include "rtc_base/arraysize.h"
 #include "rtc_base/numerics/safe_minmax.h"
diff --git a/test/fuzzers/audio_processing_fuzzer_helper.cc b/test/fuzzers/audio_processing_fuzzer_helper.cc
index 5252918..b852900 100644
--- a/test/fuzzers/audio_processing_fuzzer_helper.cc
+++ b/test/fuzzers/audio_processing_fuzzer_helper.cc
@@ -16,8 +16,8 @@
 #include <limits>
 
 #include "api/audio/audio_frame.h"
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/include/audio_frame_proxies.h"
-#include "modules/audio_processing/include/audio_processing.h"
 #include "rtc_base/checks.h"
 
 namespace webrtc {
diff --git a/test/fuzzers/audio_processing_fuzzer_helper.h b/test/fuzzers/audio_processing_fuzzer_helper.h
index a604db8..e746c33 100644
--- a/test/fuzzers/audio_processing_fuzzer_helper.h
+++ b/test/fuzzers/audio_processing_fuzzer_helper.h
@@ -13,7 +13,7 @@
 
 #include <memory>
 
-#include "modules/audio_processing/include/audio_processing.h"
+#include "api/audio/audio_processing.h"
 #include "test/fuzzers/fuzz_data_helper.h"
 namespace webrtc {
 
diff --git a/test/fuzzers/audio_processing_sample_rate_fuzzer.cc b/test/fuzzers/audio_processing_sample_rate_fuzzer.cc
index ca39469..96e99f5 100644
--- a/test/fuzzers/audio_processing_sample_rate_fuzzer.cc
+++ b/test/fuzzers/audio_processing_sample_rate_fuzzer.cc
@@ -13,7 +13,7 @@
 #include <cmath>
 #include <limits>
 
-#include "modules/audio_processing/include/audio_processing.h"
+#include "api/audio/audio_processing.h"
 #include "modules/audio_processing/test/audio_processing_builder_for_testing.h"
 #include "rtc_base/checks.h"
 #include "test/fuzzers/fuzz_data_helper.h"
diff --git a/test/pc/e2e/BUILD.gn b/test/pc/e2e/BUILD.gn
index 3b486ab..c4cc0e1 100644
--- a/test/pc/e2e/BUILD.gn
+++ b/test/pc/e2e/BUILD.gn
@@ -67,11 +67,11 @@
         "../../../api:libjingle_peerconnection_api",
         "../../../api:scoped_refptr",
         "../../../api:sequence_checker",
+        "../../../api/audio:audio_processing",
         "../../../api/task_queue:pending_task_safety_flag",
         "../../../api/test/pclf:media_configuration",
         "../../../api/test/pclf:media_quality_test_params",
         "../../../api/test/pclf:peer_configurer",
-        "../../../modules/audio_processing:api",
         "../../../pc:peerconnection_wrapper",
         "../../../rtc_base:logging",
         "../../../rtc_base:refcount",
diff --git a/test/pc/e2e/test_peer.cc b/test/pc/e2e/test_peer.cc
index b3a9e1c..d1f4534 100644
--- a/test/pc/e2e/test_peer.cc
+++ b/test/pc/e2e/test_peer.cc
@@ -14,10 +14,10 @@
 
 #include "absl/memory/memory.h"
 #include "absl/strings/string_view.h"
+#include "api/audio/audio_processing.h"
 #include "api/scoped_refptr.h"
 #include "api/test/pclf/media_configuration.h"
 #include "api/test/pclf/peer_configurer.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {
 namespace webrtc_pc_e2e {
diff --git a/webrtc_lib_link_test.cc b/webrtc_lib_link_test.cc
index e129ad5..0148a54 100644
--- a/webrtc_lib_link_test.cc
+++ b/webrtc_lib_link_test.cc
@@ -8,6 +8,7 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
+#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/audio_decoder_factory_template.h"
 #include "api/audio_codecs/audio_encoder_factory_template.h"
 #include "api/audio_codecs/opus/audio_decoder_opus.h"
@@ -29,7 +30,6 @@
 #include "api/video_codecs/video_encoder_factory_template_libvpx_vp9_adapter.h"
 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h"
 #include "modules/audio_device/include/audio_device.h"
-#include "modules/audio_processing/include/audio_processing.h"
 
 namespace webrtc {