Skip to content
Snippets Groups Projects
Commit 85a76811 authored by Tristan Matthews's avatar Tristan Matthews
Browse files

* #9979: AudioRtpRecord: let AudioRtpRecord handle fadeIn internally

parent 859e5e3a
No related branches found
No related tags found
No related merge requests found
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include "audio_rtp_record_handler.h" #include "audio_rtp_record_handler.h"
#include <fstream> #include <fstream>
#include <algorithm>
#include "logger.h" #include "logger.h"
#include "sip/sipcall.h" #include "sip/sipcall.h"
...@@ -52,7 +53,7 @@ AudioRtpRecord::AudioRtpRecord() : ...@@ -52,7 +53,7 @@ AudioRtpRecord::AudioRtpRecord() :
, codecFrameSize_(0) , codecFrameSize_(0)
, converterSamplingRate_(0) , converterSamplingRate_(0)
, dtmfQueue_() , dtmfQueue_()
, micAmplFactor_(INIT_FADE_IN_FACTOR) , fadeFactor_(INIT_FADE_IN_FACTOR)
, noiseSuppress_(0) , noiseSuppress_(0)
, audioProcessMutex_() , audioProcessMutex_()
, callId_("") , callId_("")
...@@ -138,7 +139,7 @@ int AudioRtpRecordHandler::processDataEncode() ...@@ -138,7 +139,7 @@ int AudioRtpRecordHandler::processDataEncode()
int samples = bytesToGet / sizeof(SFLDataFormat); int samples = bytesToGet / sizeof(SFLDataFormat);
fadeIn(micData, samples, &audioRtpRecord_.micAmplFactor_); audioRtpRecord_.fadeInDecodedData(samples);
if (Manager::instance().getEchoCancelState()) if (Manager::instance().getEchoCancelState())
echoCanceller.getData(micData); echoCanceller.getData(micData);
...@@ -169,10 +170,6 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si ...@@ -169,10 +170,6 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si
if (getCodecPayloadType() != payloadType) if (getCodecPayloadType() != payloadType)
return; return;
int codecSampleRate = getCodecSampleRate();
int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate();
int inSamples = 0; int inSamples = 0;
SFLDataFormat *spkrDataDecoded = audioRtpRecord_.decData_.data(); SFLDataFormat *spkrDataDecoded = audioRtpRecord_.decData_.data();
{ {
...@@ -181,7 +178,7 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si ...@@ -181,7 +178,7 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si
inSamples = audioRtpRecord_.audioCodec_->decode(spkrDataDecoded, spkrData, size); inSamples = audioRtpRecord_.audioCodec_->decode(spkrDataDecoded, spkrData, size);
} }
fadeIn(spkrDataDecoded, inSamples, &audioRtpRecord_.micAmplFactor_); audioRtpRecord_.fadeInDecodedData(inSamples);
// Normalize incomming signal // Normalize incomming signal
gainController.process(spkrDataDecoded, inSamples); gainController.process(spkrDataDecoded, inSamples);
...@@ -189,6 +186,9 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si ...@@ -189,6 +186,9 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si
SFLDataFormat *out = spkrDataDecoded; SFLDataFormat *out = spkrDataDecoded;
int outSamples = inSamples; int outSamples = inSamples;
int codecSampleRate = getCodecSampleRate();
int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate();
// test if resampling is required // test if resampling is required
if (codecSampleRate != mainBufferSampleRate) { if (codecSampleRate != mainBufferSampleRate) {
out = audioRtpRecord_.resampledData_.data(); out = audioRtpRecord_.resampledData_.data();
...@@ -203,15 +203,17 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si ...@@ -203,15 +203,17 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si
Manager::instance().getMainBuffer()->putData(out, outSamples * sizeof(SFLDataFormat), id_); 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 factor reaches 0, this function should have no effect
if (!audio or !factor or *factor <= 0) if (fadeFactor_ <= 0 or size > decData_.size())
return; return;
while (size > 0) std::transform(decData_.begin(), decData_.begin() + size, decData_.begin(),
audio[--size] /= *factor; 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;
} }
} }
...@@ -51,9 +51,6 @@ namespace sfl { ...@@ -51,9 +51,6 @@ namespace sfl {
// Frequency (in packet number) // Frequency (in packet number)
#define RTP_TIMESTAMP_RESET_FREQ 100 #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 schedulingTimeout = 4000;
static const int expireTimeout = 1000000; static const int expireTimeout = 1000000;
...@@ -92,12 +89,18 @@ class AudioRtpRecord { ...@@ -92,12 +89,18 @@ class AudioRtpRecord {
int codecFrameSize_; int codecFrameSize_;
int converterSamplingRate_; int converterSamplingRate_;
std::list<int> dtmfQueue_; std::list<int> dtmfQueue_;
SFLDataFormat micAmplFactor_; SFLDataFormat fadeFactor_;
NoiseSuppress *noiseSuppress_; NoiseSuppress *noiseSuppress_;
ost::Mutex audioProcessMutex_; ost::Mutex audioProcessMutex_;
std::string callId_; std::string callId_;
unsigned int dtmfPayloadType_; unsigned int dtmfPayloadType_;
private: private:
friend class AudioRtpRecordHandler;
/**
* Ramp In audio data to avoid audio click from peer
*/
void fadeInDecodedData(size_t size);
NON_COPYABLE(AudioRtpRecord); NON_COPYABLE(AudioRtpRecord);
}; };
...@@ -154,11 +157,6 @@ class AudioRtpRecordHandler { ...@@ -154,11 +157,6 @@ class AudioRtpRecordHandler {
*/ */
void processDataDecode(unsigned char * spkrData, size_t size, int payloadType); 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) { void setDtmfPayloadType(unsigned int payloadType) {
audioRtpRecord_.dtmfPayloadType_ = payloadType; audioRtpRecord_.dtmfPayloadType_ = payloadType;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment