| /* | 
 |  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #ifndef MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_ | 
 | #define MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_ | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include <stddef.h> | 
 |  | 
 | extern "C" { | 
 | #include "common_audio/ring_buffer.h" | 
 | } | 
 | #include "modules/audio_processing/aec/aec_core.h" | 
 | #include "typedefs.h"  // NOLINT(build/include) | 
 |  | 
 | namespace webrtc { | 
 |  | 
 | // Errors | 
 | #define AEC_UNSPECIFIED_ERROR 12000 | 
 | #define AEC_UNSUPPORTED_FUNCTION_ERROR 12001 | 
 | #define AEC_UNINITIALIZED_ERROR 12002 | 
 | #define AEC_NULL_POINTER_ERROR 12003 | 
 | #define AEC_BAD_PARAMETER_ERROR 12004 | 
 |  | 
 | // Warnings | 
 | #define AEC_BAD_PARAMETER_WARNING 12050 | 
 |  | 
 | enum { kAecNlpConservative = 0, kAecNlpModerate, kAecNlpAggressive }; | 
 |  | 
 | enum { kAecFalse = 0, kAecTrue }; | 
 |  | 
 | typedef struct { | 
 |   int16_t nlpMode;      // default kAecNlpModerate | 
 |   int16_t skewMode;     // default kAecFalse | 
 |   int16_t metricsMode;  // default kAecFalse | 
 |   int delay_logging;    // default kAecFalse | 
 |   // float realSkew; | 
 | } AecConfig; | 
 |  | 
 | typedef struct { | 
 |   int instant; | 
 |   int average; | 
 |   int max; | 
 |   int min; | 
 | } AecLevel; | 
 |  | 
 | typedef struct { | 
 |   AecLevel rerl; | 
 |   AecLevel erl; | 
 |   AecLevel erle; | 
 |   AecLevel aNlp; | 
 |   float divergent_filter_fraction; | 
 | } AecMetrics; | 
 |  | 
 | struct AecCore; | 
 |  | 
 | class ApmDataDumper; | 
 |  | 
 | typedef struct Aec { | 
 |   Aec(); | 
 |   ~Aec(); | 
 |  | 
 |   std::unique_ptr<ApmDataDumper> data_dumper; | 
 |  | 
 |   int delayCtr; | 
 |   int sampFreq; | 
 |   int splitSampFreq; | 
 |   int scSampFreq; | 
 |   float sampFactor;  // scSampRate / sampFreq | 
 |   short skewMode; | 
 |   int bufSizeStart; | 
 |   int knownDelay; | 
 |   int rate_factor; | 
 |  | 
 |   short initFlag;  // indicates if AEC has been initialized | 
 |  | 
 |   // Variables used for averaging far end buffer size | 
 |   short counter; | 
 |   int sum; | 
 |   short firstVal; | 
 |   short checkBufSizeCtr; | 
 |  | 
 |   // Variables used for delay shifts | 
 |   short msInSndCardBuf; | 
 |   short filtDelay;  // Filtered delay estimate. | 
 |   int timeForDelayChange; | 
 |   int startup_phase; | 
 |   int checkBuffSize; | 
 |   short lastDelayDiff; | 
 |  | 
 |   // Structures | 
 |   void* resampler; | 
 |  | 
 |   int skewFrCtr; | 
 |   int resample;  // if the skew is small enough we don't resample | 
 |   int highSkewCtr; | 
 |   float skew; | 
 |  | 
 |   RingBuffer* far_pre_buf;  // Time domain far-end pre-buffer. | 
 |  | 
 |   int farend_started; | 
 |  | 
 |   // Aec instance counter. | 
 |   static int instance_count; | 
 |   AecCore* aec; | 
 | } Aec; | 
 |  | 
 | /* | 
 |  * Allocates the memory needed by the AEC. The memory needs to be initialized | 
 |  * separately using the WebRtcAec_Init() function. Returns a pointer to the | 
 |  * object or NULL on error. | 
 |  */ | 
 | void* WebRtcAec_Create(); | 
 |  | 
 | /* | 
 |  * This function releases the memory allocated by WebRtcAec_Create(). | 
 |  * | 
 |  * Inputs                       Description | 
 |  * ------------------------------------------------------------------- | 
 |  * void*        aecInst         Pointer to the AEC instance | 
 |  */ | 
 | void WebRtcAec_Free(void* aecInst); | 
 |  | 
 | /* | 
 |  * Initializes an AEC instance. | 
 |  * | 
 |  * Inputs                       Description | 
 |  * ------------------------------------------------------------------- | 
 |  * void*          aecInst       Pointer to the AEC instance | 
 |  * int32_t        sampFreq      Sampling frequency of data | 
 |  * int32_t        scSampFreq    Soundcard sampling frequency | 
 |  * | 
 |  * Outputs                      Description | 
 |  * ------------------------------------------------------------------- | 
 |  * int32_t        return        0: OK | 
 |  *                             -1: error | 
 |  */ | 
 | int32_t WebRtcAec_Init(void* aecInst, int32_t sampFreq, int32_t scSampFreq); | 
 |  | 
 | /* | 
 |  * Inserts an 80 or 160 sample block of data into the farend buffer. | 
 |  * | 
 |  * Inputs                       Description | 
 |  * ------------------------------------------------------------------- | 
 |  * void*          aecInst       Pointer to the AEC instance | 
 |  * const float*   farend        In buffer containing one frame of | 
 |  *                              farend signal for L band | 
 |  * int16_t        nrOfSamples   Number of samples in farend buffer | 
 |  * | 
 |  * Outputs                      Description | 
 |  * ------------------------------------------------------------------- | 
 |  * int32_t        return        0: OK | 
 |  *                              12000-12050: error code | 
 |  */ | 
 | int32_t WebRtcAec_BufferFarend(void* aecInst, | 
 |                                const float* farend, | 
 |                                size_t nrOfSamples); | 
 |  | 
 | /* | 
 |  * Reports any errors that would arise if buffering a farend buffer | 
 |  * | 
 |  * Inputs                       Description | 
 |  * ------------------------------------------------------------------- | 
 |  * void*          aecInst       Pointer to the AEC instance | 
 |  * const float*   farend        In buffer containing one frame of | 
 |  *                              farend signal for L band | 
 |  * int16_t        nrOfSamples   Number of samples in farend buffer | 
 |  * | 
 |  * Outputs                      Description | 
 |  * ------------------------------------------------------------------- | 
 |  * int32_t        return        0: OK | 
 |  *                              12000-12050: error code | 
 |  */ | 
 | int32_t WebRtcAec_GetBufferFarendError(void* aecInst, | 
 |                                        const float* farend, | 
 |                                        size_t nrOfSamples); | 
 |  | 
 | /* | 
 |  * Runs the echo canceller on an 80 or 160 sample blocks of data. | 
 |  * | 
 |  * Inputs                       Description | 
 |  * ------------------------------------------------------------------- | 
 |  * void*         aecInst        Pointer to the AEC instance | 
 |  * float* const* nearend        In buffer containing one frame of | 
 |  *                              nearend+echo signal for each band | 
 |  * int           num_bands      Number of bands in nearend buffer | 
 |  * int16_t       nrOfSamples    Number of samples in nearend buffer | 
 |  * int16_t       msInSndCardBuf Delay estimate for sound card and | 
 |  *                              system buffers | 
 |  * int16_t       skew           Difference between number of samples played | 
 |  *                              and recorded at the soundcard (for clock skew | 
 |  *                              compensation) | 
 |  * | 
 |  * Outputs                      Description | 
 |  * ------------------------------------------------------------------- | 
 |  * float* const* out            Out buffer, one frame of processed nearend | 
 |  *                              for each band | 
 |  * int32_t       return         0: OK | 
 |  *                              12000-12050: error code | 
 |  */ | 
 | int32_t WebRtcAec_Process(void* aecInst, | 
 |                           const float* const* nearend, | 
 |                           size_t num_bands, | 
 |                           float* const* out, | 
 |                           size_t nrOfSamples, | 
 |                           int16_t msInSndCardBuf, | 
 |                           int32_t skew); | 
 |  | 
 | /* | 
 |  * This function enables the user to set certain parameters on-the-fly. | 
 |  * | 
 |  * Inputs                       Description | 
 |  * ------------------------------------------------------------------- | 
 |  * void*          handle        Pointer to the AEC instance | 
 |  * AecConfig      config        Config instance that contains all | 
 |  *                              properties to be set | 
 |  * | 
 |  * Outputs                      Description | 
 |  * ------------------------------------------------------------------- | 
 |  * int            return        0: OK | 
 |  *                              12000-12050: error code | 
 |  */ | 
 | int WebRtcAec_set_config(void* handle, AecConfig config); | 
 |  | 
 | /* | 
 |  * Gets the current echo status of the nearend signal. | 
 |  * | 
 |  * Inputs                       Description | 
 |  * ------------------------------------------------------------------- | 
 |  * void*          handle        Pointer to the AEC instance | 
 |  * | 
 |  * Outputs                      Description | 
 |  * ------------------------------------------------------------------- | 
 |  * int*           status        0: Almost certainly nearend single-talk | 
 |  *                              1: Might not be neared single-talk | 
 |  * int            return        0: OK | 
 |  *                              12000-12050: error code | 
 |  */ | 
 | int WebRtcAec_get_echo_status(void* handle, int* status); | 
 |  | 
 | /* | 
 |  * Gets the current echo metrics for the session. | 
 |  * | 
 |  * Inputs                       Description | 
 |  * ------------------------------------------------------------------- | 
 |  * void*          handle        Pointer to the AEC instance | 
 |  * | 
 |  * Outputs                      Description | 
 |  * ------------------------------------------------------------------- | 
 |  * AecMetrics*    metrics       Struct which will be filled out with the | 
 |  *                              current echo metrics. | 
 |  * int            return        0: OK | 
 |  *                              12000-12050: error code | 
 |  */ | 
 | int WebRtcAec_GetMetrics(void* handle, AecMetrics* metrics); | 
 |  | 
 | /* | 
 |  * Gets the current delay metrics for the session. | 
 |  * | 
 |  * Inputs                       Description | 
 |  * ------------------------------------------------------------------- | 
 |  * void*   handle               Pointer to the AEC instance | 
 |  * | 
 |  * Outputs                      Description | 
 |  * ------------------------------------------------------------------- | 
 |  * int*    median               Delay median value. | 
 |  * int*    std                  Delay standard deviation. | 
 |  * float*  fraction_poor_delays Fraction of the delay estimates that may | 
 |  *                              cause the AEC to perform poorly. | 
 |  * | 
 |  * int            return        0: OK | 
 |  *                              12000-12050: error code | 
 |  */ | 
 | int WebRtcAec_GetDelayMetrics(void* handle, | 
 |                               int* median, | 
 |                               int* std, | 
 |                               float* fraction_poor_delays); | 
 |  | 
 | // Returns a pointer to the low level AEC handle. | 
 | // | 
 | // Input: | 
 | //  - handle                    : Pointer to the AEC instance. | 
 | // | 
 | // Return value: | 
 | //  - AecCore pointer           : NULL for error. | 
 | // | 
 | struct AecCore* WebRtcAec_aec_core(void* handle); | 
 |  | 
 | }  // namespace webrtc | 
 |  | 
 | #endif  // MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_ |