diff --git a/sflphone-common/src/audio/algorithm.h b/sflphone-common/src/audio/algorithm.h index 0f9ff389537f46006ab07a08ff4aca603b98f9e9..6da74c1c70d3950e2db0d006cfef591ab4bc80b2 100644 --- a/sflphone-common/src/audio/algorithm.h +++ b/sflphone-common/src/audio/algorithm.h @@ -38,6 +38,11 @@ class Algorithm { */ virtual void putData(SFLDataFormat *inputData, int nbBytes) = 0; + /** + * + */ + virtual int getData(SFLDataFormat *outputData) = 0; + /** * Class implementing this interface must define this function * for audio processing that require synchronization between spkrdata and diff --git a/sflphone-common/src/audio/audioprocessing.cpp b/sflphone-common/src/audio/audioprocessing.cpp index 3bf14f6a12291ee00d46014a96e624efe1ec2ac6..36f17f6fcd60dfe4870a44326fd63f9aafedf935 100644 --- a/sflphone-common/src/audio/audioprocessing.cpp +++ b/sflphone-common/src/audio/audioprocessing.cpp @@ -33,6 +33,14 @@ void AudioProcessing::resetAlgorithm(void) _algorithm->reset(); } +int AudioProcessing::getData(SFLDataFormat *outputData) +{ + if(_algorithm) + return _algorithm->getData(outputData); + else + return 0; +} + void AudioProcessing::putData(SFLDataFormat *inputData, int nbBytes) { if(_algorithm) diff --git a/sflphone-common/src/audio/audioprocessing.h b/sflphone-common/src/audio/audioprocessing.h index 264f7177fbc18b0efe52d68423f26b48bfdbbb7c..1ef0464f69b132b2d8c9e4e73ddaae2ac6310fec 100644 --- a/sflphone-common/src/audio/audioprocessing.h +++ b/sflphone-common/src/audio/audioprocessing.h @@ -54,6 +54,11 @@ public: */ void putData(SFLDataFormat *inputData, int nbBytes); + /** + * Get data from internal buffer + */ + int getData(SFLDataFormat *outputData); + /** * Process some audio data */ diff --git a/sflphone-common/src/audio/dcblocker.cpp b/sflphone-common/src/audio/dcblocker.cpp index ff21780d258d68a2ee8d2184fefee3254d40c8db..4ab4e822c02bba68d410ad459c04558104a14d7c 100644 --- a/sflphone-common/src/audio/dcblocker.cpp +++ b/sflphone-common/src/audio/dcblocker.cpp @@ -58,6 +58,8 @@ void DcBlocker::reset() void DcBlocker::putData(SFLDataFormat *inputData, int nbBytes) {} +int DcBlocker::getData(SFLDataFormat *outputData) { return 0; } + void DcBlocker::process (SFLDataFormat *data, int nbBytes) { // y(n) = x(n) - x(n-1) + R y(n-1) , R = 0.9999 diff --git a/sflphone-common/src/audio/dcblocker.h b/sflphone-common/src/audio/dcblocker.h index 29b024ef98a66a94dfc4098336bfb8fe872af260..3dd7f35e301fd2f22f17ca7f800884a6c5cf7576 100644 --- a/sflphone-common/src/audio/dcblocker.h +++ b/sflphone-common/src/audio/dcblocker.h @@ -86,6 +86,11 @@ public: */ virtual void putData(SFLDataFormat *inputData, int nbBytes); + /** + * Unused + */ + virtual int getData(SFLDataFormat *outputData); + /** * Perform dc blocking given the input data */ diff --git a/sflphone-common/src/audio/echocancel.cpp b/sflphone-common/src/audio/echocancel.cpp index 59d962b141762f736cee282a489e5047e465038a..95cb40b22656e678358703242276425d52c91628 100644 --- a/sflphone-common/src/audio/echocancel.cpp +++ b/sflphone-common/src/audio/echocancel.cpp @@ -42,7 +42,8 @@ EchoCancel::EchoCancel(int smplRate, int frameLength) : _samplingRate(smplRate), _micAdaptCnt(0), _spkrAdaptSize(SPKR_ADAPT_SIZE), _micAdaptSize(MIC_ADAPT_SIZE), - _correlationSize(0) + _correlationSize(0), + _processedByte(0) { _debug("EchoCancel: Instantiate echo canceller"); @@ -57,9 +58,11 @@ EchoCancel::EchoCancel(int smplRate, int frameLength) : _samplingRate(smplRate), _micData = new RingBuffer(50000); _spkrData = new RingBuffer(50000); + _spkrDataOut = new RingBuffer(50000); _micData->createReadPointer(); _spkrData->createReadPointer(); + _spkrDataOut->createReadPointer(); // variable used to sync mic and spkr _spkrStoped = true; @@ -158,6 +161,7 @@ void EchoCancel::reset() _micData->flushAll(); _spkrData->flushAll(); + _spkrDataOut->flushAll(); // SFLDataFormat delay[960]; // memset(delay, 0, sizeof(SFLDataFormat)); @@ -180,7 +184,6 @@ void EchoCancel::reset() f=.0; speex_preprocess_ctl(_noiseState, SPEEX_PREPROCESS_SET_DEREVERB_LEVEL, &f); - _spkrStoped = true; } @@ -199,9 +202,24 @@ void EchoCancel::putData(SFLDataFormat *inputData, int nbBytes) // Put data in speaker ring buffer _spkrData->Put(inputData, nbBytes); + _spkrDataOut->Put(inputData, nbBytes); } +int EchoCancel::getData(SFLDataFormat *outputData) +{ + // int availForGet = _spkrData->AvailForGet(); + + int copied = 0; + + if(_processedByte > 0) { + copied = _spkrDataOut->Get(outputData, _processedByte); + _processedByte = 0; + } + + return copied; +} + void EchoCancel::process(SFLDataFormat *data, int nbBytes) {} int EchoCancel::process(SFLDataFormat *inputData, SFLDataFormat *outputData, int nbBytes) @@ -226,7 +244,7 @@ int EchoCancel::process(SFLDataFormat *inputData, SFLDataFormat *outputData, int int spkrAvail = _spkrData->AvailForGet(); int micAvail = _micData->AvailForGet(); - _debug("EchoCancel: speaker avail %d, mic avail %d", spkrAvail, micAvail); + _debug("EchoCancel: speaker avail %d, mic avail %d, processed: %d", spkrAvail/320, micAvail/320, _processedByte); // Init number of frame processed int nbFrame = 0; @@ -246,6 +264,9 @@ int EchoCancel::process(SFLDataFormat *inputData, SFLDataFormat *outputData, int bcopy(_tmpOut, outputData+(nbFrame*_smplPerFrame), byteSize); + // used to sync with speaker + _processedByte += byteSize; + // echoFile->write ((const char *)_tmpOut, byteSize); spkrAvail = _spkrData->AvailForGet(); diff --git a/sflphone-common/src/audio/echocancel.h b/sflphone-common/src/audio/echocancel.h index ab0c2bdd04d995379677a3c2f410b163157ef646..e122b0cd9122bcf73c0fd118230805852391b9a1 100644 --- a/sflphone-common/src/audio/echocancel.h +++ b/sflphone-common/src/audio/echocancel.h @@ -72,6 +72,11 @@ class EchoCancel : public Algorithm { */ virtual void putData(SFLDataFormat *inputData, int nbBytes); + /** + * Get data ready to be played by speakers + */ + virtual int getData(SFLDataFormat *outputData); + /** * Unused */ @@ -152,6 +157,8 @@ class EchoCancel : public Algorithm { */ RingBuffer *_spkrData; + RingBuffer *_spkrDataOut; + /** * Boolean value */ @@ -274,6 +281,8 @@ class EchoCancel : public Algorithm { int _correlationArray[BUFF_SIZE]; + int _processedByte; + /* ofstream *micFile; ofstream *spkrFile; @@ -287,7 +296,7 @@ class EchoCancel : public Algorithm { * Noise reduction processing state */ SpeexPreprocessState *_noiseState; - + }; #endif