diff --git a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp index 50597a2a69ed5ec4a0484f60663c1c9e59eb520c..c17c0662625af1e9cb5562b30ea67a8af53ce6dd 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 a80aec4db526b4460a79045599b88d5b76aef831..083def84fb3247c1055cef8345de69044c0a0e08 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 1ba12496fa9261c52fc3355f8954b8937bb82726..01a5dd87a8ab9c6a07fbe2189b1ecad7b4e2b378 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 e5ca864f0b70a124994544057d6bcdd24115e1ca..27f75d79eaf4e7dc0c9129c5616a7e427727505d 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 ad6996f14c8b8b4e8c75fbcbc400489740c19767..138ed99ccda0c35a7efa012340191036cdd50ca5 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