From 84523fae01327ccbf58495cdb470be5a9c118447 Mon Sep 17 00:00:00 2001 From: Alexandre Savard <alexandre.savard@savoirfairelinux.com> Date: Wed, 2 Mar 2011 09:09:50 -0500 Subject: [PATCH] [#5249] Fix audio samplerate update algorithm for g722 --- .../audio/audiortp/AudioRtpRecordHandler.cpp | 6 ++++-- sflphone-common/src/audio/codecs/g722.cpp | 21 ++++++++++++++++++- sflphone-common/src/audio/mainbuffer.cpp | 4 ++-- sflphone-common/src/managerimpl.cpp | 13 +++++++++--- sflphone-common/src/managerimpl.h | 6 +++++- 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp index 50597a2a69..c17c066262 100644 --- a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp +++ b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp @@ -158,7 +158,8 @@ void AudioRtpRecordHandler::updateRtpMedia (AudioCodec *audioCodec) _audioRtpRecord.audioCodecMutex.leave(); - Manager::instance().getMainBuffer()->setInternalSamplingRate (_audioRtpRecord._codecSampleRate); + // Manager::instance().getMainBuffer()->setInternalSamplingRate (_audioRtpRecord._codecSampleRate); + Manager::instance().audioSamplingRateChanged(_audioRtpRecord._codecSampleRate); if (lastSamplingRate != _audioRtpRecord._codecSampleRate) updateNoiseSuppress(); @@ -173,7 +174,8 @@ void AudioRtpRecordHandler::initBuffers() int codecSampleRate = _audioRtpRecord._codecSampleRate; // Set sampling rate, main buffer choose the highest one - Manager::instance().getMainBuffer()->setInternalSamplingRate (codecSampleRate); + // Manager::instance().getMainBuffer()->setInternalSamplingRate (codecSampleRate); + Manager::instance().audioSamplingRateChanged(codecSampleRate); // initialize SampleRate converter using AudioLayer's sampling rate // (internal buffers initialized with maximal sampling rate and frame size) diff --git a/sflphone-common/src/audio/codecs/g722.cpp b/sflphone-common/src/audio/codecs/g722.cpp index a80aec4db5..083def84fb 100644 --- a/sflphone-common/src/audio/codecs/g722.cpp +++ b/sflphone-common/src/audio/codecs/g722.cpp @@ -103,10 +103,20 @@ class G722 : public AudioCodec // Enable 8khz mode, encode using lower subband only encode_s->eight_k = FALSE; + // Never set packed TRUE when using 64 kbps encode_s->packed = FALSE; + + memset(encode_s->band, 0, sizeof(decode_s->band) * 2); encode_s->band[0].det = 32; encode_s->band[1].det = 8; + + memset(encode_s->x, 0, sizeof(int) * 24); + + decode_s->in_buffer = 0; + decode_s->in_bits = 0; + decode_s->out_buffer = 0; + decode_s->out_bits = 0; } void g722_decode_init (void) { @@ -121,14 +131,23 @@ class G722 : public AudioCodec // Never set packed TRUE when using 64 kbps decode_s->packed = FALSE; + + memset(decode_s->band, 0, sizeof(decode_s->band) * 2); decode_s->band[0].det = 32; decode_s->band[1].det = 8; decode_s->in_bits = 0; + + memset(decode_s->x, 0, sizeof(int) * 24); + + decode_s->in_buffer = 0; + decode_s->in_bits = 0; + decode_s->out_buffer = 0; + decode_s->out_bits = 0; } int16_t saturate (int32_t amp) { - int16_t amp16; + int16_t amp16 = 0; /* Hopefully this is optimised for the common case - not clipping */ amp16 = (int16_t) amp; diff --git a/sflphone-common/src/audio/mainbuffer.cpp b/sflphone-common/src/audio/mainbuffer.cpp index 1ba12496fa..01a5dd87a8 100644 --- a/sflphone-common/src/audio/mainbuffer.cpp +++ b/sflphone-common/src/audio/mainbuffer.cpp @@ -57,11 +57,11 @@ void MainBuffer::setInternalSamplingRate (int sr) // This call takes the mutex flushAllBuffers(); - ost::MutexLock guard (_mutex); + // ost::MutexLock guard (_mutex); _internalSamplingRate = sr; - Manager::instance().audioSamplingRateChanged(); + // Manager::instance().audioSamplingRateChanged(sr); } } diff --git a/sflphone-common/src/managerimpl.cpp b/sflphone-common/src/managerimpl.cpp index e5ca864f0b..27f75d79ea 100644 --- a/sflphone-common/src/managerimpl.cpp +++ b/sflphone-common/src/managerimpl.cpp @@ -3038,10 +3038,10 @@ void ManagerImpl::switchAudioManager (void) // } } -void ManagerImpl::audioSamplingRateChanged (void) +void ManagerImpl::audioSamplingRateChanged (int samplerate) { - int type, samplerate, framesize, numCardIn, numCardOut, numCardRing; + int type, currentSamplerate, framesize, numCardIn, numCardOut, numCardRing; std::string alsaPlugin; _debug ("Manager: Audio sampling rate changed"); @@ -3049,9 +3049,14 @@ void ManagerImpl::audioSamplingRateChanged (void) if (!_audiodriver) return; + // Only modify internal sampling rate if new sampling rate is higher + currentSamplerate = _mainBuffer.getInternalSamplingRate(); + if(currentSamplerate <= samplerate) + return; + type = _audiodriver->getLayerType(); - samplerate = _mainBuffer.getInternalSamplingRate(); + // samplerate = _mainBuffer.getInternalSamplingRate(); framesize = audioPreference.getFramesize(); _debug ("Manager: new samplerate: %d, new framesize %d", samplerate, framesize); @@ -3101,6 +3106,8 @@ void ManagerImpl::audioSamplingRateChanged (void) _debug ("Manager: Current device: %d ", type); + _mainBuffer.setInternalSamplingRate(samplerate); + if (_audiodriver) { unsigned int sampleRate = _audiodriver->getSampleRate(); diff --git a/sflphone-common/src/managerimpl.h b/sflphone-common/src/managerimpl.h index ad6996f14c..138ed99ccd 100644 --- a/sflphone-common/src/managerimpl.h +++ b/sflphone-common/src/managerimpl.h @@ -851,7 +851,11 @@ class ManagerImpl void switchAudioManager (void); - void audioSamplingRateChanged (void); + /** + * Set the internal audio sampling rate change. Should close the audio layer and + * reopen stream at different rate, + */ + void audioSamplingRateChanged (int); /** * Get the desktop mail notification level -- GitLab