blob: c2e8a09b6c289c3b2ae51d8758442ce4a3981d88 [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
18// Errors
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000019#define AEC_UNSPECIFIED_ERROR 12000
20#define AEC_UNSUPPORTED_FUNCTION_ERROR 12001
21#define AEC_UNINITIALIZED_ERROR 12002
22#define AEC_NULL_POINTER_ERROR 12003
23#define AEC_BAD_PARAMETER_ERROR 12004
niklase@google.com470e71d2011-07-07 08:21:25 +000024
25// Warnings
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000026#define AEC_BAD_PARAMETER_WARNING 12050
niklase@google.com470e71d2011-07-07 08:21:25 +000027
peahff63ed22016-01-29 07:46:13 -080028enum { kAecNlpConservative = 0, kAecNlpModerate, kAecNlpAggressive };
niklase@google.com470e71d2011-07-07 08:21:25 +000029
peahff63ed22016-01-29 07:46:13 -080030enum { kAecFalse = 0, kAecTrue };
niklase@google.com470e71d2011-07-07 08:21:25 +000031
32typedef struct {
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000033 int16_t nlpMode; // default kAecNlpModerate
34 int16_t skewMode; // default kAecFalse
35 int16_t metricsMode; // default kAecFalse
36 int delay_logging; // default kAecFalse
37 // float realSkew;
niklase@google.com470e71d2011-07-07 08:21:25 +000038} AecConfig;
39
40typedef struct {
bjornv@webrtc.orgb4cd3422013-02-15 18:40:34 +000041 int instant;
42 int average;
43 int max;
44 int min;
niklase@google.com470e71d2011-07-07 08:21:25 +000045} AecLevel;
46
47typedef struct {
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000048 AecLevel rerl;
49 AecLevel erl;
50 AecLevel erle;
51 AecLevel aNlp;
niklase@google.com470e71d2011-07-07 08:21:25 +000052} AecMetrics;
53
bjornv@webrtc.org132c15d2013-02-27 21:03:41 +000054struct AecCore;
55
niklase@google.com470e71d2011-07-07 08:21:25 +000056#ifdef __cplusplus
57extern "C" {
58#endif
59
60/*
61 * Allocates the memory needed by the AEC. The memory needs to be initialized
Bjorn Volcker9345e862015-06-10 21:43:36 +020062 * separately using the WebRtcAec_Init() function. Returns a pointer to the
63 * object or NULL on error.
niklase@google.com470e71d2011-07-07 08:21:25 +000064 */
Bjorn Volcker9345e862015-06-10 21:43:36 +020065void* WebRtcAec_Create();
niklase@google.com470e71d2011-07-07 08:21:25 +000066
67/*
68 * This function releases the memory allocated by WebRtcAec_Create().
69 *
70 * Inputs Description
71 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +000072 * void* aecInst Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +000073 */
Bjorn Volckerf6a99e62015-04-10 07:56:57 +020074void WebRtcAec_Free(void* aecInst);
niklase@google.com470e71d2011-07-07 08:21:25 +000075
76/*
77 * Initializes an AEC instance.
78 *
79 * Inputs Description
80 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +000081 * void* aecInst Pointer to the AEC instance
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +000082 * int32_t sampFreq Sampling frequency of data
83 * int32_t scSampFreq Soundcard sampling frequency
niklase@google.com470e71d2011-07-07 08:21:25 +000084 *
85 * Outputs Description
86 * -------------------------------------------------------------------
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +000087 * int32_t return 0: OK
88 * -1: error
niklase@google.com470e71d2011-07-07 08:21:25 +000089 */
andrew@webrtc.org13b2d462013-10-08 23:41:42 +000090int32_t WebRtcAec_Init(void* aecInst, int32_t sampFreq, int32_t scSampFreq);
niklase@google.com470e71d2011-07-07 08:21:25 +000091
92/*
93 * Inserts an 80 or 160 sample block of data into the farend buffer.
94 *
95 * Inputs Description
96 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +000097 * void* aecInst Pointer to the AEC instance
kwiberg@webrtc.org38214d52014-07-03 09:47:33 +000098 * const float* farend In buffer containing one frame of
niklase@google.com470e71d2011-07-07 08:21:25 +000099 * farend signal for L band
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000100 * int16_t nrOfSamples Number of samples in farend buffer
niklase@google.com470e71d2011-07-07 08:21:25 +0000101 *
102 * Outputs Description
103 * -------------------------------------------------------------------
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000104 * int32_t return 0: OK
peahc12be392015-11-09 23:53:50 -0800105 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000106 */
andrew@webrtc.org13b2d462013-10-08 23:41:42 +0000107int32_t WebRtcAec_BufferFarend(void* aecInst,
kwiberg@webrtc.org38214d52014-07-03 09:47:33 +0000108 const float* farend,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700109 size_t nrOfSamples);
niklase@google.com470e71d2011-07-07 08:21:25 +0000110
111/*
peahc12be392015-11-09 23:53:50 -0800112 * Reports any errors that would arise if buffering a farend buffer
113 *
114 * Inputs Description
115 * -------------------------------------------------------------------
116 * void* aecInst Pointer to the AEC instance
117 * const float* farend In buffer containing one frame of
118 * farend signal for L band
119 * int16_t nrOfSamples Number of samples in farend buffer
120 *
121 * Outputs Description
122 * -------------------------------------------------------------------
123 * int32_t return 0: OK
124 * 12000-12050: error code
125 */
126int32_t WebRtcAec_GetBufferFarendError(void* aecInst,
127 const float* farend,
128 size_t nrOfSamples);
129
130/*
niklase@google.com470e71d2011-07-07 08:21:25 +0000131 * Runs the echo canceller on an 80 or 160 sample blocks of data.
132 *
133 * Inputs Description
134 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000135 * void* aecInst Pointer to the AEC instance
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000136 * float* const* nearend In buffer containing one frame of
137 * nearend+echo signal for each band
138 * int num_bands Number of bands in nearend buffer
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000139 * int16_t nrOfSamples Number of samples in nearend buffer
140 * int16_t msInSndCardBuf Delay estimate for sound card and
niklase@google.com470e71d2011-07-07 08:21:25 +0000141 * system buffers
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000142 * int16_t skew Difference between number of samples played
niklase@google.com470e71d2011-07-07 08:21:25 +0000143 * and recorded at the soundcard (for clock skew
144 * compensation)
145 *
146 * Outputs Description
147 * -------------------------------------------------------------------
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000148 * float* const* out Out buffer, one frame of processed nearend
149 * for each band
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000150 * int32_t return 0: OK
peahc12be392015-11-09 23:53:50 -0800151 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000152 */
andrew@webrtc.org13b2d462013-10-08 23:41:42 +0000153int32_t WebRtcAec_Process(void* aecInst,
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000154 const float* const* nearend,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700155 size_t num_bands,
aluebs@webrtc.orgc78d81a2015-01-21 19:10:55 +0000156 float* const* out,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700157 size_t nrOfSamples,
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +0000158 int16_t msInSndCardBuf,
159 int32_t skew);
niklase@google.com470e71d2011-07-07 08:21:25 +0000160
161/*
162 * This function enables the user to set certain parameters on-the-fly.
163 *
164 * Inputs Description
165 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000166 * void* handle Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000167 * AecConfig config Config instance that contains all
168 * properties to be set
169 *
170 * Outputs Description
171 * -------------------------------------------------------------------
peahc12be392015-11-09 23:53:50 -0800172 * int return 0: OK
173 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000174 */
bjornv@webrtc.org47b274d2013-02-20 17:09:47 +0000175int WebRtcAec_set_config(void* handle, AecConfig config);
niklase@google.com470e71d2011-07-07 08:21:25 +0000176
177/*
niklase@google.com470e71d2011-07-07 08:21:25 +0000178 * Gets the current echo status of the nearend signal.
179 *
180 * Inputs Description
181 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000182 * void* handle Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000183 *
184 * Outputs Description
185 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000186 * int* status 0: Almost certainly nearend single-talk
niklase@google.com470e71d2011-07-07 08:21:25 +0000187 * 1: Might not be neared single-talk
peahc12be392015-11-09 23:53:50 -0800188 * int return 0: OK
189 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000190 */
bjornv@webrtc.org21a2fc92013-02-15 17:01:03 +0000191int WebRtcAec_get_echo_status(void* handle, int* status);
niklase@google.com470e71d2011-07-07 08:21:25 +0000192
193/*
194 * Gets the current echo metrics for the session.
195 *
196 * Inputs Description
197 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000198 * void* handle Pointer to the AEC instance
niklase@google.com470e71d2011-07-07 08:21:25 +0000199 *
200 * Outputs Description
201 * -------------------------------------------------------------------
kwiberg@webrtc.org924e81f2014-05-12 09:55:19 +0000202 * AecMetrics* metrics Struct which will be filled out with the
niklase@google.com470e71d2011-07-07 08:21:25 +0000203 * current echo metrics.
peahc12be392015-11-09 23:53:50 -0800204 * int return 0: OK
205 * 12000-12050: error code
niklase@google.com470e71d2011-07-07 08:21:25 +0000206 */
bjornv@webrtc.orgb4cd3422013-02-15 18:40:34 +0000207int WebRtcAec_GetMetrics(void* handle, AecMetrics* metrics);
niklase@google.com470e71d2011-07-07 08:21:25 +0000208
209/*
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000210 * Gets the current delay metrics for the session.
211 *
212 * Inputs Description
213 * -------------------------------------------------------------------
bjornv@webrtc.orgb1786db2015-02-03 06:06:26 +0000214 * void* handle Pointer to the AEC instance
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000215 *
216 * Outputs Description
217 * -------------------------------------------------------------------
bjornv@webrtc.orgb1786db2015-02-03 06:06:26 +0000218 * int* median Delay median value.
219 * int* std Delay standard deviation.
220 * float* fraction_poor_delays Fraction of the delay estimates that may
221 * cause the AEC to perform poorly.
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000222 *
peahc12be392015-11-09 23:53:50 -0800223 * int return 0: OK
224 * 12000-12050: error code
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000225 */
bjornv@webrtc.orgb1786db2015-02-03 06:06:26 +0000226int WebRtcAec_GetDelayMetrics(void* handle,
227 int* median,
228 int* std,
229 float* fraction_poor_delays);
bjornv@google.com1ba3dbe2011-10-03 08:18:10 +0000230
bjornv@webrtc.org132c15d2013-02-27 21:03:41 +0000231// Returns a pointer to the low level AEC handle.
232//
233// Input:
234// - handle : Pointer to the AEC instance.
235//
236// Return value:
237// - AecCore pointer : NULL for error.
238//
239struct AecCore* WebRtcAec_aec_core(void* handle);
240
niklase@google.com470e71d2011-07-07 08:21:25 +0000241#ifdef __cplusplus
242}
243#endif
Henrik Kjellander9b72af92015-11-11 20:16:11 +0100244#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_