diff --git a/sflphone-common/src/audio/audiortp.cpp b/sflphone-common/src/audio/audiortp.cpp index c1c8e00f1e135548ba1552b9cd0816b63f597c33..7eb496a7112b9b14d35136de66f4c9d2dd647d75 100644 --- a/sflphone-common/src/audio/audiortp.cpp +++ b/sflphone-common/src/audio/audiortp.cpp @@ -109,7 +109,7 @@ AudioRtp::closeRtpSession () { _debugException("! ARTP Exception: when stopping audiortp\n"); throw; } - AudioLayer* audiolayer = Manager::instance().getAudioDriver(); + // AudioLayer* audiolayer = Manager::instance().getAudioDriver(); // audiolayer->stopStream(); _debug("AudioRtp::Audio rtp stopped\n"); @@ -150,16 +150,22 @@ AudioRtpRTX::AudioRtpRTX (SIPCall *sipcall, bool sym) : time(new ost::Time()), _ // TODO: this should be the local ip not the external (router) IP std::string localipConfig = _ca->getLocalIp(); // _ca->getLocalIp(); ost::InetHostAddress local_ip(localipConfig.c_str()); - if (!_sym) { - _sessionRecv = new ost::RTPSession(local_ip, _ca->getLocalAudioPort()); - _sessionSend = new ost::RTPSession(local_ip, _ca->getLocalAudioPort()); - _session = NULL; - } else { - _debug ("%i\n", _ca->getLocalAudioPort()); - _session = new ost::SymmetricRTPSession (local_ip, _ca->getLocalAudioPort()); - _sessionRecv = NULL; - _sessionSend = NULL; - } + + _debug ("%i\n", _ca->getLocalAudioPort()); + _session = new ost::SymmetricRTPSession (local_ip, _ca->getLocalAudioPort()); + _sessionRecv = NULL; + _sessionSend = NULL; + + //mic, we receive from soundcard in stereo, and we send encoded + //encoding before sending + _audiolayer = Manager::instance().getAudioDriver(); + _layerFrameSize = _audiolayer->getFrameSize(); // in ms + _layerSampleRate = _audiolayer->getSampleRate(); + + initBuffers(); + + initAudioRtpSession(); + } AudioRtpRTX::~AudioRtpRTX () { @@ -175,13 +181,10 @@ AudioRtpRTX::~AudioRtpRTX () { throw; } _ca = 0; - if (!_sym) { - delete _sessionRecv; _sessionRecv = NULL; - delete _sessionSend; _sessionSend = NULL; - } else { - _debug("Delete ost::RTPSession in AudioRtpRTX\n"); - delete _session; _session = NULL; - } + + _debug("Delete ost::RTPSession in AudioRtpRTX\n"); + delete _session; _session = NULL; + _debug("Just killed AudioRtpRTX rtp sessions\n"); @@ -241,16 +244,10 @@ AudioRtpRTX::initAudioRtpSession (void) } */ - if (!_sym) { - _sessionRecv->setSchedulingTimeout (10000); - _sessionRecv->setExpireTimeout(1000000); - - _sessionSend->setSchedulingTimeout(10000); - _sessionSend->setExpireTimeout(1000000); - } else { - _session->setSchedulingTimeout(10000); - _session->setExpireTimeout(1000000); - } + + _session->setSchedulingTimeout(10000); + _session->setExpireTimeout(1000000); + // setRtpSessionRemoteIp(); @@ -305,84 +302,59 @@ void AudioRtpRTX::setRtpSessionMedia(void) { - _debug("setRtpSessionMedia()\n"); - - if (_ca == 0) { return; } + _debug("**************************** setRtpSessionMedia() *****************************\n"); - _audiocodec = _ca->getLocalSDP()->get_session_media (); - _debug("AudioRtp: _audiocodec->getPayload() %i\n", _audiocodec->getPayload()); + if (_ca == 0) { _debug(" !ARTP: No call, can't init RTP media\n"); return; } + + if (_audiocodec == NULL) { _debug(" !ARTP: No audiocodec, can't init RTP media\n"); return; } + + _debug("Init audio RTP session: codec payload %i\n", _audiocodec->getPayload()); if (_audiocodec == NULL) { return; } _codecSampleRate = _audiocodec->getClockRate(); _codecFrameSize = _audiocodec->getFrameSize(); - if (!_sym) { - - bool payloadIsSet = false; - if (_audiocodec) { - if (_audiocodec->hasDynamicPayload()) { - payloadIsSet = _sessionRecv->setPayloadFormat(ost::DynamicPayloadFormat((ost::PayloadType) _audiocodec->getPayload(), _audiocodec->getClockRate())); - } else { - payloadIsSet= _sessionRecv->setPayloadFormat(ost::StaticPayloadFormat((ost::StaticPayloadType) _audiocodec->getPayload())); - payloadIsSet = _sessionSend->setPayloadFormat(ost::StaticPayloadFormat((ost::StaticPayloadType) _audiocodec->getPayload())); - } - } - _sessionSend->setMark(true); - } else { + - bool payloadIsSet = false; - if (_audiocodec) { - if (_audiocodec->hasDynamicPayload()) { - payloadIsSet = _session->setPayloadFormat(ost::DynamicPayloadFormat((ost::PayloadType) _audiocodec->getPayload(), _audiocodec->getClockRate())); - } else { - payloadIsSet = _session->setPayloadFormat(ost::StaticPayloadFormat((ost::StaticPayloadType) _audiocodec->getPayload())); - } - } + bool payloadIsSet = false; + + if (_audiocodec->hasDynamicPayload()) { + payloadIsSet = _session->setPayloadFormat(ost::DynamicPayloadFormat((ost::PayloadType) _audiocodec->getPayload(), _audiocodec->getClockRate())); + } + else + { + payloadIsSet = _session->setPayloadFormat(ost::StaticPayloadFormat((ost::StaticPayloadType) _audiocodec->getPayload())); } + + } void AudioRtpRTX::setRtpSessionRemoteIp(void) { - _debug("setRtpSessionRemoteIp()\n"); + _debug("**************************** setRtpSessionRemoteIp() *****************************\n"); - if (_ca == 0) { - _debug("Return no call \n"); - return; - } + if (_ca == 0) { _debug(" !ARTP: No call, can't init RTP media \n"); return; } ost::InetHostAddress remote_ip(_ca->getLocalSDP()->get_remote_ip().c_str()); - _debug("Init audio RTP session %s\n", _ca->getLocalSDP()->get_remote_ip().data()); - if (!remote_ip) { - _debug("! ARTP Thread Error: Target IP address [%s] is not correct!\n", _ca->getLocalSDP()->get_remote_ip().data()); + _debug("Init audio RTP session: remote ip %s\n", _ca->getLocalSDP()->get_remote_ip().data()); + if (!remote_ip) + { + _debug(" !ARTP Thread Error: Target IP address [%s] is not correct!\n", _ca->getLocalSDP()->get_remote_ip().data()); return; } - - if (!_sym) { - - if ( !_sessionRecv->addDestination(remote_ip, (unsigned short) _ca->getLocalSDP()->get_remote_audio_port()) ) { - _debug("AudioRTP Thread Error: could not connect to port %d\n", _ca->getLocalSDP()->get_remote_audio_port()); - return; - } - if (!_sessionSend->addDestination (remote_ip, (unsigned short) _ca->getLocalSDP()->get_remote_audio_port())) { - _debug("! ARTP Thread Error: could not connect to port %d\n", _ca->getLocalSDP()->get_remote_audio_port()); - return; - } - - _sessionSend->setMark(true); - } else { - - _debug("AudioRtp: _ca->getLocalSDP()->get_remote_audio_port() %i\n", (unsigned short)_ca->getLocalSDP()->get_remote_audio_port()); - if (!_session->addDestination (remote_ip, (unsigned short)_ca->getLocalSDP()->get_remote_audio_port() )) { - return; - } + if (!_session->addDestination (remote_ip, (unsigned short)_ca->getLocalSDP()->get_remote_audio_port() )) + { + return; } + + } @@ -401,7 +373,7 @@ AudioRtpRTX::computeNbByteAudioLayer(float codecFrameSize) int -AudioRtpRTX::processDataEncode(AudioLayer* audiolayer) +AudioRtpRTX::processDataEncode() { // compute codec framesize in ms @@ -411,7 +383,7 @@ AudioRtpRTX::processDataEncode(AudioLayer* audiolayer) int maxBytesToGet = computeNbByteAudioLayer(fixed_codec_framesize); // available bytes inside ringbuffer - int availBytesFromMic = audiolayer->canGetMic(); + int availBytesFromMic = _audiolayer->canGetMic(); // set available byte to maxByteToGet int bytesAvail = (availBytesFromMic < maxBytesToGet) ? availBytesFromMic : maxBytesToGet; @@ -420,7 +392,7 @@ AudioRtpRTX::processDataEncode(AudioLayer* audiolayer) return 0; // Get bytes from micRingBuffer to data_from_mic - int nbSample = audiolayer->getMic( micData , bytesAvail ) / sizeof(SFLDataFormat); + int nbSample = _audiolayer->getMic( micData , bytesAvail ) / sizeof(SFLDataFormat); // nb bytes to be sent over RTP int compSize = 0; @@ -453,7 +425,7 @@ AudioRtpRTX::processDataEncode(AudioLayer* audiolayer) void -AudioRtpRTX::processDataDecode(AudioLayer* audiolayer, unsigned char* spkrData, unsigned int size, int& countTime) +AudioRtpRTX::processDataDecode(unsigned char* spkrData, unsigned int size, int& countTime) { if (_audiocodec != NULL) { @@ -475,7 +447,7 @@ AudioRtpRTX::processDataDecode(AudioLayer* audiolayer, unsigned char* spkrData, _nSamplesSpkr = nbSample; // put data in audio layer, size in byte - audiolayer->putMain (spkrDataConverted, nbSample * sizeof(SFLDataFormat)); + _audiolayer->putMain (spkrDataConverted, nbSample * sizeof(SFLDataFormat)); } else { @@ -483,7 +455,7 @@ AudioRtpRTX::processDataDecode(AudioLayer* audiolayer, unsigned char* spkrData, _nSamplesSpkr = nbSample; // put data in audio layer, size in byte - audiolayer->putMain (spkrDataDecoded, nbSample * sizeof(SFLDataFormat)); + _audiolayer->putMain (spkrDataDecoded, nbSample * sizeof(SFLDataFormat)); } // Notify (with a beep) an incoming call when there is already a call @@ -514,21 +486,21 @@ AudioRtpRTX::sendSessionFromMic(int timestamp) // no call, so we do nothing if (_ca==0) { _debug(" !ARTP: No call associated (mic)\n"); return; } - AudioLayer* audiolayer = Manager::instance().getAudioDriver(); - if (!audiolayer) { _debug(" !ARTP: No audiolayer available for mic\n"); return; } + // AudioLayer* audiolayer = Manager::instance().getAudioDriver(); + if (!_audiolayer) { _debug(" !ARTP: No audiolayer available for MIC\n"); return; } - if (!_audiocodec) { _debug(" !ARTP: No audiocodec available for mic\n"); return; } + if (!_audiocodec) { _debug(" !ARTP: No audiocodec available for MIC\n"); return; } - int compSize = processDataEncode(audiolayer); + int compSize = processDataEncode(); // putData put the data on RTP queue, sendImmediate bypass this queue if (!_sym) { - // _sessionSend->putData(timestamp, micDataEncoded, compSize); - _sessionSend->sendImmediate(timestamp, micDataEncoded, compSize); + _sessionSend->putData(timestamp, micDataEncoded, compSize); + // _sessionSend->sendImmediate(timestamp, micDataEncoded, compSize); } else { - // _session->putData(timestamp, micDataEncoded, compSize); - _session->sendImmediate(timestamp, micDataEncoded, compSize); + _session->putData(timestamp, micDataEncoded, compSize); + // _session->sendImmediate(timestamp, micDataEncoded, compSize); } } @@ -541,11 +513,13 @@ AudioRtpRTX::receiveSessionForSpkr (int& countTime) if (_ca == 0) { return; } - AudioLayer* audiolayer = Manager::instance().getAudioDriver(); - if (!audiolayer) { return; } + // AudioLayer* audiolayer = Manager::instance().getAudioDriver(); - const ost::AppDataUnit* adu = NULL; + if (!_audiolayer) { _debug(" !ARTP: No audiolayer available for SPEAKER\n"); return; } + + if (!_audiocodec) { _debug(" !ARTP: No audiocodec available for SPEAKER\n"); return; } + const ost::AppDataUnit* adu = NULL; if (!_sym) { adu = _sessionRecv->getData(_sessionRecv->getFirstTimestamp()); @@ -560,7 +534,7 @@ AudioRtpRTX::receiveSessionForSpkr (int& countTime) unsigned char* spkrData = (unsigned char*)adu->getData(); // data in char unsigned int size = adu->getSize(); // size in char - processDataDecode(audiolayer, spkrData, size, countTime); + processDataDecode(spkrData, size, countTime); } @@ -583,38 +557,22 @@ AudioRtpRTX::receiveSessionForSpkr (int& countTime) void AudioRtpRTX::run () { - //mic, we receive from soundcard in stereo, and we send encoded - //encoding before sending - AudioLayer *audiolayer = Manager::instance().getAudioDriver(); - _layerFrameSize = audiolayer->getFrameSize(); // en ms - _layerSampleRate = audiolayer->getSampleRate(); - - initBuffers(); - int step; - - int sessionWaiting; - - //try { - - // Init the session - initAudioRtpSession(); + /* + //mic, we receive from soundcard in stereo, and we send encoded + //encoding before sending + AudioLayer *audiolayer = Manager::instance().getAudioDriver(); + _layerFrameSize = audiolayer->getFrameSize(); // en ms + _layerSampleRate = audiolayer->getSampleRate(); + */ + int sessionWaiting; + + _session->startRunning(); + //_debug("Session is now: %d active\n", _session->isActive()); - // step = (int) (_layerFrameSize * _codecSampleRate / 1000); - step = _codecFrameSize; - // start running the packet queue scheduler. - //_debug("AudioRTP Thread started\n"); - if (!_sym) { - _sessionRecv->startRunning(); - _sessionSend->startRunning(); - } else { - _session->startRunning(); - //_debug("Session is now: %d active\n", _session->isActive()); - } + int timestep = _codecFrameSize; int timestamp = 0; // for mic - // step = (int) (_layerFrameSize * _codecSampleRate / 1000); - step = _codecFrameSize; int countTime = 0; // for receive @@ -622,11 +580,11 @@ AudioRtpRTX::run () { if (_codecSampleRate != 0) threadSleep = (_codecFrameSize * 1000) / _codecSampleRate; else - threadSleep = _layerFrameSize; + threadSleep = _layerFrameSize; TimerPort::setTimer(threadSleep); - audiolayer->startStream(); + _audiolayer->startStream(); _start.post(); _debug("- ARTP Action: Start call %s\n",_ca->getCallId().c_str()); while (!testCancel()) { @@ -643,7 +601,7 @@ AudioRtpRTX::run () { sessionWaiting = _session->isWaiting(); sendSessionFromMic(timestamp); - timestamp += step; + timestamp += timestep; //////////////////////////// // Recv session diff --git a/sflphone-common/src/audio/audiortp.h b/sflphone-common/src/audio/audiortp.h index 17bfdb6569773dccbe4e51139d88266ee22308b2..56345de0c99d70b840fa5f15700dd7d22c140745 100644 --- a/sflphone-common/src/audio/audiortp.h +++ b/sflphone-common/src/audio/audiortp.h @@ -133,6 +133,9 @@ class AudioRtpRTX : public ost::Thread, public ost::TimerPort { /** Sample rate converter object */ SamplerateConverter* converter; + /** audio layer */ + AudioLayer *_audiolayer; + /** Variables to process audio stream: sample rate for playing sound (typically 44100HZ) */ int _layerSampleRate; @@ -178,10 +181,10 @@ class AudioRtpRTX : public ost::Thread, public ost::TimerPort { int computeNbByteAudioLayer(float codecFrameSize); - int processDataEncode(AudioLayer* audiolayer); + int processDataEncode(); - void processDataDecode(AudioLayer* audiolayer, unsigned char* spkrData, unsigned int size, int& countTime); + void processDataDecode(unsigned char* spkrData, unsigned int size, int& countTime); /** diff --git a/sflphone-common/src/sipvoiplink.cpp b/sflphone-common/src/sipvoiplink.cpp index 30080fad7921d8dfa7fe65ddb1d06d19b6e76806..567ec7f181bca74ca1a39500d99b4103ac250f56 100644 --- a/sflphone-common/src/sipvoiplink.cpp +++ b/sflphone-common/src/sipvoiplink.cpp @@ -2097,9 +2097,13 @@ void call_on_media_update ( pjsip_inv_session *inv, pj_status_t status ) if (call->getState() != Call::Hold) { + _debug("Set parameters in RTP session\n"); link->_audiortp->getRTX()->setRtpSessionMedia(); link->_audiortp->getRTX()->setRtpSessionRemoteIp(); } + else { + _debug("Didn't set RTP parameters since call is on hold\n"); + } }