Home | History | Annotate | Download | only in interface
      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_AEC_MAIN_INTERFACE_ECHO_CANCELLATION_H_
     12 #define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_INTERFACE_ECHO_CANCELLATION_H_
     13 
     14 #include "typedefs.h"
     15 
     16 // Errors
     17 #define AEC_UNSPECIFIED_ERROR           12000
     18 #define AEC_UNSUPPORTED_FUNCTION_ERROR  12001
     19 #define AEC_UNINITIALIZED_ERROR         12002
     20 #define AEC_NULL_POINTER_ERROR          12003
     21 #define AEC_BAD_PARAMETER_ERROR         12004
     22 
     23 // Warnings
     24 #define AEC_BAD_PARAMETER_WARNING       12050
     25 
     26 enum {
     27     kAecNlpConservative = 0,
     28     kAecNlpModerate,
     29     kAecNlpAggressive
     30 };
     31 
     32 enum {
     33     kAecFalse = 0,
     34     kAecTrue
     35 };
     36 
     37 typedef struct {
     38     WebRtc_Word16 nlpMode;        // default kAecNlpModerate
     39     WebRtc_Word16 skewMode;       // default kAecFalse
     40     WebRtc_Word16 metricsMode;    // default kAecFalse
     41     //float realSkew;
     42 } AecConfig;
     43 
     44 typedef struct {
     45     WebRtc_Word16 instant;
     46     WebRtc_Word16 average;
     47     WebRtc_Word16 max;
     48     WebRtc_Word16 min;
     49 } AecLevel;
     50 
     51 typedef struct {
     52     AecLevel rerl;
     53     AecLevel erl;
     54     AecLevel erle;
     55     AecLevel aNlp;
     56 } AecMetrics;
     57 
     58 #ifdef __cplusplus
     59 extern "C" {
     60 #endif
     61 
     62 /*
     63  * Allocates the memory needed by the AEC. The memory needs to be initialized
     64  * separately using the WebRtcAec_Init() function.
     65  *
     66  * Inputs                       Description
     67  * -------------------------------------------------------------------
     68  * void **aecInst               Pointer to the AEC instance to be created
     69  *                              and initilized
     70  *
     71  * Outputs                      Description
     72  * -------------------------------------------------------------------
     73  * WebRtc_Word32 return          0: OK
     74  *                              -1: error
     75  */
     76 WebRtc_Word32 WebRtcAec_Create(void **aecInst);
     77 
     78 /*
     79  * This function releases the memory allocated by WebRtcAec_Create().
     80  *
     81  * Inputs                       Description
     82  * -------------------------------------------------------------------
     83  * void         *aecInst        Pointer to the AEC instance
     84  *
     85  * Outputs                      Description
     86  * -------------------------------------------------------------------
     87  * WebRtc_Word32  return         0: OK
     88  *                              -1: error
     89  */
     90 WebRtc_Word32 WebRtcAec_Free(void *aecInst);
     91 
     92 /*
     93  * Initializes an AEC instance.
     94  *
     95  * Inputs                       Description
     96  * -------------------------------------------------------------------
     97  * void           *aecInst      Pointer to the AEC instance
     98  * WebRtc_Word32  sampFreq      Sampling frequency of data
     99  * WebRtc_Word32  scSampFreq    Soundcard sampling frequency
    100  *
    101  * Outputs                      Description
    102  * -------------------------------------------------------------------
    103  * WebRtc_Word32 return          0: OK
    104  *                              -1: error
    105  */
    106 WebRtc_Word32 WebRtcAec_Init(void *aecInst,
    107                              WebRtc_Word32 sampFreq,
    108                              WebRtc_Word32 scSampFreq);
    109 
    110 /*
    111  * Inserts an 80 or 160 sample block of data into the farend buffer.
    112  *
    113  * Inputs                       Description
    114  * -------------------------------------------------------------------
    115  * void           *aecInst      Pointer to the AEC instance
    116  * WebRtc_Word16  *farend       In buffer containing one frame of
    117  *                              farend signal for L band
    118  * WebRtc_Word16  nrOfSamples   Number of samples in farend buffer
    119  *
    120  * Outputs                      Description
    121  * -------------------------------------------------------------------
    122  * WebRtc_Word32  return         0: OK
    123  *                              -1: error
    124  */
    125 WebRtc_Word32 WebRtcAec_BufferFarend(void *aecInst,
    126                                      const WebRtc_Word16 *farend,
    127                                      WebRtc_Word16 nrOfSamples);
    128 
    129 /*
    130  * Runs the echo canceller on an 80 or 160 sample blocks of data.
    131  *
    132  * Inputs                       Description
    133  * -------------------------------------------------------------------
    134  * void          *aecInst       Pointer to the AEC instance
    135  * WebRtc_Word16 *nearend       In buffer containing one frame of
    136  *                              nearend+echo signal for L band
    137  * WebRtc_Word16 *nearendH      In buffer containing one frame of
    138  *                              nearend+echo signal for H band
    139  * WebRtc_Word16 nrOfSamples    Number of samples in nearend buffer
    140  * WebRtc_Word16 msInSndCardBuf Delay estimate for sound card and
    141  *                              system buffers
    142  * WebRtc_Word16 skew           Difference between number of samples played
    143  *                              and recorded at the soundcard (for clock skew
    144  *                              compensation)
    145  *
    146  * Outputs                      Description
    147  * -------------------------------------------------------------------
    148  * WebRtc_Word16  *out          Out buffer, one frame of processed nearend
    149  *                              for L band
    150  * WebRtc_Word16  *outH         Out buffer, one frame of processed nearend
    151  *                              for H band
    152  * WebRtc_Word32  return         0: OK
    153  *                              -1: error
    154  */
    155 WebRtc_Word32 WebRtcAec_Process(void *aecInst,
    156                                 const WebRtc_Word16 *nearend,
    157                                 const WebRtc_Word16 *nearendH,
    158                                 WebRtc_Word16 *out,
    159                                 WebRtc_Word16 *outH,
    160                                 WebRtc_Word16 nrOfSamples,
    161                                 WebRtc_Word16 msInSndCardBuf,
    162                                 WebRtc_Word32 skew);
    163 
    164 /*
    165  * This function enables the user to set certain parameters on-the-fly.
    166  *
    167  * Inputs                       Description
    168  * -------------------------------------------------------------------
    169  * void           *aecInst      Pointer to the AEC instance
    170  * AecConfig      config        Config instance that contains all
    171  *                              properties to be set
    172  *
    173  * Outputs                      Description
    174  * -------------------------------------------------------------------
    175  * WebRtc_Word32  return         0: OK
    176  *                              -1: error
    177  */
    178 WebRtc_Word32 WebRtcAec_set_config(void *aecInst, AecConfig config);
    179 
    180 /*
    181  * Gets the on-the-fly paramters.
    182  *
    183  * Inputs                       Description
    184  * -------------------------------------------------------------------
    185  * void           *aecInst      Pointer to the AEC instance
    186  *
    187  * Outputs                      Description
    188  * -------------------------------------------------------------------
    189  * AecConfig      *config       Pointer to the config instance that
    190  *                              all properties will be written to
    191  * WebRtc_Word32  return         0: OK
    192  *                              -1: error
    193  */
    194 WebRtc_Word32 WebRtcAec_get_config(void *aecInst, AecConfig *config);
    195 
    196 /*
    197  * Gets the current echo status of the nearend signal.
    198  *
    199  * Inputs                       Description
    200  * -------------------------------------------------------------------
    201  * void           *aecInst      Pointer to the AEC instance
    202  *
    203  * Outputs                      Description
    204  * -------------------------------------------------------------------
    205  * WebRtc_Word16  *status       0: Almost certainly nearend single-talk
    206  *                              1: Might not be neared single-talk
    207  * WebRtc_Word32  return         0: OK
    208  *                              -1: error
    209  */
    210 WebRtc_Word32 WebRtcAec_get_echo_status(void *aecInst, WebRtc_Word16 *status);
    211 
    212 /*
    213  * Gets the current echo metrics for the session.
    214  *
    215  * Inputs                       Description
    216  * -------------------------------------------------------------------
    217  * void           *aecInst      Pointer to the AEC instance
    218  *
    219  * Outputs                      Description
    220  * -------------------------------------------------------------------
    221  * AecMetrics     *metrics      Struct which will be filled out with the
    222  *                              current echo metrics.
    223  * WebRtc_Word32  return         0: OK
    224  *                              -1: error
    225  */
    226 WebRtc_Word32 WebRtcAec_GetMetrics(void *aecInst, AecMetrics *metrics);
    227 
    228 /*
    229  * Gets the last error code.
    230  *
    231  * Inputs                       Description
    232  * -------------------------------------------------------------------
    233  * void           *aecInst      Pointer to the AEC instance
    234  *
    235  * Outputs                      Description
    236  * -------------------------------------------------------------------
    237  * WebRtc_Word32  return        11000-11100: error code
    238  */
    239 WebRtc_Word32 WebRtcAec_get_error_code(void *aecInst);
    240 
    241 /*
    242  * Gets a version string.
    243  *
    244  * Inputs                       Description
    245  * -------------------------------------------------------------------
    246  * char           *versionStr   Pointer to a string array
    247  * WebRtc_Word16  len           The maximum length of the string
    248  *
    249  * Outputs                      Description
    250  * -------------------------------------------------------------------
    251  * WebRtc_Word8   *versionStr   Pointer to a string array
    252  * WebRtc_Word32  return         0: OK
    253  *                              -1: error
    254  */
    255 WebRtc_Word32 WebRtcAec_get_version(WebRtc_Word8 *versionStr, WebRtc_Word16 len);
    256 
    257 #ifdef __cplusplus
    258 }
    259 #endif
    260 #endif  /* WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_INTERFACE_ECHO_CANCELLATION_H_ */
    261