blob: 8e5e52c32bfbb9ebe81ce4eb8521d18925afb671 [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
Henrik Kjellander9b72af92015-11-11 20:16:11 +010011#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_
12#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
peah44c8a372016-05-05 13:34:29 -070014#include <memory>
15
Peter Kastingdce40cf2015-08-24 14:52:23 -070016#include <stddef.h>
17
peah44c8a372016-05-05 13:34:29 -070018extern "C" {
19#include "webrtc/common_audio/ring_buffer.h"
20}
21#include "webrtc/modules/audio_processing/aec/aec_core.h"
bjornv@webrtc.org21a2fc92013-02-15 17:01:03 +000022#include "webrtc/typedefs.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000023
peah50e21bd2016-03-05 08:39:21 -080024namespace webrtc {
25
niklase@google.com470e71d2011-07-07 08:21:25 +000026// Errors
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000027#define AEC_UNSPECIFIED_ERROR 12000
28#define AEC_UNSUPPORTED_FUNCTION_ERROR 12001
29#define AEC_UNINITIALIZED_ERROR 12002
30#define AEC_NULL_POINTER_ERROR 12003
31#define AEC_BAD_PARAMETER_ERROR 12004
niklase@google.com470e71d2011-07-07 08:21:25 +000032
33// Warnings
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000034#define AEC_BAD_PARAMETER_WARNING 12050
niklase@google.com470e71d2011-07-07 08:21:25 +000035
peahff63ed22016-01-29 07:46:13 -080036enum { kAecNlpConservative = 0, kAecNlpModerate, kAecNlpAggressive };
niklase@google.com470e71d2011-07-07 08:21:25 +000037
peahff63ed22016-01-29 07:46:13 -080038enum { kAecFalse = 0, kAecTrue };
niklase@google.com470e71d2011-07-07 08:21:25 +000039
40typedef struct {
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000041 int16_t nlpMode; // default kAecNlpModerate
42 int16_t skewMode; // default kAecFalse
43 int16_t metricsMode; // default kAecFalse
44 int delay_logging; // default kAecFalse
45 // float realSkew;
niklase@google.com470e71d2011-07-07 08:21:25 +000046} AecConfig;
47
48typedef struct {
bjornv@webrtc.orgb4cd3422013-02-15 18:40:34 +000049 int instant;
50 int average;
51 int max;
52 int min;
niklase@google.com470e71d2011-07-07 08:21:25 +000053} AecLevel;
54
55typedef struct {
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000056 AecLevel rerl;
57 AecLevel erl;
58 AecLevel erle;
59 AecLevel aNlp;
minyue50453372016-04-07 06:36:43 -070060 float divergent_filter_fraction;
niklase@google.com470e71d2011-07-07 08:21:25 +000061} AecMetrics;
62
bjornv@webrtc.org132c15d2013-02-27 21:03:41 +000063struct AecCore;
64
peah44c8a372016-05-05 13:34:29 -070065class ApmDataDumper;
66
67typedef struct Aec {
68 std::unique_ptr<ApmDataDumper> data_dumper;
69
70 int delayCtr;
71 int sampFreq;
72 int splitSampFreq;
73 int scSampFreq;
74 float sampFactor; // scSampRate / sampFreq
75 short skewMode;
76 int bufSizeStart;
77 int knownDelay;
78 int rate_factor;
79
80 short initFlag; // indicates if AEC has been initialized
81
82 // Variables used for averaging far end buffer size
83 short counter;
84 int sum;
85 short firstVal;
86 short checkBufSizeCtr;
87
88 // Variables used for delay shifts
89 short msInSndCardBuf;
90 short filtDelay; // Filtered delay estimate.
91 int timeForDelayChange;
92 int startup_phase;
93 int checkBuffSize;
94 short lastDelayDiff;
95
96 // Structures
97 void* resampler;
98
99 int skewFrCtr;
100 int resample; // if the skew is small enough we don't resample
101 int highSkewCtr;
102 float skew;
103
104 RingBuffer* far_pre_buf; // Time domain far-end pre-buffer.
105
106 int farend_started;
107
108 // Aec instance counter.
109 static int instance_count;
110 AecCore* aec;
111} Aec;
112
niklase@google.com470e71d2011-07-07 08:21:25 +0000113/*
114 * Allocates the memory needed by the AEC. The memory needs to be initialized
Bjorn Volcker9345e862015-06-10 21:43:36 +0200115 * separately using the WebRtcAec_Init() function. Returns a pointer to the
116 * object or NULL on error.
niklase@google.com470e71d2011-07-07 08:21:25 +0000117 */
Bjorn Volcker9345e862015-06-10 21:43:36 +0200118void* WebRtcAec_Create();
niklase@google.com470e71d2011-07-07 08:21:25 +0000119
120/*
121 * This function releases the memory allocated by WebRtcAec_Create().
122 *
123 * Inputs Description
124 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000125 * void* aecInst Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000126 */
Bjorn Volckerf6a99e62015-04-10 07:56:57 +0200127void WebRtcAec_Free(void* aecInst);
niklase@google.com470e71d2011-07-07 08:21:25 +0000128
129/*
130 * Initializes an AEC instance.
131 *
132 * Inputs Description
133 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000134 * void* aecInst Pointer to the AEC instance
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000135 * int32_t sampFreq Sampling frequency of data
136 * int32_t scSampFreq Soundcard sampling frequency
niklase@google.com470e71d2011-07-07 08:21:25 +0000137 *
138 * Outputs Description
139 * -------------------------------------------------------------------
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000140 * int32_t return 0: OK
141 * -1: error
niklase@google.com470e71d2011-07-07 08:21:25 +0000142 */
andrew@webrtc.org13b2d462013-10-08 23:41:42 +0000143int32_t WebRtcAec_Init(void* aecInst, int32_t sampFreq, int32_t scSampFreq);
niklase@google.com470e71d2011-07-07 08:21:25 +0000144
145/*
146 * Inserts an 80 or 160 sample block of data into the farend buffer.
147 *
148 * Inputs Description
149 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000150 * void* aecInst Pointer to the AEC instance
kwiberg@webrtc.org38214d52014-07-03 09:47:33 +0000151 * const float* farend In buffer containing one frame of
niklase@google.com470e71d2011-07-07 08:21:25 +0000152 * farend signal for L band
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000153 * int16_t nrOfSamples Number of samples in farend buffer
niklase@google.com470e71d2011-07-07 08:21:25 +0000154 *
155 * Outputs Description
156 * -------------------------------------------------------------------
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000157 * int32_t return 0: OK
peahc12be392015-11-09 23:53:50 -0800158 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000159 */
andrew@webrtc.org13b2d462013-10-08 23:41:42 +0000160int32_t WebRtcAec_BufferFarend(void* aecInst,
kwiberg@webrtc.org38214d52014-07-03 09:47:33 +0000161 const float* farend,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700162 size_t nrOfSamples);
niklase@google.com470e71d2011-07-07 08:21:25 +0000163
164/*
peahc12be392015-11-09 23:53:50 -0800165 * Reports any errors that would arise if buffering a farend buffer
166 *
167 * Inputs Description
168 * -------------------------------------------------------------------
169 * void* aecInst Pointer to the AEC instance
170 * const float* farend In buffer containing one frame of
171 * farend signal for L band
172 * int16_t nrOfSamples Number of samples in farend buffer
173 *
174 * Outputs Description
175 * -------------------------------------------------------------------
176 * int32_t return 0: OK
177 * 12000-12050: error code
178 */
179int32_t WebRtcAec_GetBufferFarendError(void* aecInst,
180 const float* farend,
181 size_t nrOfSamples);
182
183/*
niklase@google.com470e71d2011-07-07 08:21:25 +0000184 * Runs the echo canceller on an 80 or 160 sample blocks of data.
185 *
186 * Inputs Description
187 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000188 * void* aecInst Pointer to the AEC instance
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000189 * float* const* nearend In buffer containing one frame of
190 * nearend+echo signal for each band
191 * int num_bands Number of bands in nearend buffer
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000192 * int16_t nrOfSamples Number of samples in nearend buffer
193 * int16_t msInSndCardBuf Delay estimate for sound card and
niklase@google.com470e71d2011-07-07 08:21:25 +0000194 * system buffers
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000195 * int16_t skew Difference between number of samples played
niklase@google.com470e71d2011-07-07 08:21:25 +0000196 * and recorded at the soundcard (for clock skew
197 * compensation)
198 *
199 * Outputs Description
200 * -------------------------------------------------------------------
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000201 * float* const* out Out buffer, one frame of processed nearend
202 * for each band
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000203 * int32_t return 0: OK
peahc12be392015-11-09 23:53:50 -0800204 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000205 */
andrew@webrtc.org13b2d462013-10-08 23:41:42 +0000206int32_t WebRtcAec_Process(void* aecInst,
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000207 const float* const* nearend,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700208 size_t num_bands,
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000209 float* const* out,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700210 size_t nrOfSamples,
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000211 int16_t msInSndCardBuf,
212 int32_t skew);
niklase@google.com470e71d2011-07-07 08:21:25 +0000213
214/*
215 * This function enables the user to set certain parameters on-the-fly.
216 *
217 * Inputs Description
218 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000219 * void* handle Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000220 * AecConfig config Config instance that contains all
221 * properties to be set
222 *
223 * Outputs Description
224 * -------------------------------------------------------------------
peahc12be392015-11-09 23:53:50 -0800225 * int return 0: OK
226 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000227 */
bjornv@webrtc.org47b274d2013-02-20 17:09:47 +0000228int WebRtcAec_set_config(void* handle, AecConfig config);
niklase@google.com470e71d2011-07-07 08:21:25 +0000229
230/*
niklase@google.com470e71d2011-07-07 08:21:25 +0000231 * Gets the current echo status of the nearend signal.
232 *
233 * Inputs Description
234 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000235 * void* handle Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000236 *
237 * Outputs Description
238 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000239 * int* status 0: Almost certainly nearend single-talk
niklase@google.com470e71d2011-07-07 08:21:25 +0000240 * 1: Might not be neared single-talk
peahc12be392015-11-09 23:53:50 -0800241 * int return 0: OK
242 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000243 */
bjornv@webrtc.org21a2fc92013-02-15 17:01:03 +0000244int WebRtcAec_get_echo_status(void* handle, int* status);
niklase@google.com470e71d2011-07-07 08:21:25 +0000245
246/*
247 * Gets the current echo metrics for the session.
248 *
249 * Inputs Description
250 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000251 * void* handle Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000252 *
253 * Outputs Description
254 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000255 * AecMetrics* metrics Struct which will be filled out with the
niklase@google.com470e71d2011-07-07 08:21:25 +0000256 * current echo metrics.
peahc12be392015-11-09 23:53:50 -0800257 * int return 0: OK
258 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000259 */
bjornv@webrtc.orgb4cd3422013-02-15 18:40:34 +0000260int WebRtcAec_GetMetrics(void* handle, AecMetrics* metrics);
niklase@google.com470e71d2011-07-07 08:21:25 +0000261
262/*
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000263 * Gets the current delay metrics for the session.
264 *
265 * Inputs Description
266 * -------------------------------------------------------------------
bjornv@webrtc.orgb1786db2015-02-03 06:06:26 +0000267 * void* handle Pointer to the AEC instance
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000268 *
269 * Outputs Description
270 * -------------------------------------------------------------------
bjornv@webrtc.orgb1786db2015-02-03 06:06:26 +0000271 * int* median Delay median value.
272 * int* std Delay standard deviation.
273 * float* fraction_poor_delays Fraction of the delay estimates that may
274 * cause the AEC to perform poorly.
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000275 *
peahc12be392015-11-09 23:53:50 -0800276 * int return 0: OK
277 * 12000-12050: error code
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000278 */
bjornv@webrtc.orgb1786db2015-02-03 06:06:26 +0000279int WebRtcAec_GetDelayMetrics(void* handle,
280 int* median,
281 int* std,
282 float* fraction_poor_delays);
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000283
bjornv@webrtc.org132c15d2013-02-27 21:03:41 +0000284// Returns a pointer to the low level AEC handle.
285//
286// Input:
287// - handle : Pointer to the AEC instance.
288//
289// Return value:
290// - AecCore pointer : NULL for error.
291//
292struct AecCore* WebRtcAec_aec_core(void* handle);
293
peah50e21bd2016-03-05 08:39:21 -0800294} // namespace webrtc
295
Henrik Kjellander9b72af92015-11-11 20:16:11 +0100296#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_