blob: 09047f12f1327a1f4c43aef80d3c5fdcfc0f8114 [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
Peter Kastingdce40cf2015-08-24 14:52:23 -070014#include <stddef.h>
15
bjornv@webrtc.org21a2fc92013-02-15 17:01:03 +000016#include "webrtc/typedefs.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000017
peah50e21bd2016-03-05 08:39:21 -080018namespace webrtc {
19
niklase@google.com470e71d2011-07-07 08:21:25 +000020// Errors
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000021#define AEC_UNSPECIFIED_ERROR 12000
22#define AEC_UNSUPPORTED_FUNCTION_ERROR 12001
23#define AEC_UNINITIALIZED_ERROR 12002
24#define AEC_NULL_POINTER_ERROR 12003
25#define AEC_BAD_PARAMETER_ERROR 12004
niklase@google.com470e71d2011-07-07 08:21:25 +000026
27// Warnings
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000028#define AEC_BAD_PARAMETER_WARNING 12050
niklase@google.com470e71d2011-07-07 08:21:25 +000029
peahff63ed22016-01-29 07:46:13 -080030enum { kAecNlpConservative = 0, kAecNlpModerate, kAecNlpAggressive };
niklase@google.com470e71d2011-07-07 08:21:25 +000031
peahff63ed22016-01-29 07:46:13 -080032enum { kAecFalse = 0, kAecTrue };
niklase@google.com470e71d2011-07-07 08:21:25 +000033
34typedef struct {
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000035 int16_t nlpMode; // default kAecNlpModerate
36 int16_t skewMode; // default kAecFalse
37 int16_t metricsMode; // default kAecFalse
38 int delay_logging; // default kAecFalse
39 // float realSkew;
niklase@google.com470e71d2011-07-07 08:21:25 +000040} AecConfig;
41
42typedef struct {
bjornv@webrtc.orgb4cd3422013-02-15 18:40:34 +000043 int instant;
44 int average;
45 int max;
46 int min;
niklase@google.com470e71d2011-07-07 08:21:25 +000047} AecLevel;
48
49typedef struct {
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000050 AecLevel rerl;
51 AecLevel erl;
52 AecLevel erle;
53 AecLevel aNlp;
niklase@google.com470e71d2011-07-07 08:21:25 +000054} AecMetrics;
55
bjornv@webrtc.org132c15d2013-02-27 21:03:41 +000056struct AecCore;
57
niklase@google.com470e71d2011-07-07 08:21:25 +000058/*
59 * Allocates the memory needed by the AEC. The memory needs to be initialized
Bjorn Volcker9345e862015-06-10 21:43:36 +020060 * separately using the WebRtcAec_Init() function. Returns a pointer to the
61 * object or NULL on error.
niklase@google.com470e71d2011-07-07 08:21:25 +000062 */
Bjorn Volcker9345e862015-06-10 21:43:36 +020063void* WebRtcAec_Create();
niklase@google.com470e71d2011-07-07 08:21:25 +000064
65/*
66 * This function releases the memory allocated by WebRtcAec_Create().
67 *
68 * Inputs Description
69 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +000070 * void* aecInst Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +000071 */
Bjorn Volckerf6a99e62015-04-10 07:56:57 +020072void WebRtcAec_Free(void* aecInst);
niklase@google.com470e71d2011-07-07 08:21:25 +000073
74/*
75 * Initializes an AEC instance.
76 *
77 * Inputs Description
78 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +000079 * void* aecInst Pointer to the AEC instance
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +000080 * int32_t sampFreq Sampling frequency of data
81 * int32_t scSampFreq Soundcard sampling frequency
niklase@google.com470e71d2011-07-07 08:21:25 +000082 *
83 * Outputs Description
84 * -------------------------------------------------------------------
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +000085 * int32_t return 0: OK
86 * -1: error
niklase@google.com470e71d2011-07-07 08:21:25 +000087 */
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000088int32_t WebRtcAec_Init(void* aecInst, int32_t sampFreq, int32_t scSampFreq);
niklase@google.com470e71d2011-07-07 08:21:25 +000089
90/*
91 * Inserts an 80 or 160 sample block of data into the farend buffer.
92 *
93 * Inputs Description
94 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +000095 * void* aecInst Pointer to the AEC instance
kwiberg@webrtc.org38214d52014-07-03 09:47:33 +000096 * const float* farend In buffer containing one frame of
niklase@google.com470e71d2011-07-07 08:21:25 +000097 * farend signal for L band
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +000098 * int16_t nrOfSamples Number of samples in farend buffer
niklase@google.com470e71d2011-07-07 08:21:25 +000099 *
100 * Outputs Description
101 * -------------------------------------------------------------------
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000102 * int32_t return 0: OK
peahc12be392015-11-09 23:53:50 -0800103 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000104 */
andrew@webrtc.org13b2d462013-10-08 23:41:42 +0000105int32_t WebRtcAec_BufferFarend(void* aecInst,
kwiberg@webrtc.org38214d52014-07-03 09:47:33 +0000106 const float* farend,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700107 size_t nrOfSamples);
niklase@google.com470e71d2011-07-07 08:21:25 +0000108
109/*
peahc12be392015-11-09 23:53:50 -0800110 * Reports any errors that would arise if buffering a farend buffer
111 *
112 * Inputs Description
113 * -------------------------------------------------------------------
114 * void* aecInst Pointer to the AEC instance
115 * const float* farend In buffer containing one frame of
116 * farend signal for L band
117 * int16_t nrOfSamples Number of samples in farend buffer
118 *
119 * Outputs Description
120 * -------------------------------------------------------------------
121 * int32_t return 0: OK
122 * 12000-12050: error code
123 */
124int32_t WebRtcAec_GetBufferFarendError(void* aecInst,
125 const float* farend,
126 size_t nrOfSamples);
127
128/*
niklase@google.com470e71d2011-07-07 08:21:25 +0000129 * Runs the echo canceller on an 80 or 160 sample blocks of data.
130 *
131 * Inputs Description
132 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000133 * void* aecInst Pointer to the AEC instance
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000134 * float* const* nearend In buffer containing one frame of
135 * nearend+echo signal for each band
136 * int num_bands Number of bands in nearend buffer
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000137 * int16_t nrOfSamples Number of samples in nearend buffer
138 * int16_t msInSndCardBuf Delay estimate for sound card and
niklase@google.com470e71d2011-07-07 08:21:25 +0000139 * system buffers
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000140 * int16_t skew Difference between number of samples played
niklase@google.com470e71d2011-07-07 08:21:25 +0000141 * and recorded at the soundcard (for clock skew
142 * compensation)
143 *
144 * Outputs Description
145 * -------------------------------------------------------------------
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000146 * float* const* out Out buffer, one frame of processed nearend
147 * for each band
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000148 * int32_t return 0: OK
peahc12be392015-11-09 23:53:50 -0800149 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000150 */
andrew@webrtc.org13b2d462013-10-08 23:41:42 +0000151int32_t WebRtcAec_Process(void* aecInst,
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000152 const float* const* nearend,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700153 size_t num_bands,
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000154 float* const* out,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700155 size_t nrOfSamples,
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000156 int16_t msInSndCardBuf,
157 int32_t skew);
niklase@google.com470e71d2011-07-07 08:21:25 +0000158
159/*
160 * This function enables the user to set certain parameters on-the-fly.
161 *
162 * Inputs Description
163 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000164 * void* handle Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000165 * AecConfig config Config instance that contains all
166 * properties to be set
167 *
168 * Outputs Description
169 * -------------------------------------------------------------------
peahc12be392015-11-09 23:53:50 -0800170 * int return 0: OK
171 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000172 */
bjornv@webrtc.org47b274d2013-02-20 17:09:47 +0000173int WebRtcAec_set_config(void* handle, AecConfig config);
niklase@google.com470e71d2011-07-07 08:21:25 +0000174
175/*
niklase@google.com470e71d2011-07-07 08:21:25 +0000176 * Gets the current echo status of the nearend signal.
177 *
178 * Inputs Description
179 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000180 * void* handle Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000181 *
182 * Outputs Description
183 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000184 * int* status 0: Almost certainly nearend single-talk
niklase@google.com470e71d2011-07-07 08:21:25 +0000185 * 1: Might not be neared single-talk
peahc12be392015-11-09 23:53:50 -0800186 * int return 0: OK
187 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000188 */
bjornv@webrtc.org21a2fc92013-02-15 17:01:03 +0000189int WebRtcAec_get_echo_status(void* handle, int* status);
niklase@google.com470e71d2011-07-07 08:21:25 +0000190
191/*
192 * Gets the current echo metrics for the session.
193 *
194 * Inputs Description
195 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000196 * void* handle Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000197 *
198 * Outputs Description
199 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000200 * AecMetrics* metrics Struct which will be filled out with the
niklase@google.com470e71d2011-07-07 08:21:25 +0000201 * current echo metrics.
peahc12be392015-11-09 23:53:50 -0800202 * int return 0: OK
203 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000204 */
bjornv@webrtc.orgb4cd3422013-02-15 18:40:34 +0000205int WebRtcAec_GetMetrics(void* handle, AecMetrics* metrics);
niklase@google.com470e71d2011-07-07 08:21:25 +0000206
207/*
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000208 * Gets the current delay metrics for the session.
209 *
210 * Inputs Description
211 * -------------------------------------------------------------------
bjornv@webrtc.orgb1786db2015-02-03 06:06:26 +0000212 * void* handle Pointer to the AEC instance
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000213 *
214 * Outputs Description
215 * -------------------------------------------------------------------
bjornv@webrtc.orgb1786db2015-02-03 06:06:26 +0000216 * int* median Delay median value.
217 * int* std Delay standard deviation.
218 * float* fraction_poor_delays Fraction of the delay estimates that may
219 * cause the AEC to perform poorly.
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000220 *
peahc12be392015-11-09 23:53:50 -0800221 * int return 0: OK
222 * 12000-12050: error code
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000223 */
bjornv@webrtc.orgb1786db2015-02-03 06:06:26 +0000224int WebRtcAec_GetDelayMetrics(void* handle,
225 int* median,
226 int* std,
227 float* fraction_poor_delays);
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000228
bjornv@webrtc.org132c15d2013-02-27 21:03:41 +0000229// Returns a pointer to the low level AEC handle.
230//
231// Input:
232// - handle : Pointer to the AEC instance.
233//
234// Return value:
235// - AecCore pointer : NULL for error.
236//
237struct AecCore* WebRtcAec_aec_core(void* handle);
238
peah50e21bd2016-03-05 08:39:21 -0800239} // namespace webrtc
240
Henrik Kjellander9b72af92015-11-11 20:16:11 +0100241#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_