198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/* Copyright (C) Jean-Marc Valin */ 298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** 398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project @file speex_echo.h 498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project @brief Echo cancellation 598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project*/ 698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/* 798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project Redistribution and use in source and binary forms, with or without 898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project modification, are permitted provided that the following conditions are 998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project met: 1098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 1198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 1. Redistributions of source code must retain the above copyright notice, 1298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project this list of conditions and the following disclaimer. 1398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 1498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 2. Redistributions in binary form must reproduce the above copyright 1598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project notice, this list of conditions and the following disclaimer in the 1698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project documentation and/or other materials provided with the distribution. 1798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 1898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 3. The name of the author may not be used to endorse or promote products 1998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project derived from this software without specific prior written permission. 2098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 2198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 2298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 2598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 2698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 2798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 2998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 3098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project POSSIBILITY OF SUCH DAMAGE. 3298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project*/ 3398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 3498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#ifndef SPEEX_ECHO_H 3598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#define SPEEX_ECHO_H 3698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** @defgroup SpeexEchoState SpeexEchoState: Acoustic echo canceller 3798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * This is the acoustic echo canceller module. 3898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @{ 3998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */ 4098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#include "speex/speex_types.h" 4198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 4298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#ifdef __cplusplus 4398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectextern "C" { 4498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#endif 4598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 4698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Obtain frame size used by the AEC */ 4798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#define SPEEX_ECHO_GET_FRAME_SIZE 3 4898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 4998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Set sampling rate */ 5098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#define SPEEX_ECHO_SET_SAMPLING_RATE 24 5198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Get sampling rate */ 5298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#define SPEEX_ECHO_GET_SAMPLING_RATE 25 5398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 5498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/* Can't set window sizes */ 5598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Get size of impulse response (int32) */ 5698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#define SPEEX_ECHO_GET_IMPULSE_RESPONSE_SIZE 27 5798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 5898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/* Can't set window content */ 5998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Get impulse response (int32[]) */ 6098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#define SPEEX_ECHO_GET_IMPULSE_RESPONSE 29 6198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 6298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Internal echo canceller state. Should never be accessed directly. */ 6398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectstruct SpeexEchoState_; 6498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 6598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** @class SpeexEchoState 6698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * This holds the state of the echo canceller. You need one per channel. 6798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project*/ 6898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 6998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Internal echo canceller state. Should never be accessed directly. */ 7098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projecttypedef struct SpeexEchoState_ SpeexEchoState; 7198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 7298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Creates a new echo canceller state 7398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param frame_size Number of samples to process at one time (should correspond to 10-20 ms) 7498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param filter_length Number of samples of echo to cancel (should generally correspond to 100-500 ms) 7598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @return Newly-created echo canceller state 7698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */ 7798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source ProjectSpeexEchoState *speex_echo_state_init(int frame_size, int filter_length); 7898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 7998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Creates a new multi-channel echo canceller state 8098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param frame_size Number of samples to process at one time (should correspond to 10-20 ms) 8198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param filter_length Number of samples of echo to cancel (should generally correspond to 100-500 ms) 8298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param nb_mic Number of microphone channels 8398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param nb_speakers Number of speaker channels 8498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @return Newly-created echo canceller state 8598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */ 8698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source ProjectSpeexEchoState *speex_echo_state_init_mc(int frame_size, int filter_length, int nb_mic, int nb_speakers); 8798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 8898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Destroys an echo canceller state 8998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param st Echo canceller state 9098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project*/ 9198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_echo_state_destroy(SpeexEchoState *st); 9298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 9398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Performs echo cancellation a frame, based on the audio sent to the speaker (no delay is added 9498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * to playback in this form) 9598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * 9698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param st Echo canceller state 9798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param rec Signal from the microphone (near end + far end echo) 9898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param play Signal played to the speaker (received from far end) 9998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param out Returns near-end signal with echo removed 10098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */ 10198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_echo_cancellation(SpeexEchoState *st, const spx_int16_t *rec, const spx_int16_t *play, spx_int16_t *out); 10298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 10398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Performs echo cancellation a frame (deprecated) */ 10498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_echo_cancel(SpeexEchoState *st, const spx_int16_t *rec, const spx_int16_t *play, spx_int16_t *out, spx_int32_t *Yout); 10598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 10698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Perform echo cancellation using internal playback buffer, which is delayed by two frames 10798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * to account for the delay introduced by most soundcards (but it could be off!) 10898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param st Echo canceller state 10998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param rec Signal from the microphone (near end + far end echo) 11098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param out Returns near-end signal with echo removed 11198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project*/ 11298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_echo_capture(SpeexEchoState *st, const spx_int16_t *rec, spx_int16_t *out); 11398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 11498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Let the echo canceller know that a frame was just queued to the soundcard 11598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param st Echo canceller state 11698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param play Signal played to the speaker (received from far end) 11798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project*/ 11898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_echo_playback(SpeexEchoState *st, const spx_int16_t *play); 11998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 12098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Reset the echo canceller to its original state 12198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param st Echo canceller state 12298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */ 12398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_echo_state_reset(SpeexEchoState *st); 12498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 12598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Used like the ioctl function to control the echo canceller parameters 12698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * 12798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param st Echo canceller state 12898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param request ioctl-type request (one of the SPEEX_ECHO_* macros) 12998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param ptr Data exchanged to-from function 13098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @return 0 if no error, -1 if request in unknown 13198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project */ 13298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectint speex_echo_ctl(SpeexEchoState *st, int request, void *ptr); 13398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 13498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 13598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 13698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectstruct SpeexDecorrState_; 13798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 13898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projecttypedef struct SpeexDecorrState_ SpeexDecorrState; 13998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 14098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 14198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Create a state for the channel decorrelation algorithm 14298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project This is useful for multi-channel echo cancellation only 14398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param rate Sampling rate 14498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param channels Number of channels (it's a bit pointless if you don't have at least 2) 14598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param frame_size Size of the frame to process at ones (counting samples *per* channel) 14698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project*/ 14798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source ProjectSpeexDecorrState *speex_decorrelate_new(int rate, int channels, int frame_size); 14898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 14998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Remove correlation between the channels by modifying the phase and possibly 15098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project adding noise in a way that is not (or little) perceptible. 15198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param st Decorrelator state 15298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param in Input audio in interleaved format 15398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param out Result of the decorrelation (out *may* alias in) 15498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param strength How much alteration of the audio to apply from 0 to 100. 15598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project*/ 15698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_decorrelate(SpeexDecorrState *st, const spx_int16_t *in, spx_int16_t *out, int strength); 15798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 15898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** Destroy a Decorrelation state 15998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project * @param st State to destroy 16098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project*/ 16198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectvoid speex_decorrelate_destroy(SpeexDecorrState *st); 16298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 16398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 16498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#ifdef __cplusplus 16598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project} 16698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#endif 16798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 16898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project 16998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/** @}*/ 17098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#endif 171