diff --git a/sflphone-common/src/audio/mainbuffer.cpp b/sflphone-common/src/audio/mainbuffer.cpp index 0e3449341016557f6fb9af9e2ff0fa7d7dd0f885..4c15008b0d5d0ee2264bebc2b77052b25b87354d 100644 --- a/sflphone-common/src/audio/mainbuffer.cpp +++ b/sflphone-common/src/audio/mainbuffer.cpp @@ -405,7 +405,9 @@ int MainBuffer::getData (void *buffer, int toCopy, unsigned short volume, CallID while (iter_id != callid_set->end()) { - size = getDataByID (mixBuffer, toCopy, volume, (CallID) (*iter_id), call_id); + memset(mixBuffer, 0, toCopy); + + size = getDataByID(mixBuffer, toCopy, volume, (CallID) (*iter_id), call_id); if (size > 0) { for (int k = 0; k < nbSmplToCopy; k++) { @@ -462,6 +464,8 @@ int MainBuffer::availForGet (CallID call_id) int nb_bytes; CallIDSet::iterator iter_id = callid_set->begin(); + syncBuffers(call_id); + for (iter_id = callid_set->begin(); iter_id != callid_set->end(); iter_id++) { nb_bytes = availForGetByID (*iter_id, call_id); @@ -522,7 +526,6 @@ int MainBuffer::discard (int toDiscard, CallID call_id) return toDiscard; } - } @@ -599,6 +602,45 @@ void MainBuffer::flushAllBuffers() } } +void MainBuffer:: syncBuffers(CallID call_id) +{ + + CallIDSet* callid_set = getCallIDSet(call_id); + + if (callid_set == NULL) + return; + + if (callid_set->empty()) { + _debug ("MainBuffer: CallIDSet with ID: \"%s\" is empty!", call_id.c_str()); + return; + } + + if (callid_set->size() == 1) { + // no need to resync, only one session + return; + } + + int nbBuffers = 0; + float mean_nbBytes = 0.0; + + CallIDSet::iterator iter_id = callid_set->begin(); + + + // compute mean nb byte in buffers + for (iter_id = callid_set->begin(); iter_id != callid_set->end(); iter_id++) { + nbBuffers++; + mean_nbBytes += availForGetByID (*iter_id, call_id); + } + mean_nbBytes = mean_nbBytes / (float) nbBuffers; + + // resync buffers in this conference according to the computed mean + for (iter_id = callid_set->begin(); iter_id != callid_set->end(); iter_id++) { + + if(availForGetByID (*iter_id, call_id) > (mean_nbBytes + 640)) + discardByID (640, *iter_id, call_id); + } +} + void MainBuffer::stateInfo() { @@ -665,7 +707,4 @@ void MainBuffer::stateInfo() iter_buffer++; } - - - } diff --git a/sflphone-common/src/audio/mainbuffer.h b/sflphone-common/src/audio/mainbuffer.h index 95dd787ea4c8aab914fcdb0307afd4f7e2b89de4..9b97a88fc000c9ad9c4628581d285da43222d84d 100644 --- a/sflphone-common/src/audio/mainbuffer.h +++ b/sflphone-common/src/audio/mainbuffer.h @@ -114,6 +114,8 @@ class MainBuffer { void flushAllBuffers(); void flushDefault(); + + void syncBuffers(CallID call_id); void stateInfo(); diff --git a/sflphone-common/src/audio/pulseaudio/pulselayer.cpp b/sflphone-common/src/audio/pulseaudio/pulselayer.cpp index 56c2ab8c7b3e00defc0374325343bea67e3271b2..e8294513e28dbe42875a979c3a672956b7717e5e 100644 --- a/sflphone-common/src/audio/pulseaudio/pulselayer.cpp +++ b/sflphone-common/src/audio/pulseaudio/pulselayer.cpp @@ -260,6 +260,8 @@ PulseLayer::PulseLayer (ManagerImpl* manager) AudioLayer::_echocancelstate = true; AudioLayer::_noisesuppressstate = true; + byteCounter = 0; + /* captureFile = new ofstream("captureFile", ofstream::binary); captureRsmplFile = new ofstream("captureRsmplFile", ofstream::binary); @@ -902,8 +904,9 @@ void PulseLayer::writeToSpeaker (void) } + // Copy far-end signal in echo canceller to adapt filter coefficient - AudioLayer::_echoCanceller->putData(out, byteToGet); + // AudioLayer::_echoCanceller->putData(out, byteToGet); pa_xfree (out); @@ -971,11 +974,12 @@ void PulseLayer::readFromMic (void) // captureFilterFile->write ((const char *)rsmpl_out, nbSample*sizeof(SFLDataFormat)); // echo cancellation processing - int sampleready = _echoCanceller->processAudio(rsmpl_out, echoCancelledMic, nbSample*sizeof(SFLDataFormat)); + // int sampleready = _echoCanceller->processAudio(rsmpl_out, echoCancelledMic, nbSample*sizeof(SFLDataFormat)); // getMainBuffer()->putData ( (void*) rsmpl_out, nbSample*sizeof (SFLDataFormat), 100); - if(sampleready) - getMainBuffer()->putData ( echoCancelledMic, sampleready*sizeof (SFLDataFormat), 100); + // if(sampleready) + // getMainBuffer()->putData ( echoCancelledMic, sampleready*sizeof (SFLDataFormat), 100); + getMainBuffer()->putData ( rsmpl_out, nbSample*sizeof (SFLDataFormat), 100); pa_xfree (rsmpl_out); @@ -987,10 +991,11 @@ void PulseLayer::readFromMic (void) _audiofilter->processAudio((SFLDataFormat *)data, filter_out, r); // echo cancellation processing - int sampleready = _echoCanceller->processAudio((SFLDataFormat *)filter_out, echoCancelledMic, r); + // int sampleready = _echoCanceller->processAudio((SFLDataFormat *)filter_out, echoCancelledMic, r); // no resampling required - getMainBuffer()->putData (echoCancelledMic, sampleready*sizeof (SFLDataFormat), 100); + // getMainBuffer()->putData (echoCancelledMic, sampleready*sizeof (SFLDataFormat), 100); + getMainBuffer()->putData (filter_out, r, 100); pa_xfree(filter_out); } diff --git a/sflphone-common/src/audio/pulseaudio/pulselayer.h b/sflphone-common/src/audio/pulseaudio/pulselayer.h index d13c1e69385a45e1f5c31afabfcd8e2b1a7d2e1b..047fe84093f133c5ee4a29ae9b676d993944d774 100644 --- a/sflphone-common/src/audio/pulseaudio/pulselayer.h +++ b/sflphone-common/src/audio/pulseaudio/pulselayer.h @@ -287,6 +287,8 @@ class PulseLayer : public AudioLayer { // private: + int byteCounter; + public: friend class AudioLayerTest;