Skip to content
Snippets Groups Projects
Commit 6df9dd8b authored by Alexandre Savard's avatar Alexandre Savard
Browse files

[#4524] DO NOT start RTP session twice

parent 63256bf4
No related branches found
No related tags found
No related merge requests found
......@@ -37,7 +37,7 @@ namespace sfl
static const SFLDataFormat initFadeinFactor = 32000;
AudioRtpRecord::AudioRtpRecord (ManagerImpl *manager) : _audioCodec (NULL)
AudioRtpRecord::AudioRtpRecord () : _audioCodec (NULL)
, _hasDynamicPayloadType (false)
, _micData (NULL)
, _micDataConverted (NULL)
......@@ -114,228 +114,21 @@ AudioRtpRecord::~AudioRtpRecord()
}
}
AudioCodec *AudioRtpRecord::getAudioCodec() const
{
return _audioCodec;
}
int AudioRtpRecord::getCodecPayloadType() const
{
return _codecPayloadType;
}
bool AudioRtpRecord::getHasDynamicPayload() const
{
return _hasDynamicPayloadType;
}
int AudioRtpRecord::getAudioLayerFrameSize() const
{
return _audioLayerFrameSize;
}
int AudioRtpRecord::getAudioLayerSampleRate() const
{
return _audioLayerSampleRate;
}
int AudioRtpRecord::getCodecFrameSize() const
{
return _codecFrameSize;
}
int AudioRtpRecord::getCodecSampleRate() const
{
return _codecSampleRate;
}
SamplerateConverter *AudioRtpRecord::getConverter() const
{
return _converter;
}
EventQueue *AudioRtpRecord::getEventQueue()
{
return &_eventQueue;
}
int AudioRtpRecord::getEventQueueSize() const
{
return _eventQueue.size();
}
SFLDataFormat *AudioRtpRecord::getMicData()
{
return _micData;
}
SFLDataFormat *AudioRtpRecord::getMicDataConverted()
{
return _micDataConverted;
}
unsigned char *AudioRtpRecord::getMicDataEncoded()
{
return _micDataEncoded;
}
SFLDataFormat *AudioRtpRecord::getMicAmplFactor()
{
return &_micAmplFactor;
}
bool AudioRtpRecord::getMicFadeInComplete() const
{
return _micFadeInComplete;
}
SFLDataFormat *AudioRtpRecord::getSpkrAmplFactor()
{
return &_spkrAmplFactor;
}
SFLDataFormat *AudioRtpRecord::getSpkrDataConverted() const
{
return _spkrDataConverted;
}
SFLDataFormat *AudioRtpRecord::getSpkrDataDecoded() const
{
return _spkrDataDecoded;
}
bool AudioRtpRecord::getSpkrFadeInComplete() const
{
return _spkrFadeInComplete;
}
AudioProcessing *AudioRtpRecord::getNoiseReductionProcess() const
{
return _audioProcess;
}
void AudioRtpRecord::setAudioCodec (AudioCodec *audiocodec)
{
this->_audioCodec = audiocodec;
}
void AudioRtpRecord::setCodecPayloadType (int codecPayloadType)
{
this->_codecPayloadType = codecPayloadType;
}
void AudioRtpRecord::setHasDynamicPayload (bool hasDynamicPayload)
{
_hasDynamicPayloadType = hasDynamicPayload;
}
AudioRtpRecordHandler::AudioRtpRecordHandler (ManagerImpl *manager, SIPCall *ca) : _audioRtpRecord (), _ca (ca) {}
void AudioRtpRecord::setAudioLayerFrameSize (int _audioLayerFrameSize)
{
this->_audioLayerFrameSize = _audioLayerFrameSize;
}
void AudioRtpRecord::setAudioLayerSampleRate (int _audioLayerSampleRate)
{
this->_audioLayerSampleRate = _audioLayerSampleRate;
}
void AudioRtpRecord::setCodecFrameSize (int _codecFrameSize)
{
this->_codecFrameSize = _codecFrameSize;
}
void AudioRtpRecord::setCodecSampleRate (int _codecSampleRate)
{
this->_codecSampleRate = _codecSampleRate;
}
void AudioRtpRecord::setConverter (SamplerateConverter *_converter)
{
this->_converter = _converter;
}
void AudioRtpRecord::setEventQueue (EventQueue _eventQueue)
{
this->_eventQueue = _eventQueue;
}
void AudioRtpRecord::setMicData (SFLDataFormat * micData)
{
this->_micData = micData;
}
void AudioRtpRecord::setMicDataConverted (SFLDataFormat *micDataConverted)
{
this->_micDataConverted = micDataConverted;
}
void AudioRtpRecord::setMicDataEncoded (unsigned char *micDataEncoded)
{
this->_micDataEncoded = micDataEncoded;
}
void AudioRtpRecord::setMicAmplFactor (SFLDataFormat _micAmplFactor)
{
this->_micAmplFactor = _micAmplFactor;
}
void AudioRtpRecord::setMicFadeInComplete (bool _micFadeInComplete)
{
this->_micFadeInComplete = _micFadeInComplete;
}
void AudioRtpRecord::setSpkrAmplFactor (SFLDataFormat _spkrAmplFactor)
{
this->_spkrAmplFactor = _spkrAmplFactor;
}
void AudioRtpRecord::setSpkrDataConverted (SFLDataFormat *_spkrDataConverted)
{
this->_spkrDataConverted = _spkrDataConverted;
}
void AudioRtpRecord::setSpkrDataDecoded (SFLDataFormat *_spkrDataDecoded)
{
this->_spkrDataDecoded = _spkrDataDecoded;
}
void AudioRtpRecord::setSpkrFadeInComplete (bool _spkrFadeInComplete)
{
this->_spkrFadeInComplete = _spkrFadeInComplete;
}
void AudioRtpRecord::setAudioProcessing (AudioProcessing *audioProcess)
{
this->_audioProcess = audioProcess;
}
void AudioRtpRecord::setNoiseSuppress (NoiseSuppress *noiseSuppress)
{
this->_noiseSuppress = noiseSuppress;
}
AudioRtpRecordHandler::AudioRtpRecordHandler (ManagerImpl *manager, SIPCall *ca) : _audioRtpRecord (manager), _ca (ca)
{
// TODO Auto-generated constructor stub
}
AudioRtpRecordHandler::~AudioRtpRecordHandler()
{
// TODO Auto-generated destructor stub
}
AudioRtpRecordHandler::~AudioRtpRecordHandler() {}
void AudioRtpRecordHandler::setRtpMedia (AudioCodec* audioCodec)
{
// Set varios codec info to reduce indirection
_audioRtpRecord.setAudioCodec (audioCodec);
_audioRtpRecord.setCodecPayloadType (audioCodec->getPayload());
_audioRtpRecord.setCodecSampleRate (audioCodec->getClockRate());
_audioRtpRecord.setCodecFrameSize (audioCodec->getFrameSize());
_audioRtpRecord.setHasDynamicPayload (audioCodec->hasDynamicPayload());
_audioRtpRecord._audioCodec = audioCodec;
_audioRtpRecord._codecPayloadType = audioCodec->getPayload();
_audioRtpRecord._codecSampleRate = audioCodec->getClockRate();
_audioRtpRecord._codecFrameSize = audioCodec->getFrameSize();
_audioRtpRecord._hasDynamicPayloadType = audioCodec->hasDynamicPayload();
}
......@@ -351,24 +144,23 @@ void AudioRtpRecordHandler::init()
void AudioRtpRecordHandler::initBuffers()
{
int codecSampleRate = _audioRtpRecord._codecSampleRate;
// Set sampling rate, main buffer choose the highest one
Manager::instance().getAudioDriver()->getMainBuffer()->setInternalSamplingRate (getCodecSampleRate());
Manager::instance().getAudioDriver()->getMainBuffer()->setInternalSamplingRate (codecSampleRate);
// initialize SampleRate converter using AudioLayer's sampling rate
// (internal buffers initialized with maximal sampling rate and frame size)
_audioRtpRecord.setConverter (new SamplerateConverter (getAudioLayerSampleRate(), getAudioLayerFrameSize()));
int nbSamplesMax = (int) ( (getCodecSampleRate() * getAudioLayerFrameSize() / 1000)) * 2;
_audioRtpRecord.setMicData (new SFLDataFormat[nbSamplesMax]);
_audioRtpRecord.setMicDataConverted (new SFLDataFormat[nbSamplesMax]);
_audioRtpRecord.setMicDataEncoded (new unsigned char[nbSamplesMax * 2]);
_audioRtpRecord.setSpkrDataConverted (new SFLDataFormat[nbSamplesMax]);
_audioRtpRecord.setSpkrDataDecoded (new SFLDataFormat[nbSamplesMax]);
// memset (_micData, 0, nbSamplesMax*sizeof (SFLDataFormat));
// memset (_micDataConverted, 0, nbSamplesMax*sizeof (SFLDataFormat));
// memset (_micDataEncoded, 0, nbSamplesMax*2);
// memset (_spkrDataConverted, 0, nbSamplesMax*sizeof (SFLDataFormat));
// memset (_spkrDataDecoded, 0, nbSamplesMax*sizeof (SFLDataFormat));
_audioRtpRecord._converter = new SamplerateConverter (getAudioLayerSampleRate(), getAudioLayerFrameSize());
// int nbSamplesMax = (int) ( (getCodecSampleRate() * getAudioLayerFrameSize() / 1000)) * 2;
int nbSamplesMax = (int) ( (getCodecSampleRate() * 44100 / 1000)) * 2;
_audioRtpRecord._micData = new SFLDataFormat[nbSamplesMax];
_audioRtpRecord._micDataConverted = new SFLDataFormat[nbSamplesMax];
_audioRtpRecord._micDataEncoded = new unsigned char[nbSamplesMax * 2];
_audioRtpRecord._spkrDataConverted = new SFLDataFormat[nbSamplesMax];
_audioRtpRecord._spkrDataDecoded = new SFLDataFormat[nbSamplesMax];
Manager::instance().addStream (_ca->getCallId());
}
......@@ -377,8 +169,8 @@ void AudioRtpRecordHandler::initNoiseSuppress()
NoiseSuppress *noiseSuppress = new NoiseSuppress (getCodecFrameSize(), getCodecSampleRate());
AudioProcessing *processing = new AudioProcessing (noiseSuppress);
_audioRtpRecord.setNoiseSuppress (noiseSuppress);
_audioRtpRecord.setAudioProcessing (processing);
_audioRtpRecord._noiseSuppress = noiseSuppress;
_audioRtpRecord._audioProcess = processing;
}
void AudioRtpRecordHandler::putDtmfEvent (int digit)
......@@ -397,20 +189,23 @@ void AudioRtpRecordHandler::putDtmfEvent (int digit)
int AudioRtpRecordHandler::processDataEncode (void)
{
AudioCodec *audioCodec = getAudioCodec();
AudioCodec *audioCodec = _audioRtpRecord._audioCodec;
AudioLayer *audioLayer = Manager::instance().getAudioDriver();
SFLDataFormat *micData = _audioRtpRecord.getMicData();
unsigned char *micDataEncoded = _audioRtpRecord.getMicDataEncoded();
SFLDataFormat *micDataConverted = _audioRtpRecord.getMicDataConverted();
SFLDataFormat *micData = _audioRtpRecord._micData;
unsigned char *micDataEncoded = _audioRtpRecord._micDataEncoded;
SFLDataFormat *micDataConverted = _audioRtpRecord._micDataConverted;
assert (audioCodec);
assert (audioLayer);
int codecFrameSize = audioCodec->getFrameSize();
int codecSampleRate = audioCodec->getClockRate();
int mainBufferSampleRate = audioLayer->getMainBuffer()->getInternalSamplingRate();
// compute codec framesize in ms
float fixedCodecFramesize = computeCodecFrameSize (getCodecFrameSize(), getCodecSampleRate());
float fixedCodecFramesize = computeCodecFrameSize (codecFrameSize, codecSampleRate);
// compute nb of byte to get coresponding to 20 ms at audio layer frame size (44.1 khz)
int bytesToGet = computeNbByteAudioLayer (fixedCodecFramesize);
......@@ -425,8 +220,8 @@ int AudioRtpRecordHandler::processDataEncode (void)
int nbSample = audioLayer->getMainBuffer()->getData (micData, bytesToGet, 100, _ca->getCallId()) / sizeof (SFLDataFormat);
// process mic fade in
if (!_audioRtpRecord.getMicFadeInComplete())
_audioRtpRecord.setMicFadeInComplete (fadeIn (micData, nbSample, _audioRtpRecord.getMicAmplFactor()));
if (!_audioRtpRecord._micFadeInComplete)
_audioRtpRecord._micFadeInComplete = fadeIn (micData, nbSample, &_audioRtpRecord._micAmplFactor);
if (nbSample == 0)
return nbSample;
......@@ -435,19 +230,19 @@ int AudioRtpRecordHandler::processDataEncode (void)
int compSize = 0;
// test if resampling is required
if (_audioRtpRecord.getCodecSampleRate() != mainBufferSampleRate) {
if (codecSampleRate != mainBufferSampleRate) {
int nbSampleUp = nbSample;
nbSample = _audioRtpRecord.getConverter()->downsampleData (micData, micDataConverted, _audioRtpRecord.getCodecSampleRate(), mainBufferSampleRate, nbSampleUp);
nbSample = _audioRtpRecord._converter->downsampleData (micData, micDataConverted, codecSampleRate, mainBufferSampleRate, nbSampleUp);
if (Manager::instance().audioPreference.getNoiseReduce())
_audioRtpRecord.getNoiseReductionProcess()->processAudio (micDataConverted, nbSample * sizeof (SFLDataFormat));
_audioRtpRecord._audioProcess->processAudio (micDataConverted, nbSample * sizeof (SFLDataFormat));
compSize = audioCodec->codecEncode (micDataEncoded, micDataConverted, nbSample * sizeof (SFLDataFormat));
} else {
if (Manager::instance().audioPreference.getNoiseReduce())
_audioRtpRecord.getNoiseReductionProcess()->processAudio (micData, nbSample * sizeof (SFLDataFormat));
_audioRtpRecord._audioProcess->processAudio (micData, nbSample * sizeof (SFLDataFormat));
// no resampling required
compSize = audioCodec->codecEncode (micDataEncoded, micData, nbSample * sizeof (SFLDataFormat));
......@@ -459,14 +254,17 @@ int AudioRtpRecordHandler::processDataEncode (void)
void AudioRtpRecordHandler::processDataDecode (unsigned char *spkrData, unsigned int size)
{
AudioCodec *audioCodec = getAudioCodec();
AudioCodec *audioCodec = _audioRtpRecord._audioCodec;
AudioLayer *audioLayer = Manager::instance().getAudioDriver();
if (!audioCodec)
return;
SFLDataFormat *spkrDataDecoded = _audioRtpRecord.getSpkrDataConverted();
SFLDataFormat *spkrDataConverted = _audioRtpRecord.getSpkrDataDecoded();
int codeFrameSize = audioCodec->getFrameSize();
int codecSampleRate = audioCodec->getClockRate();
SFLDataFormat *spkrDataDecoded = _audioRtpRecord._spkrDataConverted;
SFLDataFormat *spkrDataConverted = _audioRtpRecord._spkrDataDecoded;
int mainBufferSampleRate = audioLayer->getMainBuffer()->getInternalSamplingRate();
......@@ -476,16 +274,16 @@ void AudioRtpRecordHandler::processDataDecode (unsigned char *spkrData, unsigned
// buffer _receiveDataDecoded ----> short int or int16, coded on 2 bytes
int nbSample = expandedSize / sizeof (SFLDataFormat);
if (!_audioRtpRecord.getSpkrFadeInComplete())
_audioRtpRecord.setSpkrFadeInComplete (fadeIn (spkrDataDecoded, nbSample, _audioRtpRecord.getMicAmplFactor()));
if (!_audioRtpRecord._spkrFadeInComplete)
_audioRtpRecord._spkrFadeInComplete = fadeIn (spkrDataDecoded, nbSample, &_audioRtpRecord._micAmplFactor);
// test if resampling is required
if (audioCodec->getClockRate() != mainBufferSampleRate) {
if (codecSampleRate != mainBufferSampleRate) {
// Do sample rate conversion
int nbSampleDown = nbSample;
nbSample = _audioRtpRecord.getConverter()->upsampleData (spkrDataDecoded, spkrDataConverted, _audioRtpRecord.getCodecSampleRate(), mainBufferSampleRate, nbSampleDown);
nbSample = _audioRtpRecord._converter->upsampleData (spkrDataDecoded, spkrDataConverted, codecSampleRate, mainBufferSampleRate, nbSampleDown);
// put data in audio layer, size in byte
audioLayer->getMainBuffer()->putData (spkrDataConverted, nbSample * sizeof (SFLDataFormat), 100, _ca->getCallId());
......
......@@ -86,53 +86,9 @@ typedef list<DtmfEvent *> EventQueue;
class AudioRtpRecord
{
public:
AudioRtpRecord (ManagerImpl *manager);
virtual ~AudioRtpRecord();
inline AudioCodec *getAudioCodec() const;
int getCodecPayloadType() const;
bool getHasDynamicPayload() const;
int getAudioLayerFrameSize() const;
int getAudioLayerSampleRate() const;
int getCodecFrameSize() const;
int getCodecSampleRate() const;
SamplerateConverter *getConverter() const;
inline int getConverterSamplingRate() const;
EventQueue *getEventQueue();
int getEventQueueSize() const;
SFLDataFormat *getMicData();
SFLDataFormat *getMicDataConverted();
unsigned char *getMicDataEncoded();
SFLDataFormat *getMicAmplFactor();
bool getMicFadeInComplete() const;
SFLDataFormat *getSpkrAmplFactor();
SFLDataFormat *getSpkrDataConverted() const;
SFLDataFormat *getSpkrDataDecoded() const;
bool getSpkrFadeInComplete() const;
AudioProcessing *getNoiseReductionProcess() const;
void setAudioCodec (AudioCodec *audioCodec);
void setCodecPayloadType (int codecPayloadType);
void setHasDynamicPayload (bool hasDynamicPayload);
void setAudioLayerFrameSize (int _audioLayerFrameSize);
void setAudioLayerSampleRate (int _audioLayerSampleRate);
void setCodecFrameSize (int _codecFrameSize);
void setCodecSampleRate (int _codecSampleRate);
void setConverter (SamplerateConverter *_converter);
void setConverterSamplingRate (int _converterSamplingRate);
void setEventQueue (EventQueue _eventQueue);
void setMicData (SFLDataFormat *micData);
void setMicDataConverted (SFLDataFormat *micDataConverted);
void setMicDataEncoded (unsigned char *micDataEncoded);
void setMicAmplFactor (SFLDataFormat _micAmplFactor);
void setMicFadeInComplete (bool _micFadeInComplete);
void setSpkrAmplFactor (SFLDataFormat _spkrAmplFactor);
void setSpkrDataConverted (SFLDataFormat *_spkrDataConverted);
void setSpkrDataDecoded (SFLDataFormat *_spkrDataDecoded);
void setSpkrFadeInComplete (bool _spkrFadeInComplete);
void setAudioProcessing (AudioProcessing *audioProcess);
void setNoiseSuppress (NoiseSuppress *noiseSuppress);
AudioRtpRecord ();
~AudioRtpRecord();
private:
AudioCodec *_audioCodec;
int _codecPayloadType;
bool _hasDynamicPayloadType;
......@@ -162,67 +118,70 @@ class AudioRtpRecordHandler
{
public:
AudioRtpRecordHandler (ManagerImpl *manager, SIPCall *ca);
virtual ~AudioRtpRecordHandler();
~AudioRtpRecordHandler();
/**
* Set rtp media for this session
*/
void setRtpMedia (AudioCodec* audioCodec);
AudioCodec *getAudioCodec (void) {
return _audioRtpRecord.getAudioCodec();
return _audioRtpRecord._audioCodec;
}
int getCodecPayloadType (void) {
return _audioRtpRecord.getCodecPayloadType();
return _audioRtpRecord._codecPayloadType;
}
int getCodecSampleRate (void) {
return _audioRtpRecord.getCodecSampleRate();
return _audioRtpRecord._codecSampleRate;
}
int getCodecFrameSize (void) {
return _audioRtpRecord.getCodecFrameSize();
return _audioRtpRecord._codecFrameSize;
}
int getHasDynamicPayload (void) {
return _audioRtpRecord.getHasDynamicPayload();
return _audioRtpRecord._hasDynamicPayloadType;
}
int getAudioLayerFrameSize (void) {
return _audioRtpRecord.getAudioLayerFrameSize();
return _audioRtpRecord._audioLayerFrameSize;
}
int getAudioLayerSampleRate (void) {
return _audioRtpRecord.getAudioLayerSampleRate();
return _audioRtpRecord._audioLayerSampleRate;
}
EventQueue *getEventQueue (void) {
return _audioRtpRecord.getEventQueue();
return &_audioRtpRecord._eventQueue;
}
int getEventQueueSize (void) {
return _audioRtpRecord.getEventQueueSize();
return _audioRtpRecord._eventQueue.size();
}
SFLDataFormat *getMicData (void) {
return _audioRtpRecord.getMicData();
return _audioRtpRecord._micData;
}
SFLDataFormat *getMicDataConverted (void) {
return _audioRtpRecord.getMicDataConverted();
return _audioRtpRecord._micDataConverted;
}
unsigned char *getMicDataEncoded (void) {
return _audioRtpRecord.getMicDataEncoded();
return _audioRtpRecord._micDataEncoded;
}
inline float computeCodecFrameSize (int codecSamplePerFrame, int codecClockRate) {
return ( (float) codecSamplePerFrame * 1000.0) / (float) codecClockRate;
}
int computeNbByteAudioLayer (float codecFrameSize) {
return (int) ( ( (float) _audioRtpRecord.getCodecSampleRate() * codecFrameSize * sizeof (SFLDataFormat)) / 1000.0);
return (int) ( ( (float) _audioRtpRecord._codecSampleRate * codecFrameSize * sizeof (SFLDataFormat)) / 1000.0);
}
void init (void);
......
......@@ -57,8 +57,9 @@ AudioRtpSession::AudioRtpSession (ManagerImpl * manager, SIPCall * sipcall) :
, _timestampCount (0)
, _countNotificationTime (0)
, _ca (sipcall)
, _isStarted (false)
{
setCancel (cancelDefault);
ost::Thread::setCancel (cancelDefault);
assert (_ca);
......@@ -75,7 +76,7 @@ AudioRtpSession::~AudioRtpSession()
_info ("AudioRtpSession: Delete AudioRtpSession instance");
try {
terminate();
ost::Thread::terminate();
} catch (...) {
_debugException ("AudioRtpSession: Thread destructor didn't terminate correctly");
throw;
......@@ -300,13 +301,17 @@ void AudioRtpSession::notifyIncomingCall()
int AudioRtpSession::startRtpThread (AudioCodec* audiocodec)
{
if (_isStarted)
return 0;
_debug ("AudioRtpSession: Starting main thread");
_isStarted = true;
setSessionTimeouts();
setSessionMedia (audiocodec);
initBuffers();
initNoiseSuppress();
enableStack();
int ret = start (_mainloopSemaphore);
int ret = ost::Thread::start (_mainloopSemaphore);
return ret;
}
......
......@@ -174,6 +174,8 @@ class AudioRtpSession : protected ost::Thread, public ost::TimerPort, public Aud
protected:
SIPCall * _ca;
bool _isStarted;
};
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment