blob: 2f27cb4ed8e7a727f0368b7de73a493b0d166abd [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.
32 virtual void ProcessCapture(AudioBuffer* capture, bool echo_path_change) = 0;
33
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
Gustaf Ullberg8675eee2019-10-09 13:34:36 +020051 // Returns wheter the signal is altered.
52 virtual bool ActiveProcessing() const = 0;
53
Gustaf Ullberg8e467df2018-02-05 14:39:38 +010054 virtual ~EchoControl() {}
55};
56
57// Interface for a factory that creates EchoControllers.
58class EchoControlFactory {
59 public:
Per Åhgren4e5c7092019-11-01 20:44:11 +010060 virtual std::unique_ptr<EchoControl> Create(int sample_rate_hz,
61 int num_render_channels,
Gustaf Ullberg2c6f3732019-11-07 17:15:12 +010062 int num_capture_channels) = 0;
Per Åhgren4e5c7092019-11-01 20:44:11 +010063
Gustaf Ullberg8e467df2018-02-05 14:39:38 +010064 virtual ~EchoControlFactory() = default;
65};
66} // namespace webrtc
67
Gustaf Ullbergfd4ce502018-02-15 10:09:09 +010068#endif // API_AUDIO_ECHO_CONTROL_H_