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