diff --git a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp index 226602fb579830cf7fb6fa674a0ff2c98a2c29a4..43e20fcfe39dafd9de4a26e46306437340694ba4 100644 --- a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp +++ b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp @@ -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()); diff --git a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.h b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.h index 6b4552b9fc4c253b45947f71e43fd40f60af6cdd..eaf7c028c21547071fb200d5c5a5bf56b680a0a8 100644 --- a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.h +++ b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.h @@ -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); diff --git a/sflphone-common/src/audio/audiortp/AudioRtpSession.cpp b/sflphone-common/src/audio/audiortp/AudioRtpSession.cpp index b769e1cd4d628d071ad234b1c84a26b224762f61..c3888d707cf84fdafe0265c3ad8f37ab9389e8af 100644 --- a/sflphone-common/src/audio/audiortp/AudioRtpSession.cpp +++ b/sflphone-common/src/audio/audiortp/AudioRtpSession.cpp @@ -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; } diff --git a/sflphone-common/src/audio/audiortp/AudioRtpSession.h b/sflphone-common/src/audio/audiortp/AudioRtpSession.h index 46e8bc70ab8549eae3adea76273466c3434ce6a0..8cf7d9120057c2f3205b299fe17942a333b31b72 100644 --- a/sflphone-common/src/audio/audiortp/AudioRtpSession.h +++ b/sflphone-common/src/audio/audiortp/AudioRtpSession.h @@ -174,6 +174,8 @@ class AudioRtpSession : protected ost::Thread, public ost::TimerPort, public Aud protected: SIPCall * _ca; + + bool _isStarted; }; }