1 /*
2  *  Copyright (c) 2012 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 
11 #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_
12 #define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_
13 
14 #include <stddef.h>
15 
16 #include "webrtc/typedefs.h"
17 
18 // Errors
19 #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
24 
25 // Warnings
26 #define AEC_BAD_PARAMETER_WARNING 12050
27 
28 enum {
29   kAecNlpConservative = 0,
30   kAecNlpModerate,
31   kAecNlpAggressive
32 };
33 
34 enum {
35   kAecFalse = 0,
36   kAecTrue
37 };
38 
39 typedef struct {
40   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;
45 } AecConfig;
46 
47 typedef struct {
48   int instant;
49   int average;
50   int max;
51   int min;
52 } AecLevel;
53 
54 typedef struct {
55   AecLevel rerl;
56   AecLevel erl;
57   AecLevel erle;
58   AecLevel aNlp;
59 } AecMetrics;
60 
61 struct AecCore;
62 
63 #ifdef __cplusplus
64 extern "C" {
65 #endif
66 
67 /*
68  * Allocates the memory needed by the AEC. The memory needs to be initialized
69  * separately using the WebRtcAec_Init() function. Returns a pointer to the
70  * object or NULL on error.
71  */
72 void* WebRtcAec_Create();
73 
74 /*
75  * This function releases the memory allocated by WebRtcAec_Create().
76  *
77  * Inputs                       Description
78  * -------------------------------------------------------------------
79  * void*        aecInst         Pointer to the AEC instance
80  */
81 void WebRtcAec_Free(void* aecInst);
82 
83 /*
84  * Initializes an AEC instance.
85  *
86  * Inputs                       Description
87  * -------------------------------------------------------------------
88  * void*          aecInst       Pointer to the AEC instance
89  * int32_t        sampFreq      Sampling frequency of data
90  * int32_t        scSampFreq    Soundcard sampling frequency
91  *
92  * Outputs                      Description
93  * -------------------------------------------------------------------
94  * int32_t        return        0: OK
95  *                             -1: error
96  */
97 int32_t WebRtcAec_Init(void* aecInst, int32_t sampFreq, int32_t scSampFreq);
98 
99 /*
100  * Inserts an 80 or 160 sample block of data into the farend buffer.
101  *
102  * Inputs                       Description
103  * -------------------------------------------------------------------
104  * void*          aecInst       Pointer to the AEC instance
105  * const float*   farend        In buffer containing one frame of
106  *                              farend signal for L band
107  * int16_t        nrOfSamples   Number of samples in farend buffer
108  *
109  * Outputs                      Description
110  * -------------------------------------------------------------------
111  * int32_t        return        0: OK
112  *                              12000-12050: error code
113  */
114 int32_t WebRtcAec_BufferFarend(void* aecInst,
115                                const float* farend,
116                                size_t nrOfSamples);
117 
118 /*
119  * Reports any errors that would arise if buffering a farend buffer
120  *
121  * Inputs                       Description
122  * -------------------------------------------------------------------
123  * void*          aecInst       Pointer to the AEC instance
124  * const float*   farend        In buffer containing one frame of
125  *                              farend signal for L band
126  * int16_t        nrOfSamples   Number of samples in farend buffer
127  *
128  * Outputs                      Description
129  * -------------------------------------------------------------------
130  * int32_t        return        0: OK
131  *                              12000-12050: error code
132  */
133 int32_t WebRtcAec_GetBufferFarendError(void* aecInst,
134                                        const float* farend,
135                                        size_t nrOfSamples);
136 
137 /*
138  * Runs the echo canceller on an 80 or 160 sample blocks of data.
139  *
140  * Inputs                       Description
141  * -------------------------------------------------------------------
142  * void*         aecInst        Pointer to the AEC instance
143  * float* const* nearend        In buffer containing one frame of
144  *                              nearend+echo signal for each band
145  * int           num_bands      Number of bands in nearend buffer
146  * int16_t       nrOfSamples    Number of samples in nearend buffer
147  * int16_t       msInSndCardBuf Delay estimate for sound card and
148  *                              system buffers
149  * int16_t       skew           Difference between number of samples played
150  *                              and recorded at the soundcard (for clock skew
151  *                              compensation)
152  *
153  * Outputs                      Description
154  * -------------------------------------------------------------------
155  * float* const* out            Out buffer, one frame of processed nearend
156  *                              for each band
157  * int32_t       return         0: OK
158  *                              12000-12050: error code
159  */
160 int32_t WebRtcAec_Process(void* aecInst,
161                           const float* const* nearend,
162                           size_t num_bands,
163                           float* const* out,
164                           size_t nrOfSamples,
165                           int16_t msInSndCardBuf,
166                           int32_t skew);
167 
168 /*
169  * This function enables the user to set certain parameters on-the-fly.
170  *
171  * Inputs                       Description
172  * -------------------------------------------------------------------
173  * void*          handle        Pointer to the AEC instance
174  * AecConfig      config        Config instance that contains all
175  *                              properties to be set
176  *
177  * Outputs                      Description
178  * -------------------------------------------------------------------
179  * int            return        0: OK
180  *                              12000-12050: error code
181  */
182 int WebRtcAec_set_config(void* handle, AecConfig config);
183 
184 /*
185  * Gets the current echo status of the nearend signal.
186  *
187  * Inputs                       Description
188  * -------------------------------------------------------------------
189  * void*          handle        Pointer to the AEC instance
190  *
191  * Outputs                      Description
192  * -------------------------------------------------------------------
193  * int*           status        0: Almost certainly nearend single-talk
194  *                              1: Might not be neared single-talk
195  * int            return        0: OK
196  *                              12000-12050: error code
197  */
198 int WebRtcAec_get_echo_status(void* handle, int* status);
199 
200 /*
201  * Gets the current echo metrics for the session.
202  *
203  * Inputs                       Description
204  * -------------------------------------------------------------------
205  * void*          handle        Pointer to the AEC instance
206  *
207  * Outputs                      Description
208  * -------------------------------------------------------------------
209  * AecMetrics*    metrics       Struct which will be filled out with the
210  *                              current echo metrics.
211  * int            return        0: OK
212  *                              12000-12050: error code
213  */
214 int WebRtcAec_GetMetrics(void* handle, AecMetrics* metrics);
215 
216 /*
217  * Gets the current delay metrics for the session.
218  *
219  * Inputs                       Description
220  * -------------------------------------------------------------------
221  * void*   handle               Pointer to the AEC instance
222  *
223  * Outputs                      Description
224  * -------------------------------------------------------------------
225  * int*    median               Delay median value.
226  * int*    std                  Delay standard deviation.
227  * float*  fraction_poor_delays Fraction of the delay estimates that may
228  *                              cause the AEC to perform poorly.
229  *
230  * int            return        0: OK
231  *                              12000-12050: error code
232  */
233 int WebRtcAec_GetDelayMetrics(void* handle,
234                               int* median,
235                               int* std,
236                               float* fraction_poor_delays);
237 
238 // Returns a pointer to the low level AEC handle.
239 //
240 // Input:
241 //  - handle                    : Pointer to the AEC instance.
242 //
243 // Return value:
244 //  - AecCore pointer           : NULL for error.
245 //
246 struct AecCore* WebRtcAec_aec_core(void* handle);
247 
248 #ifdef __cplusplus
249 }
250 #endif
251 #endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_
252