diff --git a/cmake/modules/FindSpeexDSP.cmake b/cmake/modules/FindSpeexDSP.cmake index 09ca653b4e..cd9eed44d5 100644 --- a/cmake/modules/FindSpeexDSP.cmake +++ b/cmake/modules/FindSpeexDSP.cmake @@ -47,7 +47,7 @@ if (SPEEXDSP_INCLUDE_DIRS AND SPEEXDSP_LIBRARIES) set(SPEEXDSP_FOUND TRUE) -else (SPEEXDSP_INCLUDE_DIRS) +else (SPEEXDSP_INCLUDE_DIRS AND SPEEXDSP_LIBRARIES) find_path(SPEEXDSP_INCLUDE_DIRS speex/speex.h /usr/include @@ -84,5 +84,5 @@ else (SPEEXDSP_INCLUDE_DIRS) mark_as_advanced(SPEEXDSP_INCLUDE_DIRS SPEEXDSP_LIBRARIES) -endif (SPEEXDSP_INCLUDE_DIRS) +endif (SPEEXDSP_INCLUDE_DIRS AND SPEEXDSP_LIBRARIES) diff --git a/interface/external/Speex/lib/MacOS/libspeex.1.5.0.dylib b/interface/external/Speex/lib/MacOS/libspeex.1.5.0.dylib deleted file mode 100644 index da55377cf9..0000000000 Binary files a/interface/external/Speex/lib/MacOS/libspeex.1.5.0.dylib and /dev/null differ diff --git a/interface/external/Speex/lib/MacOS/libspeex.1.dylib b/interface/external/Speex/lib/MacOS/libspeex.1.dylib deleted file mode 100644 index da55377cf9..0000000000 Binary files a/interface/external/Speex/lib/MacOS/libspeex.1.dylib and /dev/null differ diff --git a/interface/external/Speex/lib/MacOS/libspeex.dylib b/interface/external/Speex/lib/MacOS/libspeex.dylib deleted file mode 100644 index da55377cf9..0000000000 Binary files a/interface/external/Speex/lib/MacOS/libspeex.dylib and /dev/null differ diff --git a/interface/external/Speex/lib/MacOS/libspeex.la b/interface/external/Speex/lib/MacOS/libspeex.la deleted file mode 100644 index fb3059c453..0000000000 --- a/interface/external/Speex/lib/MacOS/libspeex.la +++ /dev/null @@ -1,35 +0,0 @@ -# libspeex.la - a libtool library file -# Generated by ltmain.sh - GNU libtool 1.5.22 Debian 1.5.22-4 (1.1220.2.365 2005/12/18 22:14:06) -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='libspeex.1.dylib' - -# Names of this library. -library_names='libspeex.1.5.0.dylib libspeex.1.dylib libspeex.dylib' - -# The name of the static archive. -old_library='libspeex.a' - -# Libraries that this one depends upon. -dependency_libs=' -lm' - -# Version information for libspeex. -current=6 -age=5 -revision=0 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/speex/lib' diff --git a/interface/external/Speex/lib/MacOS/libspeexdsp.1.5.0.dylib b/interface/external/Speex/lib/MacOS/libspeexdsp.1.5.0.dylib deleted file mode 100644 index 836569e8fc..0000000000 Binary files a/interface/external/Speex/lib/MacOS/libspeexdsp.1.5.0.dylib and /dev/null differ diff --git a/interface/external/Speex/lib/MacOS/libspeexdsp.1.dylib b/interface/external/Speex/lib/MacOS/libspeexdsp.1.dylib deleted file mode 100644 index 836569e8fc..0000000000 Binary files a/interface/external/Speex/lib/MacOS/libspeexdsp.1.dylib and /dev/null differ diff --git a/interface/external/Speex/lib/MacOS/libspeexdsp.dylib b/interface/external/Speex/lib/MacOS/libspeexdsp.dylib deleted file mode 100644 index 836569e8fc..0000000000 Binary files a/interface/external/Speex/lib/MacOS/libspeexdsp.dylib and /dev/null differ diff --git a/interface/external/Speex/lib/MacOS/libspeexdsp.la b/interface/external/Speex/lib/MacOS/libspeexdsp.la deleted file mode 100644 index e738278adc..0000000000 --- a/interface/external/Speex/lib/MacOS/libspeexdsp.la +++ /dev/null @@ -1,35 +0,0 @@ -# libspeexdsp.la - a libtool library file -# Generated by ltmain.sh - GNU libtool 1.5.22 Debian 1.5.22-4 (1.1220.2.365 2005/12/18 22:14:06) -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='libspeexdsp.1.dylib' - -# Names of this library. -library_names='libspeexdsp.1.5.0.dylib libspeexdsp.1.dylib libspeexdsp.dylib' - -# The name of the static archive. -old_library='libspeexdsp.a' - -# Libraries that this one depends upon. -dependency_libs=' -lm' - -# Version information for libspeexdsp. -current=6 -age=5 -revision=0 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/speex/lib' diff --git a/interface/external/Speex/lib/MacOS/pkgconfig/speex.pc b/interface/external/Speex/lib/MacOS/pkgconfig/speex.pc deleted file mode 100644 index 043d656466..0000000000 --- a/interface/external/Speex/lib/MacOS/pkgconfig/speex.pc +++ /dev/null @@ -1,15 +0,0 @@ -# libspeex pkg-config source file - -prefix=/usr/local/speex -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: speex -Description: Speex is an audio codec tuned for speech -Version: 1.2rc1 -Requires: -Conflicts: -Libs: -L${libdir} -lspeex -Libs.private: -lm -Cflags: -I${includedir} diff --git a/interface/external/Speex/lib/MacOS/pkgconfig/speexdsp.pc b/interface/external/Speex/lib/MacOS/pkgconfig/speexdsp.pc deleted file mode 100644 index f861af7276..0000000000 --- a/interface/external/Speex/lib/MacOS/pkgconfig/speexdsp.pc +++ /dev/null @@ -1,15 +0,0 @@ -# libspeexdsp pkg-config source file - -prefix=/usr/local/speex -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: speexdsp -Description: Speexdsp is a speech processing library that goes along with the Speex codec -Version: 1.2rc1 -Requires: -Conflicts: -Libs: -L${libdir} -lspeexdsp -Libs.private: -lm -Cflags: -I${includedir} diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index af2f87a413..62131c7d3f 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -55,7 +55,7 @@ static const int AGENT_LOOPBACK_MODIFIER = 307; // Speex preprocessor and echo canceller adaption static const int AEC_N_CHANNELS_MIC = 1; // Number of microphone channels static const int AEC_N_CHANNELS_PLAY = 2; // Number of speaker channels -static const int AEC_FILTER_LENGTH = BUFFER_LENGTH_SAMPLES_PER_CHANNEL * 8; // Width of the filter +static const int AEC_FILTER_LENGTH = BUFFER_LENGTH_SAMPLES_PER_CHANNEL * 20; // Width of the filter static const int AEC_BUFFERED_FRAMES = 6; // Maximum number of frames to buffer static const int AEC_BUFFERED_SAMPLES_PER_CHANNEL = BUFFER_LENGTH_SAMPLES_PER_CHANNEL * AEC_BUFFERED_FRAMES; static const int AEC_BUFFERED_SAMPLES = AEC_BUFFERED_SAMPLES_PER_CHANNEL * AEC_N_CHANNELS_PLAY; @@ -63,14 +63,14 @@ static const int AEC_TMP_BUFFER_SIZE = (AEC_N_CHANNELS_MIC + AEC_N_CHANNELS_PLAY) * BUFFER_LENGTH_SAMPLES_PER_CHANNEL; // single frame // Speex preprocessor and echo canceller configuration -static const int AEC_NOISE_REDUCTION = -400; // Noise reduction (important) +static const int AEC_NOISE_REDUCTION = -80; // Noise reduction (important) static const int AEC_RESIDUAL_ECHO_REDUCTION = -60; // Residual echo reduction -static const int AEC_RESIDUAL_ECHO_REDUCTION_ACTIVE = -40; // ~on active side +static const int AEC_RESIDUAL_ECHO_REDUCTION_ACTIVE = -45; // ~on active side static const bool AEC_USE_AGC = true; // Automatic gain control -static const int AEC_AGC_MAX_GAIN = -12; // Gain in db -static const int AEC_AGC_TARGET_LEVEL = 20000; // Target reference level +static const int AEC_AGC_MAX_GAIN = -30; // Gain in db +static const int AEC_AGC_TARGET_LEVEL = 9000; // Target reference level static const int AEC_AGC_MAX_INC = 6; // Max increase in db/s -static const int AEC_AGC_MAX_DEC = 40; // Max decrease in db/s +static const int AEC_AGC_MAX_DEC = 200; // Max decrease in db/s static const bool AEC_USE_VAD = false; // Voice activity determination // Ping test configuration @@ -305,7 +305,7 @@ Audio::Audio(Oscilloscope* scope) : _scope(scope), _averagedLatency(0.0), _measuredJitter(0), - _jitterBufferLengthMsecs(12.0), +// _jitterBufferLengthMsecs(12.0), // _jitterBufferSamples(_jitterBufferLengthMsecs * // NUM_AUDIO_CHANNELS * (SAMPLE_RATE / 1000.0)), _wasStarved(0), @@ -317,7 +317,7 @@ Audio::Audio(Oscilloscope* scope) : _firstPlaybackTime(), _packetsReceivedThisPlayback(0), _isCancellingEcho(false), - _echoDelay(BUFFER_LENGTH_SAMPLES_PER_CHANNEL * 2), + _echoDelay(0), _echoSamplesLeft(0l), _speexEchoState(NULL), _speexPreprocessState(NULL), @@ -544,8 +544,21 @@ void Audio::addProceduralSounds(int16_t* inputBuffer, int numSamples) { // Speex-based echo cancellation // ----------------------------- +bool Audio::isCancellingEcho() const { + return _isCancellingEcho && ! (_pingFramesToRecord != 0 || _pingAnalysisPending || ! _speexPreprocessState); +} + +void Audio::setIsCancellingEcho(bool enable) { + if (enable) { + speex_echo_state_reset(_speexEchoState); + _echoWritePos = 0; + memset(_echoSamplesLeft, 0, AEC_BUFFERED_SAMPLES * sizeof(int16_t)); + } + _isCancellingEcho = enable; +} + inline void Audio::eventuallyCancelEcho(int16_t* inputLeft) { - if (! _isCancellingEcho || _pingFramesToRecord != 0 || ! _speexPreprocessState) { + if (! isCancellingEcho()) { return; } @@ -584,7 +597,7 @@ inline void Audio::eventuallyCancelEcho(int16_t* inputLeft) { } inline void Audio::eventuallyRecordEcho(int16_t* outputLeft, int16_t* outputRight) { - if (! _isCancellingEcho || _pingFramesToRecord != 0 || ! _speexPreprocessState) { + if (! isCancellingEcho()) { return; } @@ -702,7 +715,7 @@ inline void Audio::analyzePing() { } // Determine period - warn if doesn't look like our signal - int halfPeriod = topAt - botAt; + int halfPeriod = abs(topAt - botAt); if (abs(halfPeriod-PING_HALF_PERIOD) > PING_MAX_PERIOD_DIFFERENCE) { printLog("Audio Ping unreliable - peak distance %d vs. %d\n", halfPeriod, PING_HALF_PERIOD); } @@ -745,11 +758,9 @@ inline void Audio::analyzePing() { int delay = (botAt + topAt) / 2 + PING_PERIOD; - printLog("| Audio Ping results:\n" - "+----- ---- --- - - - - -\n" - "\n" - " Delay = %d samples (%d ms)\n" - " Peak amplitude = %d\n\n", delay, delay * 1000 / SAMPLE_RATE, ampli); + printLog("\n| Audio Ping results:\n+----- ---- --- - - - - -\n\n" + "Delay = %d samples (%d ms)\nPeak amplitude = %d\n\n", + delay, (delay * 1000) / int(SAMPLE_RATE), ampli); } bool Audio::eventuallyAnalyzePing() { @@ -757,9 +768,10 @@ bool Audio::eventuallyAnalyzePing() { if (! _pingAnalysisPending) { return false; } - _scope->inputPaused = true; analyzePing(); + setIsCancellingEcho(_isCancellingEcho); + _pingAnalysisPending = false; return true; } diff --git a/interface/src/Audio.h b/interface/src/Audio.h index aab0201b42..ad27b5e711 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -35,8 +35,8 @@ public: void setLastAcceleration(glm::vec3 lastAcceleration) { _lastAcceleration = lastAcceleration; }; void setLastVelocity(glm::vec3 lastVelocity) { _lastVelocity = lastVelocity; }; - void setIsCancellingEcho(bool enabled) { _isCancellingEcho = enabled; } - bool isCancellingEcho() const { return _isCancellingEcho; } + void setIsCancellingEcho(bool enabled); + bool isCancellingEcho() const; void ping(); @@ -54,7 +54,7 @@ private: timeval _lastReceiveTime; float _averagedLatency; float _measuredJitter; - float _jitterBufferLengthMsecs; +// float _jitterBufferLengthMsecs; // currently unused // short _jitterBufferSamples; // currently unsused int _wasStarved; int _numStarves;