blob: 62dc0f03feae8fd5f0373ae9c26e78462965a862 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
andrew@webrtc.orgb9d7d932012-01-25 19:21:13 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_
12#define MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
Peter Kastingdce40cf2015-08-24 14:52:23 -070014#include <stddef.h>
15
Jonas Olssona4d87372019-07-05 19:08:33 +020016#include <memory>
17
peah44c8a372016-05-05 13:34:29 -070018extern "C" {
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "common_audio/ring_buffer.h"
peah44c8a372016-05-05 13:34:29 -070020}
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "modules/audio_processing/aec/aec_core.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000022
peah50e21bd2016-03-05 08:39:21 -080023namespace webrtc {
24
niklase@google.com470e71d2011-07-07 08:21:25 +000025// Errors
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000026#define AEC_UNSPECIFIED_ERROR 12000
27#define AEC_UNSUPPORTED_FUNCTION_ERROR 12001
28#define AEC_UNINITIALIZED_ERROR 12002
29#define AEC_NULL_POINTER_ERROR 12003
30#define AEC_BAD_PARAMETER_ERROR 12004
niklase@google.com470e71d2011-07-07 08:21:25 +000031
32// Warnings
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000033#define AEC_BAD_PARAMETER_WARNING 12050
niklase@google.com470e71d2011-07-07 08:21:25 +000034
peahff63ed22016-01-29 07:46:13 -080035enum { kAecNlpConservative = 0, kAecNlpModerate, kAecNlpAggressive };
niklase@google.com470e71d2011-07-07 08:21:25 +000036
peahff63ed22016-01-29 07:46:13 -080037enum { kAecFalse = 0, kAecTrue };
niklase@google.com470e71d2011-07-07 08:21:25 +000038
39typedef struct {
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000040 int16_t nlpMode; // default kAecNlpModerate
41 int16_t skewMode; // default kAecFalse
42 int16_t metricsMode; // default kAecFalse
43 int delay_logging; // default kAecFalse
44 // float realSkew;
niklase@google.com470e71d2011-07-07 08:21:25 +000045} AecConfig;
46
47typedef struct {
bjornv@webrtc.orgb4cd3422013-02-15 18:40:34 +000048 int instant;
49 int average;
50 int max;
51 int min;
niklase@google.com470e71d2011-07-07 08:21:25 +000052} AecLevel;
53
54typedef struct {
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000055 AecLevel rerl;
56 AecLevel erl;
57 AecLevel erle;
58 AecLevel aNlp;
minyue50453372016-04-07 06:36:43 -070059 float divergent_filter_fraction;
niklase@google.com470e71d2011-07-07 08:21:25 +000060} AecMetrics;
61
bjornv@webrtc.org132c15d2013-02-27 21:03:41 +000062struct AecCore;
63
peah44c8a372016-05-05 13:34:29 -070064class ApmDataDumper;
65
66typedef struct Aec {
kwiberg83ffe452016-08-29 14:46:07 -070067 Aec();
68 ~Aec();
69
peah44c8a372016-05-05 13:34:29 -070070 std::unique_ptr<ApmDataDumper> data_dumper;
71
72 int delayCtr;
73 int sampFreq;
74 int splitSampFreq;
75 int scSampFreq;
76 float sampFactor; // scSampRate / sampFreq
77 short skewMode;
78 int bufSizeStart;
79 int knownDelay;
80 int rate_factor;
81
82 short initFlag; // indicates if AEC has been initialized
83
84 // Variables used for averaging far end buffer size
85 short counter;
86 int sum;
87 short firstVal;
88 short checkBufSizeCtr;
89
90 // Variables used for delay shifts
91 short msInSndCardBuf;
92 short filtDelay; // Filtered delay estimate.
93 int timeForDelayChange;
94 int startup_phase;
95 int checkBuffSize;
96 short lastDelayDiff;
97
98 // Structures
99 void* resampler;
100
101 int skewFrCtr;
102 int resample; // if the skew is small enough we don't resample
103 int highSkewCtr;
104 float skew;
105
106 RingBuffer* far_pre_buf; // Time domain far-end pre-buffer.
107
108 int farend_started;
109
110 // Aec instance counter.
111 static int instance_count;
112 AecCore* aec;
113} Aec;
114
niklase@google.com470e71d2011-07-07 08:21:25 +0000115/*
116 * Allocates the memory needed by the AEC. The memory needs to be initialized
Bjorn Volcker9345e862015-06-10 21:43:36 +0200117 * separately using the WebRtcAec_Init() function. Returns a pointer to the
118 * object or NULL on error.
niklase@google.com470e71d2011-07-07 08:21:25 +0000119 */
Bjorn Volcker9345e862015-06-10 21:43:36 +0200120void* WebRtcAec_Create();
niklase@google.com470e71d2011-07-07 08:21:25 +0000121
122/*
123 * This function releases the memory allocated by WebRtcAec_Create().
124 *
125 * Inputs Description
126 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000127 * void* aecInst Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000128 */
Bjorn Volckerf6a99e62015-04-10 07:56:57 +0200129void WebRtcAec_Free(void* aecInst);
niklase@google.com470e71d2011-07-07 08:21:25 +0000130
131/*
132 * Initializes an AEC instance.
133 *
134 * Inputs Description
135 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000136 * void* aecInst Pointer to the AEC instance
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000137 * int32_t sampFreq Sampling frequency of data
138 * int32_t scSampFreq Soundcard sampling frequency
niklase@google.com470e71d2011-07-07 08:21:25 +0000139 *
140 * Outputs Description
141 * -------------------------------------------------------------------
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000142 * int32_t return 0: OK
143 * -1: error
niklase@google.com470e71d2011-07-07 08:21:25 +0000144 */
andrew@webrtc.org13b2d462013-10-08 23:41:42 +0000145int32_t WebRtcAec_Init(void* aecInst, int32_t sampFreq, int32_t scSampFreq);
niklase@google.com470e71d2011-07-07 08:21:25 +0000146
147/*
148 * Inserts an 80 or 160 sample block of data into the farend buffer.
149 *
150 * Inputs Description
151 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000152 * void* aecInst Pointer to the AEC instance
kwiberg@webrtc.org38214d52014-07-03 09:47:33 +0000153 * const float* farend In buffer containing one frame of
niklase@google.com470e71d2011-07-07 08:21:25 +0000154 * farend signal for L band
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000155 * int16_t nrOfSamples Number of samples in farend buffer
niklase@google.com470e71d2011-07-07 08:21:25 +0000156 *
157 * Outputs Description
158 * -------------------------------------------------------------------
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000159 * int32_t return 0: OK
peahc12be392015-11-09 23:53:50 -0800160 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000161 */
andrew@webrtc.org13b2d462013-10-08 23:41:42 +0000162int32_t WebRtcAec_BufferFarend(void* aecInst,
kwiberg@webrtc.org38214d52014-07-03 09:47:33 +0000163 const float* farend,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700164 size_t nrOfSamples);
niklase@google.com470e71d2011-07-07 08:21:25 +0000165
166/*
peahc12be392015-11-09 23:53:50 -0800167 * Reports any errors that would arise if buffering a farend buffer
168 *
169 * Inputs Description
170 * -------------------------------------------------------------------
171 * void* aecInst Pointer to the AEC instance
172 * const float* farend In buffer containing one frame of
173 * farend signal for L band
174 * int16_t nrOfSamples Number of samples in farend buffer
175 *
176 * Outputs Description
177 * -------------------------------------------------------------------
178 * int32_t return 0: OK
179 * 12000-12050: error code
180 */
181int32_t WebRtcAec_GetBufferFarendError(void* aecInst,
182 const float* farend,
183 size_t nrOfSamples);
184
185/*
niklase@google.com470e71d2011-07-07 08:21:25 +0000186 * Runs the echo canceller on an 80 or 160 sample blocks of data.
187 *
188 * Inputs Description
189 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000190 * void* aecInst Pointer to the AEC instance
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000191 * float* const* nearend In buffer containing one frame of
192 * nearend+echo signal for each band
193 * int num_bands Number of bands in nearend buffer
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000194 * int16_t nrOfSamples Number of samples in nearend buffer
195 * int16_t msInSndCardBuf Delay estimate for sound card and
niklase@google.com470e71d2011-07-07 08:21:25 +0000196 * system buffers
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000197 * int16_t skew Difference between number of samples played
niklase@google.com470e71d2011-07-07 08:21:25 +0000198 * and recorded at the soundcard (for clock skew
199 * compensation)
200 *
201 * Outputs Description
202 * -------------------------------------------------------------------
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000203 * float* const* out Out buffer, one frame of processed nearend
204 * for each band
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000205 * int32_t return 0: OK
peahc12be392015-11-09 23:53:50 -0800206 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000207 */
andrew@webrtc.org13b2d462013-10-08 23:41:42 +0000208int32_t WebRtcAec_Process(void* aecInst,
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000209 const float* const* nearend,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700210 size_t num_bands,
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000211 float* const* out,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700212 size_t nrOfSamples,
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000213 int16_t msInSndCardBuf,
214 int32_t skew);
niklase@google.com470e71d2011-07-07 08:21:25 +0000215
216/*
217 * This function enables the user to set certain parameters on-the-fly.
218 *
219 * Inputs Description
220 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000221 * void* handle Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000222 * AecConfig config Config instance that contains all
223 * properties to be set
224 *
225 * Outputs Description
226 * -------------------------------------------------------------------
peahc12be392015-11-09 23:53:50 -0800227 * int return 0: OK
228 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000229 */
bjornv@webrtc.org47b274d2013-02-20 17:09:47 +0000230int WebRtcAec_set_config(void* handle, AecConfig config);
niklase@google.com470e71d2011-07-07 08:21:25 +0000231
232/*
niklase@google.com470e71d2011-07-07 08:21:25 +0000233 * Gets the current echo status of the nearend signal.
234 *
235 * Inputs Description
236 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000237 * void* handle Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000238 *
239 * Outputs Description
240 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000241 * int* status 0: Almost certainly nearend single-talk
niklase@google.com470e71d2011-07-07 08:21:25 +0000242 * 1: Might not be neared single-talk
peahc12be392015-11-09 23:53:50 -0800243 * int return 0: OK
244 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000245 */
bjornv@webrtc.org21a2fc92013-02-15 17:01:03 +0000246int WebRtcAec_get_echo_status(void* handle, int* status);
niklase@google.com470e71d2011-07-07 08:21:25 +0000247
248/*
249 * Gets the current echo metrics for the session.
250 *
251 * Inputs Description
252 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000253 * void* handle Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000254 *
255 * Outputs Description
256 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000257 * AecMetrics* metrics Struct which will be filled out with the
niklase@google.com470e71d2011-07-07 08:21:25 +0000258 * current echo metrics.
peahc12be392015-11-09 23:53:50 -0800259 * int return 0: OK
260 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000261 */
bjornv@webrtc.orgb4cd3422013-02-15 18:40:34 +0000262int WebRtcAec_GetMetrics(void* handle, AecMetrics* metrics);
niklase@google.com470e71d2011-07-07 08:21:25 +0000263
264/*
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000265 * Gets the current delay metrics for the session.
266 *
267 * Inputs Description
268 * -------------------------------------------------------------------
bjornv@webrtc.orgb1786db2015-02-03 06:06:26 +0000269 * void* handle Pointer to the AEC instance
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000270 *
271 * Outputs Description
272 * -------------------------------------------------------------------
bjornv@webrtc.orgb1786db2015-02-03 06:06:26 +0000273 * int* median Delay median value.
274 * int* std Delay standard deviation.
275 * float* fraction_poor_delays Fraction of the delay estimates that may
276 * cause the AEC to perform poorly.
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000277 *
peahc12be392015-11-09 23:53:50 -0800278 * int return 0: OK
279 * 12000-12050: error code
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000280 */
bjornv@webrtc.orgb1786db2015-02-03 06:06:26 +0000281int WebRtcAec_GetDelayMetrics(void* handle,
282 int* median,
283 int* std,
284 float* fraction_poor_delays);
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000285
bjornv@webrtc.org132c15d2013-02-27 21:03:41 +0000286// Returns a pointer to the low level AEC handle.
287//
288// Input:
289// - handle : Pointer to the AEC instance.
290//
291// Return value:
292// - AecCore pointer : NULL for error.
293//
294struct AecCore* WebRtcAec_aec_core(void* handle);
295
peah50e21bd2016-03-05 08:39:21 -0800296} // namespace webrtc
297
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200298#endif // MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_