diff --git a/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp b/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp index 071a978ce5363bd1fbc4851a6c90bfded60ee170..6a0143087cd453fdb3560c7d3d31e14c85acf67c 100644 --- a/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp +++ b/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp @@ -37,28 +37,27 @@ namespace sfl { -static const SFLDataFormat initFadeinFactor = 32000; +static const SFLDataFormat INIT_FADE_IN_FACTOR = 32000; AudioRtpRecord::AudioRtpRecord() : audioCodec_(0) , audioCodecMutex_() , codecPayloadType_(0) , hasDynamicPayloadType_(false) + , decData_() // std::tr1::arrays will be 0-initialized + , resampledData_() + , encodedData_() , converter_(0) , codecSampleRate_(0) , codecFrameSize_(0) , converterSamplingRate_(0) , dtmfQueue_() - , micAmplFactor_(initFadeinFactor) + , micAmplFactor_(INIT_FADE_IN_FACTOR) , noiseSuppress_(0) , audioProcessMutex_() , callId_("") , dtmfPayloadType_(101) // same as Asterisk -{ - memset(decData_, 0x0, sizeof decData_); - memset(resampledData_, 0x0, sizeof resampledData_); - memset(encodedData_, 0x0, sizeof encodedData_); -} +{} AudioRtpRecord::~AudioRtpRecord() { @@ -116,14 +115,10 @@ void AudioRtpRecordHandler::putDtmfEvent(int digit) int AudioRtpRecordHandler::processDataEncode() { - SFLDataFormat *micData = audioRtpRecord_.decData_; - unsigned char *micDataEncoded = audioRtpRecord_.encodedData_; - SFLDataFormat *micDataConverted = audioRtpRecord_.resampledData_; - int codecSampleRate = getCodecSampleRate(); int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate(); - double resampleFactor = (double)mainBufferSampleRate / codecSampleRate; + double resampleFactor = (double) mainBufferSampleRate / codecSampleRate; // compute nb of byte to get coresponding to 1 audio frame int samplesToGet = resampleFactor * getCodecFrameSize(); @@ -132,10 +127,12 @@ int AudioRtpRecordHandler::processDataEncode() if (Manager::instance().getMainBuffer()->availForGet(id_) < bytesToGet) return 0; + SFLDataFormat *micData = audioRtpRecord_.decData_.data(); int bytes = Manager::instance().getMainBuffer()->getData(micData, bytesToGet, id_); if (bytes != bytesToGet) { - ERROR("%s : asked %d bytes from mainbuffer, got %d", __PRETTY_FUNCTION__, bytesToGet, bytes); + ERROR("%s : asked %d bytes from mainbuffer, got %d", + __PRETTY_FUNCTION__, bytesToGet, bytes); return 0; } @@ -147,6 +144,7 @@ int AudioRtpRecordHandler::processDataEncode() echoCanceller.getData(micData); SFLDataFormat *out = micData; + SFLDataFormat *micDataConverted = audioRtpRecord_.resampledData_.data(); if (codecSampleRate != mainBufferSampleRate) { out = micDataConverted; @@ -161,6 +159,7 @@ int AudioRtpRecordHandler::processDataEncode() { ost::MutexLock lock(audioRtpRecord_.audioCodecMutex_); + unsigned char *micDataEncoded = audioRtpRecord_.encodedData_.data(); return audioRtpRecord_.audioCodec_->encode(micDataEncoded, out, getCodecFrameSize()); } } @@ -172,16 +171,14 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si int codecSampleRate = getCodecSampleRate(); - SFLDataFormat *spkrDataDecoded = audioRtpRecord_.decData_; - SFLDataFormat *spkrDataConverted = audioRtpRecord_.resampledData_; - int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate(); - int inSamples; + int inSamples = 0; + SFLDataFormat *spkrDataDecoded = audioRtpRecord_.decData_.data(); { ost::MutexLock lock(audioRtpRecord_.audioCodecMutex_); // Return the size of data in samples - inSamples = audioRtpRecord_.audioCodec_->decode(spkrDataDecoded , spkrData , size); + inSamples = audioRtpRecord_.audioCodec_->decode(spkrDataDecoded, spkrData, size); } fadeIn(spkrDataDecoded, inSamples, &audioRtpRecord_.micAmplFactor_); @@ -194,10 +191,10 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si // test if resampling is required if (codecSampleRate != mainBufferSampleRate) { + out = audioRtpRecord_.resampledData_.data(); // Do sample rate conversion outSamples = ((float) inSamples * ((float) mainBufferSampleRate / (float) codecSampleRate)); - audioRtpRecord_.converter_->resample(spkrDataDecoded, spkrDataConverted, codecSampleRate, mainBufferSampleRate, inSamples); - out = spkrDataConverted; + audioRtpRecord_.converter_->resample(spkrDataDecoded, out, codecSampleRate, mainBufferSampleRate, inSamples); } if (Manager::instance().getEchoCancelState()) diff --git a/daemon/src/audio/audiortp/audio_rtp_record_handler.h b/daemon/src/audio/audiortp/audio_rtp_record_handler.h index b1bdad528f6dee98cffff0f0e16e3e554bfd5cbf..f54d3680f56d9c7754c79548109d4ecb0139ac2d 100644 --- a/daemon/src/audio/audiortp/audio_rtp_record_handler.h +++ b/daemon/src/audio/audiortp/audio_rtp_record_handler.h @@ -34,6 +34,7 @@ using std::ptrdiff_t; #include <ccrtp/rtp.h> +#include <tr1/array> #include <list> class SIPCall; @@ -72,7 +73,7 @@ timeval2microtimeout(const timeval& t) /** * Class meant to store internal data in order to encode/decode, * resample, process, and packetize audio streams. This class should not be - * handled directly. Use AudioRtpRecorrdHandeler + * handled directly. Use AudioRtpRecordHandler */ class AudioRtpRecord { public: @@ -83,9 +84,9 @@ class AudioRtpRecord { ost::Mutex audioCodecMutex_; int codecPayloadType_; bool hasDynamicPayloadType_; - SFLDataFormat decData_[DEC_BUFFER_SIZE]; - SFLDataFormat resampledData_[DEC_BUFFER_SIZE]; - unsigned char encodedData_[DEC_BUFFER_SIZE]; + std::tr1::array<SFLDataFormat, DEC_BUFFER_SIZE> decData_; + std::tr1::array<SFLDataFormat, DEC_BUFFER_SIZE> resampledData_; + std::tr1::array<unsigned char, DEC_BUFFER_SIZE> encodedData_; SamplerateConverter *converter_; int codecSampleRate_; int codecFrameSize_; @@ -136,7 +137,7 @@ class AudioRtpRecordHandler { } const unsigned char *getMicDataEncoded() const { - return audioRtpRecord_.encodedData_; + return audioRtpRecord_.encodedData_.data(); } void initBuffers();