1 /*
2  *  Copyright (c) 2011 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_AECM_MAIN_INTERFACE_ECHO_CONTROL_MOBILE_H_
12 #define WEBRTC_MODULES_AUDIO_PROCESSING_AECM_MAIN_INTERFACE_ECHO_CONTROL_MOBILE_H_
13 
14 #include "typedefs.h"
15 
16 enum {
17     AecmFalse = 0,
18     AecmTrue
19 };
20 
21 // Errors
22 #define AECM_UNSPECIFIED_ERROR           12000
23 #define AECM_UNSUPPORTED_FUNCTION_ERROR  12001
24 #define AECM_UNINITIALIZED_ERROR         12002
25 #define AECM_NULL_POINTER_ERROR          12003
26 #define AECM_BAD_PARAMETER_ERROR         12004
27 
28 // Warnings
29 #define AECM_BAD_PARAMETER_WARNING       12100
30 
31 typedef struct {
32     WebRtc_Word16 cngMode;            // AECM_FALSE, AECM_TRUE (default)
33     WebRtc_Word16 echoMode;           // 0, 1, 2, 3 (default), 4
34 } AecmConfig;
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
40 /*
41  * Allocates the memory needed by the AECM. The memory needs to be
42  * initialized separately using the WebRtcAecm_Init() function.
43  *
44  * Inputs                           Description
45  * -------------------------------------------------------------------
46  * void **aecmInst                  Pointer to the AECM instance to be
47  *                                  created and initialized
48  *
49  * Outputs                          Description
50  * -------------------------------------------------------------------
51  * WebRtc_Word32 return             0: OK
52  *                                 -1: error
53  */
54 WebRtc_Word32 WebRtcAecm_Create(void **aecmInst);
55 
56 /*
57  * This function releases the memory allocated by WebRtcAecm_Create()
58  *
59  * Inputs                       Description
60  * -------------------------------------------------------------------
61  * void *aecmInst               Pointer to the AECM instance
62  *
63  * Outputs                      Description
64  * -------------------------------------------------------------------
65  * WebRtc_Word32  return        0: OK
66  *                             -1: error
67  */
68 WebRtc_Word32 WebRtcAecm_Free(void *aecmInst);
69 
70 /*
71  * Initializes an AECM instance.
72  *
73  * Inputs                       Description
74  * -------------------------------------------------------------------
75  * void           *aecmInst     Pointer to the AECM instance
76  * WebRtc_Word32  sampFreq      Sampling frequency of data
77  *
78  * Outputs                      Description
79  * -------------------------------------------------------------------
80  * WebRtc_Word32  return        0: OK
81  *                             -1: error
82  */
83 WebRtc_Word32 WebRtcAecm_Init(void* aecmInst,
84                               WebRtc_Word32 sampFreq);
85 
86 /*
87  * Inserts an 80 or 160 sample block of data into the farend buffer.
88  *
89  * Inputs                       Description
90  * -------------------------------------------------------------------
91  * void           *aecmInst     Pointer to the AECM instance
92  * WebRtc_Word16  *farend       In buffer containing one frame of
93  *                              farend signal
94  * WebRtc_Word16  nrOfSamples   Number of samples in farend buffer
95  *
96  * Outputs                      Description
97  * -------------------------------------------------------------------
98  * WebRtc_Word32  return        0: OK
99  *                             -1: error
100  */
101 WebRtc_Word32 WebRtcAecm_BufferFarend(void* aecmInst,
102                                       const WebRtc_Word16* farend,
103                                       WebRtc_Word16 nrOfSamples);
104 
105 /*
106  * Runs the AECM on an 80 or 160 sample blocks of data.
107  *
108  * Inputs                       Description
109  * -------------------------------------------------------------------
110  * void           *aecmInst      Pointer to the AECM instance
111  * WebRtc_Word16  *nearendNoisy  In buffer containing one frame of
112  *                               reference nearend+echo signal. If
113  *                               noise reduction is active, provide
114  *                               the noisy signal here.
115  * WebRtc_Word16  *nearendClean  In buffer containing one frame of
116  *                               nearend+echo signal. If noise
117  *                               reduction is active, provide the
118  *                               clean signal here. Otherwise pass a
119  *                               NULL pointer.
120  * WebRtc_Word16  nrOfSamples    Number of samples in nearend buffer
121  * WebRtc_Word16  msInSndCardBuf Delay estimate for sound card and
122  *                               system buffers
123  *
124  * Outputs                      Description
125  * -------------------------------------------------------------------
126  * WebRtc_Word16  *out          Out buffer, one frame of processed nearend
127  * WebRtc_Word32  return        0: OK
128  *                             -1: error
129  */
130 WebRtc_Word32 WebRtcAecm_Process(void* aecmInst,
131                                  const WebRtc_Word16* nearendNoisy,
132                                  const WebRtc_Word16* nearendClean,
133                                  WebRtc_Word16* out,
134                                  WebRtc_Word16 nrOfSamples,
135                                  WebRtc_Word16 msInSndCardBuf);
136 
137 /*
138  * This function enables the user to set certain parameters on-the-fly
139  *
140  * Inputs                       Description
141  * -------------------------------------------------------------------
142  * void     *aecmInst           Pointer to the AECM instance
143  * AecmConfig config            Config instance that contains all
144  *                              properties to be set
145  *
146  * Outputs                      Description
147  * -------------------------------------------------------------------
148  * WebRtc_Word32  return        0: OK
149  *                             -1: error
150  */
151 WebRtc_Word32 WebRtcAecm_set_config(void* aecmInst,
152                                     AecmConfig config);
153 
154 /*
155  * This function enables the user to set certain parameters on-the-fly
156  *
157  * Inputs                       Description
158  * -------------------------------------------------------------------
159  * void *aecmInst               Pointer to the AECM instance
160  *
161  * Outputs                      Description
162  * -------------------------------------------------------------------
163  * AecmConfig  *config          Pointer to the config instance that
164  *                              all properties will be written to
165  * WebRtc_Word32  return        0: OK
166  *                             -1: error
167  */
168 WebRtc_Word32 WebRtcAecm_get_config(void *aecmInst,
169                                     AecmConfig *config);
170 
171 /*
172  * This function enables the user to set the echo path on-the-fly.
173  *
174  * Inputs                       Description
175  * -------------------------------------------------------------------
176  * void*        aecmInst        Pointer to the AECM instance
177  * void*        echo_path       Pointer to the echo path to be set
178  * size_t       size_bytes      Size in bytes of the echo path
179  *
180  * Outputs                      Description
181  * -------------------------------------------------------------------
182  * WebRtc_Word32  return        0: OK
183  *                             -1: error
184  */
185 WebRtc_Word32 WebRtcAecm_InitEchoPath(void* aecmInst,
186                                       const void* echo_path,
187                                       size_t size_bytes);
188 
189 /*
190  * This function enables the user to get the currently used echo path
191  * on-the-fly
192  *
193  * Inputs                       Description
194  * -------------------------------------------------------------------
195  * void*        aecmInst        Pointer to the AECM instance
196  * void*        echo_path       Pointer to echo path
197  * size_t       size_bytes      Size in bytes of the echo path
198  *
199  * Outputs                      Description
200  * -------------------------------------------------------------------
201  * WebRtc_Word32  return        0: OK
202  *                             -1: error
203  */
204 WebRtc_Word32 WebRtcAecm_GetEchoPath(void* aecmInst,
205                                      void* echo_path,
206                                      size_t size_bytes);
207 
208 /*
209  * This function enables the user to get the echo path size in bytes
210  *
211  * Outputs                      Description
212  * -------------------------------------------------------------------
213  * size_t       return           : size in bytes
214  */
215 size_t WebRtcAecm_echo_path_size_bytes();
216 
217 /*
218  * Gets the last error code.
219  *
220  * Inputs                       Description
221  * -------------------------------------------------------------------
222  * void         *aecmInst       Pointer to the AECM instance
223  *
224  * Outputs                      Description
225  * -------------------------------------------------------------------
226  * WebRtc_Word32  return        11000-11100: error code
227  */
228 WebRtc_Word32 WebRtcAecm_get_error_code(void *aecmInst);
229 
230 /*
231  * Gets a version string
232  *
233  * Inputs                       Description
234  * -------------------------------------------------------------------
235  * char           *versionStr   Pointer to a string array
236  * WebRtc_Word16  len           The maximum length of the string
237  *
238  * Outputs                      Description
239  * -------------------------------------------------------------------
240  * WebRtc_Word8   *versionStr   Pointer to a string array
241  * WebRtc_Word32  return        0: OK
242  *                             -1: error
243  */
244 WebRtc_Word32 WebRtcAecm_get_version(WebRtc_Word8 *versionStr,
245                                      WebRtc_Word16 len);
246 
247 #ifdef __cplusplus
248 }
249 #endif
250 #endif /* WEBRTC_MODULES_AUDIO_PROCESSING_AECM_MAIN_INTERFACE_ECHO_CONTROL_MOBILE_H_ */
251