blob: 74fbc27b124e3770f1e42f9da0709251e1bae7b6 [file] [log] [blame]
Gustaf Ullberg8e467df2018-02-05 14:39:38 +01001/*
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
Gustaf Ullbergfd4ce502018-02-15 10:09:09 +010011#ifndef API_AUDIO_ECHO_CONTROL_H_
12#define API_AUDIO_ECHO_CONTROL_H_
Gustaf Ullberg8e467df2018-02-05 14:39:38 +010013
14#include <memory>
15
Per Åhgren4e5c7092019-11-01 20:44:11 +010016#include "rtc_base/checks.h"
17
Gustaf Ullberg8e467df2018-02-05 14:39:38 +010018namespace webrtc {
19
20class AudioBuffer;
21
22// Interface for an acoustic echo cancellation (AEC) submodule.
23class 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.
Per Åhgren67d3bc22019-11-27 08:49:20 +010032 virtual void ProcessCapture(AudioBuffer* capture, bool level_change) = 0;
Gustaf Ullberg8e467df2018-02-05 14:39:38 +010033
Per Åhgrenc20a19c2019-11-13 11:12:29 +010034 // As above, but also returns the linear filter output.
Per Åhgrenc20a19c2019-11-13 11:12:29 +010035 virtual void ProcessCapture(AudioBuffer* capture,
36 AudioBuffer* linear_output,
Per Åhgren46474122019-11-27 09:10:21 +010037 bool level_change) = 0;
Per Åhgrenc20a19c2019-11-13 11:12:29 +010038
Gustaf Ullberg8e467df2018-02-05 14:39:38 +010039 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
Per Åhgrend0fa8202018-04-18 09:35:13 +020048 // Provides an optional external estimate of the audio buffer delay.
Gustaf Ullbergb394a562019-10-25 09:40:50 +020049 virtual void SetAudioBufferDelay(int delay_ms) = 0;
Per Åhgrend0fa8202018-04-18 09:35:13 +020050
Per Åhgren652ada52021-03-03 10:52:44 +000051 // Specifies whether the capture output will be used. The purpose of this is
52 // to allow the echo controller to deactivate some of the processing when the
53 // resulting output is anyway not used, for instance when the endpoint is
54 // muted.
55 // TODO(b/177830919): Make pure virtual.
56 virtual void SetCaptureOutputUsage(bool capture_output_used) {}
57
Gustaf Ullberg8675eee2019-10-09 13:34:36 +020058 // Returns wheter the signal is altered.
59 virtual bool ActiveProcessing() const = 0;
60
Gustaf Ullberg8e467df2018-02-05 14:39:38 +010061 virtual ~EchoControl() {}
62};
63
64// Interface for a factory that creates EchoControllers.
65class EchoControlFactory {
66 public:
Per Åhgren4e5c7092019-11-01 20:44:11 +010067 virtual std::unique_ptr<EchoControl> Create(int sample_rate_hz,
68 int num_render_channels,
Gustaf Ullberg2c6f3732019-11-07 17:15:12 +010069 int num_capture_channels) = 0;
Per Åhgren4e5c7092019-11-01 20:44:11 +010070
Gustaf Ullberg8e467df2018-02-05 14:39:38 +010071 virtual ~EchoControlFactory() = default;
72};
73} // namespace webrtc
74
Gustaf Ullbergfd4ce502018-02-15 10:09:09 +010075#endif // API_AUDIO_ECHO_CONTROL_H_