Home | History | Annotate | Download | only in aecm
      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_ECHO_CONTROL_MOBILE_H_
     12 #define WEBRTC_MODULES_AUDIO_PROCESSING_AECM_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  *                              1200-12004,12100: error/warning
     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  *                              1200-12004,12100: error/warning
     87  */
     88 int32_t WebRtcAecm_BufferFarend(void* aecmInst,
     89                                 const int16_t* farend,
     90                                 size_t nrOfSamples);
     91 
     92 /*
     93  * Reports any errors that would arise when buffering a farend buffer.
     94  *
     95  * Inputs                       Description
     96  * -------------------------------------------------------------------
     97  * void*          aecmInst      Pointer to the AECM instance
     98  * int16_t*       farend        In buffer containing one frame of
     99  *                              farend signal
    100  * int16_t        nrOfSamples   Number of samples in farend buffer
    101  *
    102  * Outputs                      Description
    103  * -------------------------------------------------------------------
    104  * int32_t        return        0: OK
    105  *                              1200-12004,12100: error/warning
    106  */
    107 int32_t WebRtcAecm_GetBufferFarendError(void* aecmInst,
    108                                         const int16_t* farend,
    109                                         size_t nrOfSamples);
    110 
    111 /*
    112  * Runs the AECM on an 80 or 160 sample blocks of data.
    113  *
    114  * Inputs                        Description
    115  * -------------------------------------------------------------------
    116  * void*          aecmInst       Pointer to the AECM instance
    117  * int16_t*       nearendNoisy   In buffer containing one frame of
    118  *                               reference nearend+echo signal. If
    119  *                               noise reduction is active, provide
    120  *                               the noisy signal here.
    121  * int16_t*       nearendClean   In buffer containing one frame of
    122  *                               nearend+echo signal. If noise
    123  *                               reduction is active, provide the
    124  *                               clean signal here. Otherwise pass a
    125  *                               NULL pointer.
    126  * int16_t        nrOfSamples    Number of samples in nearend buffer
    127  * int16_t        msInSndCardBuf Delay estimate for sound card and
    128  *                               system buffers
    129  *
    130  * Outputs                       Description
    131  * -------------------------------------------------------------------
    132  * int16_t*       out            Out buffer, one frame of processed nearend
    133  * int32_t        return         0: OK
    134  *                               1200-12004,12100: error/warning
    135  */
    136 int32_t WebRtcAecm_Process(void* aecmInst,
    137                            const int16_t* nearendNoisy,
    138                            const int16_t* nearendClean,
    139                            int16_t* out,
    140                            size_t nrOfSamples,
    141                            int16_t msInSndCardBuf);
    142 
    143 /*
    144  * This function enables the user to set certain parameters on-the-fly
    145  *
    146  * Inputs                       Description
    147  * -------------------------------------------------------------------
    148  * void*          aecmInst      Pointer to the AECM instance
    149  * AecmConfig     config        Config instance that contains all
    150  *                              properties to be set
    151  *
    152  * Outputs                      Description
    153  * -------------------------------------------------------------------
    154  * int32_t        return        0: OK
    155  *                              1200-12004,12100: error/warning
    156  */
    157 int32_t WebRtcAecm_set_config(void* aecmInst, AecmConfig config);
    158 
    159 /*
    160  * This function enables the user to set the echo path on-the-fly.
    161  *
    162  * Inputs                       Description
    163  * -------------------------------------------------------------------
    164  * void*        aecmInst        Pointer to the AECM instance
    165  * void*        echo_path       Pointer to the echo path to be set
    166  * size_t       size_bytes      Size in bytes of the echo path
    167  *
    168  * Outputs                      Description
    169  * -------------------------------------------------------------------
    170  * int32_t      return          0: OK
    171  *                              1200-12004,12100: error/warning
    172  */
    173 int32_t WebRtcAecm_InitEchoPath(void* aecmInst,
    174                                 const void* echo_path,
    175                                 size_t size_bytes);
    176 
    177 /*
    178  * This function enables the user to get the currently used echo path
    179  * on-the-fly
    180  *
    181  * Inputs                       Description
    182  * -------------------------------------------------------------------
    183  * void*        aecmInst        Pointer to the AECM instance
    184  * void*        echo_path       Pointer to echo path
    185  * size_t       size_bytes      Size in bytes of the echo path
    186  *
    187  * Outputs                      Description
    188  * -------------------------------------------------------------------
    189  * int32_t      return          0: OK
    190  *                              1200-12004,12100: error/warning
    191  */
    192 int32_t WebRtcAecm_GetEchoPath(void* aecmInst,
    193                                void* echo_path,
    194                                size_t size_bytes);
    195 
    196 /*
    197  * This function enables the user to get the echo path size in bytes
    198  *
    199  * Outputs                      Description
    200  * -------------------------------------------------------------------
    201  * size_t       return          Size in bytes
    202  */
    203 size_t WebRtcAecm_echo_path_size_bytes();
    204 
    205 
    206 #ifdef __cplusplus
    207 }
    208 #endif
    209 #endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AECM_ECHO_CONTROL_MOBILE_H_
    210