xref: /aosp_15_r20/external/webrtc/api/audio/echo_control.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef API_AUDIO_ECHO_CONTROL_H_
12*d9f75844SAndroid Build Coastguard Worker #define API_AUDIO_ECHO_CONTROL_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <memory>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker class AudioBuffer;
21*d9f75844SAndroid Build Coastguard Worker 
22*d9f75844SAndroid Build Coastguard Worker // Interface for an acoustic echo cancellation (AEC) submodule.
23*d9f75844SAndroid Build Coastguard Worker class EchoControl {
24*d9f75844SAndroid Build Coastguard Worker  public:
25*d9f75844SAndroid Build Coastguard Worker   // Analysis (not changing) of the render signal.
26*d9f75844SAndroid Build Coastguard Worker   virtual void AnalyzeRender(AudioBuffer* render) = 0;
27*d9f75844SAndroid Build Coastguard Worker 
28*d9f75844SAndroid Build Coastguard Worker   // Analysis (not changing) of the capture signal.
29*d9f75844SAndroid Build Coastguard Worker   virtual void AnalyzeCapture(AudioBuffer* capture) = 0;
30*d9f75844SAndroid Build Coastguard Worker 
31*d9f75844SAndroid Build Coastguard Worker   // Processes the capture signal in order to remove the echo.
32*d9f75844SAndroid Build Coastguard Worker   virtual void ProcessCapture(AudioBuffer* capture, bool level_change) = 0;
33*d9f75844SAndroid Build Coastguard Worker 
34*d9f75844SAndroid Build Coastguard Worker   // As above, but also returns the linear filter output.
35*d9f75844SAndroid Build Coastguard Worker   virtual void ProcessCapture(AudioBuffer* capture,
36*d9f75844SAndroid Build Coastguard Worker                               AudioBuffer* linear_output,
37*d9f75844SAndroid Build Coastguard Worker                               bool level_change) = 0;
38*d9f75844SAndroid Build Coastguard Worker 
39*d9f75844SAndroid Build Coastguard Worker   struct Metrics {
40*d9f75844SAndroid Build Coastguard Worker     double echo_return_loss;
41*d9f75844SAndroid Build Coastguard Worker     double echo_return_loss_enhancement;
42*d9f75844SAndroid Build Coastguard Worker     int delay_ms;
43*d9f75844SAndroid Build Coastguard Worker   };
44*d9f75844SAndroid Build Coastguard Worker 
45*d9f75844SAndroid Build Coastguard Worker   // Collect current metrics from the echo controller.
46*d9f75844SAndroid Build Coastguard Worker   virtual Metrics GetMetrics() const = 0;
47*d9f75844SAndroid Build Coastguard Worker 
48*d9f75844SAndroid Build Coastguard Worker   // Provides an optional external estimate of the audio buffer delay.
49*d9f75844SAndroid Build Coastguard Worker   virtual void SetAudioBufferDelay(int delay_ms) = 0;
50*d9f75844SAndroid Build Coastguard Worker 
51*d9f75844SAndroid Build Coastguard Worker   // Specifies whether the capture output will be used. The purpose of this is
52*d9f75844SAndroid Build Coastguard Worker   // to allow the echo controller to deactivate some of the processing when the
53*d9f75844SAndroid Build Coastguard Worker   // resulting output is anyway not used, for instance when the endpoint is
54*d9f75844SAndroid Build Coastguard Worker   // muted.
55*d9f75844SAndroid Build Coastguard Worker   // TODO(b/177830919): Make pure virtual.
SetCaptureOutputUsage(bool capture_output_used)56*d9f75844SAndroid Build Coastguard Worker   virtual void SetCaptureOutputUsage(bool capture_output_used) {}
57*d9f75844SAndroid Build Coastguard Worker 
58*d9f75844SAndroid Build Coastguard Worker   // Returns wheter the signal is altered.
59*d9f75844SAndroid Build Coastguard Worker   virtual bool ActiveProcessing() const = 0;
60*d9f75844SAndroid Build Coastguard Worker 
~EchoControl()61*d9f75844SAndroid Build Coastguard Worker   virtual ~EchoControl() {}
62*d9f75844SAndroid Build Coastguard Worker };
63*d9f75844SAndroid Build Coastguard Worker 
64*d9f75844SAndroid Build Coastguard Worker // Interface for a factory that creates EchoControllers.
65*d9f75844SAndroid Build Coastguard Worker class EchoControlFactory {
66*d9f75844SAndroid Build Coastguard Worker  public:
67*d9f75844SAndroid Build Coastguard Worker   virtual std::unique_ptr<EchoControl> Create(int sample_rate_hz,
68*d9f75844SAndroid Build Coastguard Worker                                               int num_render_channels,
69*d9f75844SAndroid Build Coastguard Worker                                               int num_capture_channels) = 0;
70*d9f75844SAndroid Build Coastguard Worker 
71*d9f75844SAndroid Build Coastguard Worker   virtual ~EchoControlFactory() = default;
72*d9f75844SAndroid Build Coastguard Worker };
73*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
74*d9f75844SAndroid Build Coastguard Worker 
75*d9f75844SAndroid Build Coastguard Worker #endif  // API_AUDIO_ECHO_CONTROL_H_
76