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