blob: b63f123df775c3cc0a203000294abc50c2e14c86 [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.
35 // TODO(peah): Make pure virtual.
36 virtual void ProcessCapture(AudioBuffer* capture,
37 AudioBuffer* linear_output,
38 bool level_change) {}
39
Gustaf Ullberg8e467df2018-02-05 14:39:38 +010040 struct Metrics {
41 double echo_return_loss;
42 double echo_return_loss_enhancement;
43 int delay_ms;
44 };
45
46 // Collect current metrics from the echo controller.
47 virtual Metrics GetMetrics() const = 0;
48
Per Åhgrend0fa8202018-04-18 09:35:13 +020049 // Provides an optional external estimate of the audio buffer delay.
Gustaf Ullbergb394a562019-10-25 09:40:50 +020050 virtual void SetAudioBufferDelay(int delay_ms) = 0;
Per Åhgrend0fa8202018-04-18 09:35:13 +020051
Gustaf Ullberg8675eee2019-10-09 13:34:36 +020052 // Returns wheter the signal is altered.
53 virtual bool ActiveProcessing() const = 0;
54
Gustaf Ullberg8e467df2018-02-05 14:39:38 +010055 virtual ~EchoControl() {}
56};
57
58// Interface for a factory that creates EchoControllers.
59class EchoControlFactory {
60 public:
Per Åhgren4e5c7092019-11-01 20:44:11 +010061 virtual std::unique_ptr<EchoControl> Create(int sample_rate_hz,
62 int num_render_channels,
Gustaf Ullberg2c6f3732019-11-07 17:15:12 +010063 int num_capture_channels) = 0;
Per Åhgren4e5c7092019-11-01 20:44:11 +010064
Gustaf Ullberg8e467df2018-02-05 14:39:38 +010065 virtual ~EchoControlFactory() = default;
66};
67} // namespace webrtc
68
Gustaf Ullbergfd4ce502018-02-15 10:09:09 +010069#endif // API_AUDIO_ECHO_CONTROL_H_