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