diff --git a/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp b/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp index 6a0143087cd453fdb3560c7d3d31e14c85acf67c..2282f6cdac4c7ae57601e861b51c8483c48504ad 100644 --- a/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp +++ b/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp @@ -29,6 +29,7 @@ #include "audio_rtp_record_handler.h" #include <fstream> +#include <algorithm> #include "logger.h" #include "sip/sipcall.h" @@ -52,7 +53,7 @@ AudioRtpRecord::AudioRtpRecord() : , codecFrameSize_(0) , converterSamplingRate_(0) , dtmfQueue_() - , micAmplFactor_(INIT_FADE_IN_FACTOR) + , fadeFactor_(INIT_FADE_IN_FACTOR) , noiseSuppress_(0) , audioProcessMutex_() , callId_("") @@ -138,7 +139,7 @@ int AudioRtpRecordHandler::processDataEncode() int samples = bytesToGet / sizeof(SFLDataFormat); - fadeIn(micData, samples, &audioRtpRecord_.micAmplFactor_); + audioRtpRecord_.fadeInDecodedData(samples); if (Manager::instance().getEchoCancelState()) echoCanceller.getData(micData); @@ -169,10 +170,6 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si if (getCodecPayloadType() != payloadType) return; - int codecSampleRate = getCodecSampleRate(); - - int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate(); - int inSamples = 0; SFLDataFormat *spkrDataDecoded = audioRtpRecord_.decData_.data(); { @@ -181,7 +178,7 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si inSamples = audioRtpRecord_.audioCodec_->decode(spkrDataDecoded, spkrData, size); } - fadeIn(spkrDataDecoded, inSamples, &audioRtpRecord_.micAmplFactor_); + audioRtpRecord_.fadeInDecodedData(inSamples); // Normalize incomming signal gainController.process(spkrDataDecoded, inSamples); @@ -189,6 +186,9 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si SFLDataFormat *out = spkrDataDecoded; int outSamples = inSamples; + int codecSampleRate = getCodecSampleRate(); + int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate(); + // test if resampling is required if (codecSampleRate != mainBufferSampleRate) { out = audioRtpRecord_.resampledData_.data(); @@ -203,15 +203,17 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si Manager::instance().getMainBuffer()->putData(out, outSamples * sizeof(SFLDataFormat), id_); } -void AudioRtpRecordHandler::fadeIn(SFLDataFormat *audio, size_t size, SFLDataFormat *factor) +void AudioRtpRecord::fadeInDecodedData(size_t size) { // if factor reaches 0, this function should have no effect - if (!audio or !factor or *factor <= 0) + if (fadeFactor_ <= 0 or size > decData_.size()) return; - while (size > 0) - audio[--size] /= *factor; + std::transform(decData_.begin(), decData_.begin() + size, decData_.begin(), + std::bind1st(std::divides<double>(), fadeFactor_)); - *factor /= FADEIN_STEP_SIZE; + // Factor used to increase volume in fade in + const SFLDataFormat FADEIN_STEP_SIZE = 4; + fadeFactor_ /= FADEIN_STEP_SIZE; } } diff --git a/daemon/src/audio/audiortp/audio_rtp_record_handler.h b/daemon/src/audio/audiortp/audio_rtp_record_handler.h index f54d3680f56d9c7754c79548109d4ecb0139ac2d..bca8e09887d64cd9b0ceebcd342055e8d091fded 100644 --- a/daemon/src/audio/audiortp/audio_rtp_record_handler.h +++ b/daemon/src/audio/audiortp/audio_rtp_record_handler.h @@ -51,9 +51,6 @@ namespace sfl { // Frequency (in packet number) #define RTP_TIMESTAMP_RESET_FREQ 100 -// Factor use to increase volume in fade in -#define FADEIN_STEP_SIZE 4; - static const int schedulingTimeout = 4000; static const int expireTimeout = 1000000; @@ -92,12 +89,18 @@ class AudioRtpRecord { int codecFrameSize_; int converterSamplingRate_; std::list<int> dtmfQueue_; - SFLDataFormat micAmplFactor_; + SFLDataFormat fadeFactor_; NoiseSuppress *noiseSuppress_; ost::Mutex audioProcessMutex_; std::string callId_; unsigned int dtmfPayloadType_; + private: + friend class AudioRtpRecordHandler; + /** + * Ramp In audio data to avoid audio click from peer + */ + void fadeInDecodedData(size_t size); NON_COPYABLE(AudioRtpRecord); }; @@ -154,11 +157,6 @@ class AudioRtpRecordHandler { */ void processDataDecode(unsigned char * spkrData, size_t size, int payloadType); - /** - * Ramp In audio data to avoid audio click from peer - */ - void fadeIn(SFLDataFormat *audio, size_t size, SFLDataFormat *factor); - void setDtmfPayloadType(unsigned int payloadType) { audioRtpRecord_.dtmfPayloadType_ = payloadType; }