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