diff --git a/sflphone-common/src/audio/audiortp.cpp b/sflphone-common/src/audio/audiortp.cpp index 2335e5ce879bd5207836f43e7e97b36fa2bf1ead..3493159f72ba943985a230bd894df5794ce8df3b 100644 --- a/sflphone-common/src/audio/audiortp.cpp +++ b/sflphone-common/src/audio/audiortp.cpp @@ -154,6 +154,7 @@ AudioRtpRTX::AudioRtpRTX (SIPCall *sipcall, bool sym) : time(new ost::Time()), _ _debug ("%i\n", _ca->getLocalAudioPort()); _session = new ost::SymmetricRTPSession (local_ip, _ca->getLocalAudioPort()); + // _session = new ost::RTPSessionBase(local_ip, _ca->getLocalAudioPort()); _sessionRecv = NULL; _sessionSend = NULL; @@ -195,6 +196,8 @@ AudioRtpRTX::~AudioRtpRTX () { delete converter; converter = NULL; + // _session->terminate(); + delete _session; _session = NULL; _debug("AudioRtpRTX instance deleted\n"); @@ -222,9 +225,9 @@ AudioRtpRTX::initBuffers() AudioRtpRTX::initAudioRtpSession (void) { - try { + try { - _session->setSchedulingTimeout(10000); + _session->setSchedulingTimeout(100000); _session->setExpireTimeout(1000000); @@ -252,10 +255,8 @@ AudioRtpRTX::setRtpSessionMedia(void) _codecSampleRate = _audiocodec->getClockRate(); _codecFrameSize = _audiocodec->getFrameSize(); - - if (_audiocodec->getPayload() == 9){ - _debug("WE ARE G722\n"); - _payloadIsSet = _session->setPayloadFormat(ost::DynamicPayloadFormat((ost::StaticPayloadType) _audiocodec->getPayload(), 16000)); + if( _audiocodec->getPayload() == 9 ) { + _payloadIsSet = _session->setPayloadFormat(ost::DynamicPayloadFormat((ost::PayloadType) _audiocodec->getPayload(), _audiocodec->getClockRate())); } else if ( _audiocodec->hasDynamicPayload() ) { _payloadIsSet = _session->setPayloadFormat(ost::DynamicPayloadFormat((ost::PayloadType) _audiocodec->getPayload(), _audiocodec->getClockRate())); @@ -322,6 +323,8 @@ int AudioRtpRTX::processDataEncode() { + _debug("processDataEncode\n"); + // compute codec framesize in ms float fixed_codec_framesize = computeCodecFrameSize(_audiocodec->getFrameSize(), _audiocodec->getClockRate()); @@ -373,7 +376,7 @@ AudioRtpRTX::processDataEncode() void AudioRtpRTX::processDataDecode(unsigned char* spkrData, unsigned int size, int& countTime) { - + _debug("processDataDecode\n"); if (_audiocodec != NULL) { // Return the size of data in bytes @@ -427,7 +430,7 @@ AudioRtpRTX::sendSessionFromMic(int timestamp) // 3. encode it // 4. send it - + _debug("sendSessionForSpeaker\n"); timestamp += time->getSecond(); // no call, so we do nothing if (_ca==0) { _debug(" !ARTP: No call associated (mic)\n"); return; } @@ -439,7 +442,7 @@ AudioRtpRTX::sendSessionFromMic(int timestamp) int compSize = processDataEncode(); - + _debug("compSize: %i\n", compSize); // putData put the data on RTP queue, sendImmediate bypass this queue _session->putData(timestamp, micDataEncoded, compSize); // _session->sendImmediate(timestamp, micDataEncoded, compSize); @@ -451,6 +454,8 @@ AudioRtpRTX::sendSessionFromMic(int timestamp) void AudioRtpRTX::receiveSessionForSpkr (int& countTime) { + + _debug("receiveSessionForSpkr\n"); if (_ca == 0) { return; } @@ -460,11 +465,9 @@ AudioRtpRTX::receiveSessionForSpkr (int& countTime) const ost::AppDataUnit* adu = NULL; - if (!_sym) { - adu = _sessionRecv->getData(_sessionRecv->getFirstTimestamp()); - } else { - adu = _session->getData(_session->getFirstTimestamp()); - } + + adu = _session->getData(_session->getFirstTimestamp()); + if (adu == NULL) { // _debug("No RTP audio stream\n"); return; @@ -498,8 +501,6 @@ void AudioRtpRTX::run () { int sessionWaiting; - - _session->startRunning(); initBuffers(); initAudioRtpSession(); @@ -522,6 +523,8 @@ AudioRtpRTX::run () { _audiolayer->startStream(); + _session->startRunning(); + _debug("- ARTP Action: Start call %s\n",_ca->getCallId().c_str()); while (!testCancel()) { @@ -529,8 +532,8 @@ AudioRtpRTX::run () { sessionWaiting = _session->isWaiting(); sendSessionFromMic(timestamp); - timestamp += timestep; - + // timestamp += timestep; + timestamp = _session->getCurrentTimestamp(); // Recv session receiveSessionForSpkr(countTime); diff --git a/sflphone-common/src/audio/codecs/audiocodec.h b/sflphone-common/src/audio/codecs/audiocodec.h index c7ad5ccf1468a78c025c5dbecee0887a68d960d9..1487fb465dce56cd9a5821ba8cd3a4695398adca 100644 --- a/sflphone-common/src/audio/codecs/audiocodec.h +++ b/sflphone-common/src/audio/codecs/audiocodec.h @@ -34,12 +34,30 @@ public: : _codecName(codecName), _clockRate(8000), _channel(1), _bitrate(0.0),_bandwidth(0),_payload(payload), _hasDynamicPayload(false),_state(true) { _hasDynamicPayload = (_payload >= 96 && _payload <= 127) ? true : false; + + // If g722 (payload 9), we need to init libccrtp symetric sessions with using + // dynamic payload format. This way we get control on rtp clockrate. + + if(_payload == 9) + { + _hasDynamicPayload = true; + } + } AudioCodec( const AudioCodec& codec ) : _codecName(codec._codecName), _clockRate(codec._clockRate), _channel(codec._channel), _bitrate(codec._bitrate),_bandwidth(codec._bandwidth),_payload(codec._payload), _hasDynamicPayload(false),_state(true) { _hasDynamicPayload = (_payload >= 96 && _payload <= 127) ? true : false; + + // If g722 (payload 9), we need to init libccrtp symetric sessions with using + // dynamic payload format. This way we get control on rtp clockrate. + + if(_payload == 9) + { + _hasDynamicPayload = true; + } + } virtual ~AudioCodec() { diff --git a/sflphone-common/src/sipvoiplink.cpp b/sflphone-common/src/sipvoiplink.cpp index 897aded5b5d5b1c355475f19608c5371e19291d0..f1e8f2cf9fe5201eee26c1fc1c95deeb130d5141 100644 --- a/sflphone-common/src/sipvoiplink.cpp +++ b/sflphone-common/src/sipvoiplink.cpp @@ -508,14 +508,15 @@ SIPVoIPLink::newOutgoingCall ( const CallID& id, const std::string& toUrl ) call->setPeerNumber ( getSipTo ( toUrl, account->getHostname() ) ); setCallAudioLocal ( call, getLocalIPAddress(), useStun(), getStunServer() ); - /* + try { _debug("CREATE NEW RTP SESSION FROM NEWOUTGOINGCALL\n"); _audiortp->createNewSession (call); } catch (...) { _debug("Failed to create rtp thread from newOutGoingCall\n"); } - */ + + call->initRecFileName(); @@ -539,7 +540,7 @@ SIPVoIPLink::newOutgoingCall ( const CallID& id, const std::string& toUrl ) // _audiortp->start(); - call->setAudioStart ( true ); + // call->setAudioStart ( true ); } @@ -596,9 +597,7 @@ SIPVoIPLink::answer ( const CallID& id ) call->setConnectionState ( Call::Connected ); call->setState ( Call::Active ); - _audiortp->start(); - - call->setAudioStart ( true ); + ; return true; } @@ -1233,6 +1232,8 @@ void SIPVoIPLink::SIPCallAnswered ( SIPCall *call, pjsip_rx_data *rdata ) { + _debug ( "SIPCallAnswered\n" ); + pjmedia_sdp_session *r_sdp; if ( !call ) @@ -1260,20 +1261,23 @@ SIPVoIPLink::SIPCallAnswered ( SIPCall *call, pjsip_rx_data *rdata ) call->setState ( Call::Active ); Manager::instance().peerAnsweredCall ( call->getCallId() ); + if (Manager::instance().isCurrentCall(call->getCallId())) + { + /* + _debug("CREATE NEW RTP SESSION FROM SIPCALLANSWERED\n"); + try { + _audiortp->createNewSession (call); + call->setAudioStart(true); + } catch (...) { + _debug("Failed to create rtp thread from answer\n"); + } + */ - - _debug("CREATE NEW RTP SESSION FROM SIPCALLANSWERED\n"); - try { - _audiortp->createNewSession (call); - call->setAudioStart(true); - } catch (...) { - _debug("Failed to create rtp thread from answer\n"); - } - - - call->setAudioStart(true); + call->setAudioStart(true); - _audiortp->start(); + _audiortp->start(); + + } } else @@ -1346,13 +1350,13 @@ bool SIPVoIPLink::new_ip_to_ip_call ( const CallID& id, const std::string& to ) // Building the local SDP offer call->getLocalSDP()->set_ip_address ( getLocalIP() ); call->getLocalSDP()->create_initial_offer(); - /* + try { _audiortp->createNewSession (call); } catch (...) { _debug ( "! SIP Failure: Unable to create RTP Session in SIPVoIPLink::new_ip_to_ip_call (%s:%d)\n", __FILE__, __LINE__ ); } - */ + // Generate the contact URI // uri_contact << "<" << uri_from << ":" << call->getLocalSDP()->get_local_extern_audio_port() << ">"; @@ -1391,9 +1395,9 @@ bool SIPVoIPLink::new_ip_to_ip_call ( const CallID& id, const std::string& to ) call->setState ( Call::Active ); addCall ( call ); - _audiortp->start(); + // _audiortp->start(); - call->setAudioStart ( true ); + // call->setAudioStart ( true ); return true; } @@ -1912,8 +1916,7 @@ void SIPVoIPLink::handle_reinvite ( SIPCall *call ) _audiortp->start(); call->setAudioStart ( true ); - // _audiortp->getRTX()->setRtpSessionRemoteIp(); - // _audiortp->getRTX()->setRtpSessionMedia(); + }