Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a83987d2 authored by Chia-chi Yeh's avatar Chia-chi Yeh Committed by Android (Google) Code Review
Browse files

Merge "RTP: integrate the echo canceller from speex." into gingerbread

parents 5b1f0c9f 4ae6ec42
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -32,10 +32,11 @@ LOCAL_SHARED_LIBRARIES := \
	libutils \
	libmedia

LOCAL_STATIC_LIBRARIES :=
LOCAL_STATIC_LIBRARIES := libspeex

LOCAL_C_INCLUDES += \
	$(JNI_H_INCLUDE)
	$(JNI_H_INCLUDE) \
	external/speex/include

LOCAL_CFLAGS += -fvisibility=hidden

+15 −4
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@
#include <media/AudioTrack.h>
#include <media/mediarecorder.h>

#include <speex/speex_echo.h>

#include "jni.h"
#include "JNIHelp.h"

@@ -446,6 +448,8 @@ private:
    AudioTrack mTrack;
    AudioRecord mRecord;
    
    SpeexEchoState *mEchoState;

    bool networkLoop();
    bool deviceLoop();

@@ -506,6 +510,7 @@ AudioGroup::AudioGroup()
    mEventQueue = -1;
    mDtmfEvent = -1;
    mDeviceSocket = -1;
    mEchoState = NULL;
    mNetworkThread = new NetworkThread(this);
    mDeviceThread = new DeviceThread(this);
}
@@ -518,6 +523,9 @@ AudioGroup::~AudioGroup()
    mRecord.stop();
    close(mEventQueue);
    close(mDeviceSocket);
    if (mEchoState) {
        speex_echo_state_destroy(mEchoState);
    }
    while (mChain) {
        AudioStream *next = mChain->mNext;
        delete mChain;
@@ -566,7 +574,8 @@ bool AudioGroup::set(int sampleRate, int sampleCount)
    }
    LOGD("latency: output %d, input %d", mTrack.latency(), mRecord.latency());

    // TODO: initialize echo canceler here.
    // Initialize echo canceller.
    mEchoState = speex_echo_state_init(sampleCount, sampleRate);

    // Create device socket.
    int pair[2];
@@ -633,6 +642,7 @@ bool AudioGroup::setMode(int mode)
    if (mode == MUTED) {
        mRecord.stop();
    } else {
        speex_echo_state_reset(mEchoState);
        mRecord.start();
    }

@@ -793,7 +803,7 @@ bool AudioGroup::deviceLoop()

            status_t status = mRecord.obtainBuffer(&buffer, 1);
            if (status == NO_ERROR) {
                int count = (buffer.frameCount < toRead) ?
                int count = ((int)buffer.frameCount < toRead) ?
                        buffer.frameCount : toRead;
                memcpy(&input[mSampleCount - toRead], buffer.i8, count * 2);
                toRead -= count;
@@ -817,8 +827,9 @@ bool AudioGroup::deviceLoop()
        if (mMode == NORMAL) {
            send(mDeviceSocket, input, sizeof(input), MSG_DONTWAIT);
        } else {
            // TODO: Echo canceller runs here.
            send(mDeviceSocket, input, sizeof(input), MSG_DONTWAIT);
            int16_t result[mSampleCount];
            speex_echo_cancellation(mEchoState, input, output, result);
            send(mDeviceSocket, result, sizeof(result), MSG_DONTWAIT);
        }
    }
    return true;