From 085bd7ce5d965cac8691005f33c0f685ea7c5005 Mon Sep 17 00:00:00 2001 From: yanmorin Date: Mon, 26 Sep 2005 19:29:57 +0000 Subject: [PATCH] It's working Lot of debugging code right now You need STUN, because it doesn't work without it --- doc/sflphone-server2.xmi | 14 +-- src/audio/audiortp.cpp | 30 ++--- src/audio/tonegenerator.cpp | 7 +- src/gui/guiframework.cpp | 4 +- src/gui/guiframework.h | 2 +- src/gui/server/Makefile.am | 7 +- src/gui/server/requestmanager.cpp | 6 +- src/gui/server/tcpsessionio.cpp | 4 - src/managerimpl.cpp | 13 +- src/managerimpl.h | 4 +- src/sipcall.cpp | 189 ++++++++++++++++-------------- src/sipcall.h | 36 +++--- src/sipvoiplink.cpp | 40 ++++--- 13 files changed, 193 insertions(+), 163 deletions(-) diff --git a/doc/sflphone-server2.xmi b/doc/sflphone-server2.xmi index ece68a083..b60010353 100644 --- a/doc/sflphone-server2.xmi +++ b/doc/sflphone-server2.xmi @@ -1,5 +1,5 @@ - + umbrello uml modeller http://uml.sf.net @@ -834,7 +834,7 @@
- +
@@ -1435,7 +1435,7 @@
- +
@@ -2779,7 +2779,7 @@
- +
@@ -5565,7 +5565,7 @@
- +
@@ -6765,7 +6765,7 @@
- +
@@ -9048,7 +9048,7 @@
- +
diff --git a/src/audio/audiortp.cpp b/src/audio/audiortp.cpp index 979f278b1..bb4c615c9 100644 --- a/src/audio/audiortp.cpp +++ b/src/audio/audiortp.cpp @@ -69,6 +69,7 @@ AudioRtp::createNewSession (SipCall *ca) { Manager::instance().getAudioDriver()->micRingBuffer().flush(); Manager::instance().getAudioDriver()->startStream(); + _debug("AudioRtp::createNewSession: starting RTX thread\n"); if (_RTXThread->start() != 0) { return -1; } @@ -144,13 +145,12 @@ AudioRtpRTX::initAudioRtpSession (void) _debug("RTP: Target IP address [%s] is not correct!\n", _ca->getRemoteSdpAudioIp()); exit(); } else { - _debug("RTP: Sending to %s : %d\n", _ca->getRemoteSdpAudioIp(), - _ca->getRemoteSdpAudioPort()); + _debug("RTP: Sending to %s : %d\n", _ca->getRemoteSdpAudioIp(), _ca->getRemoteSdpAudioPort()); } // Initialization if (!_sym) { - _sessionRecv->setSchedulingTimeout (100000); + //_sessionRecv->setSchedulingTimeout (10000); _sessionRecv->setExpireTimeout(1000000); _sessionSend->setSchedulingTimeout(10000); @@ -172,20 +172,19 @@ AudioRtpRTX::initAudioRtpSession (void) (unsigned short) _ca->getRemoteSdpAudioPort()); } - _sessionRecv->setPayloadFormat(StaticPayloadFormat( - (StaticPayloadType) _ca->payload)); - _sessionSend->setPayloadFormat(StaticPayloadFormat( - (StaticPayloadType) _ca->payload)); + //setPayloadFormat(StaticPayloadFormat(sptPCMU)); + _debug("Payload Format: %d\n", _ca->payload); + _sessionRecv->setPayloadFormat(StaticPayloadFormat((StaticPayloadType) _ca->payload)); + _sessionSend->setPayloadFormat(StaticPayloadFormat((StaticPayloadType) _ca->payload)); + setCancel(cancelImmediate); _sessionSend->setMark(true); } else { - if (!_session->addDestination (remote_ip, - (unsigned short) _ca->getRemoteSdpAudioPort())) { + if (!_session->addDestination (remote_ip, (unsigned short) _ca->getRemoteSdpAudioPort())) { exit(); } else { - _session->setPayloadFormat(StaticPayloadFormat( - (StaticPayloadType) _ca->payload)); + _session->setPayloadFormat(StaticPayloadFormat((StaticPayloadType) _ca->payload)); setCancel(cancelImmediate); } } @@ -246,8 +245,9 @@ AudioRtpRTX::receiveSessionForSpkr (int16* data_for_speakers, const AppDataUnit* adu = NULL; // Get audio data stream + do { - Thread::sleep(5); // in msec. + Thread::sleep(5); // in msec. if (!_sym) { adu = _sessionRecv->getData(_sessionRecv->getFirstTimestamp()); } else { @@ -286,8 +286,10 @@ AudioRtpRTX::receiveSessionForSpkr (int16* data_for_speakers, Manager::instance().notificationIncomingCall(); } } + Manager::instance().getAudioDriver()->startStream(); + delete cd; delete adu; } @@ -322,14 +324,14 @@ AudioRtpRTX::run (void) { // start running the packet queue scheduler. if (!_sym) { _sessionRecv->startRunning(); - _sessionSend->startRunning(); + _sessionSend->startRunning(); } else { _session->startRunning(); } while (_ca->enable_audio != -1) { micVolume = Manager::instance().getMicroVolume(); - spkrVolume = Manager::instance().getSpkrVolume(); + spkrVolume = Manager::instance().getSpkrVolume(); //////////////////////////// // Send session diff --git a/src/audio/tonegenerator.cpp b/src/audio/tonegenerator.cpp index 00a0ff785..79c180dd5 100644 --- a/src/audio/tonegenerator.cpp +++ b/src/audio/tonegenerator.cpp @@ -58,6 +58,7 @@ ToneThread::run (void) { // How long do 'size' samples play ? unsigned int play_time = (size * 1000) / SAMPLING_RATE; + unsigned int pause = (size) / SAMPLING_RATE; while (Manager::instance().getZonetone()) { @@ -79,7 +80,7 @@ ToneThread::run (void) { } // next iteration later, sound is playing. - this->sleep (play_time); + this->sleep (pause); } } @@ -330,8 +331,8 @@ ToneGenerator::playRingtone (const char *fileName) { file.seekg (0, ios::beg); // allocate memory: - src = new char [length]; - dst = new short[length*2]; + src = new char [length]; + dst = new short[length*2]; // read data as a block: file.read (src,length); diff --git a/src/gui/guiframework.cpp b/src/gui/guiframework.cpp index 1612dc095..adafcec02 100644 --- a/src/gui/guiframework.cpp +++ b/src/gui/guiframework.cpp @@ -146,10 +146,10 @@ GuiFramework::unregisterVoIPLink (void) } } -void +bool GuiFramework::sendDtmf (short id, char code) { - Manager::instance().sendDtmf(id, code); + return Manager::instance().sendDtmf(id, code); } int diff --git a/src/gui/guiframework.h b/src/gui/guiframework.h index d28443668..851d4e397 100644 --- a/src/gui/guiframework.h +++ b/src/gui/guiframework.h @@ -65,7 +65,7 @@ public: int quitApplication (void); int sendTextMessage (short id, const std::string& message); int accessToDirectory (void); - void sendDtmf (short id, char code); + bool sendDtmf (short id, char code); protected: std::string _message; diff --git a/src/gui/server/Makefile.am b/src/gui/server/Makefile.am index 6f15a4e04..1e58064d9 100644 --- a/src/gui/server/Makefile.am +++ b/src/gui/server/Makefile.am @@ -1,8 +1,8 @@ noinst_LTLIBRARIES = libsflphoneguiserver.la libsflphoneguiserver_la_SOURCES = $(BUILT_SOURCES) guiserverimpl.cpp \ - responsemessage.cpp request.cpp requestfactory.cpp argtokenizer.cpp tcpsessionio.cpp \ - requestmanager.cpp + responsemessage.cpp request.cpp requestfactory.cpp argtokenizer.cpp tcpsessionio.cpp \ + requestmanager.cpp sessionio.cpp tcpstreampool.cpp libsflphoneguiserver_la_CXXFLAGS = -DPREFIX=\"$(prefix)\" -DPROGSHAREDIR=\"${datadir}/sflphone\" libsflphoneguiserver_la_LIBADD = @@ -10,4 +10,5 @@ libsflphoneguiserver_la_LIBADD = AM_CPPFLAGS = -I$(top_srcdir) $(libccext2_CFLAGS) noinst_HEADERS = responsemessage.h request.h requestfactory.h subcall.h \ - argtokenizer.h tcpsessionio.h requestmanager.h guiserver.h guiserverimpl.h + argtokenizer.h tcpsessionio.h requestmanager.h guiserver.h guiserverimpl.h sessionio.h \ + tcpsessionio.h tcpstreampool.h diff --git a/src/gui/server/requestmanager.cpp b/src/gui/server/requestmanager.cpp index d38f78b35..2dccf5d72 100644 --- a/src/gui/server/requestmanager.cpp +++ b/src/gui/server/requestmanager.cpp @@ -21,6 +21,7 @@ #include #include "tcpsessionio.h" +#include "../../global.h" RequestManager::RequestManager() : _sessionIO(0) { @@ -56,10 +57,10 @@ RequestManager::exec() // std::cin.good() is only there to close the server when // we do a CTRL+D - while(std::cin.good()) { + while(_sessionIO->good() && std::cin.good()) { if (_sessionIO->receive(input)) { - + _debug("Receive Input...: %s\n", input.c_str()); request = _factory.create(input); outputResponse = request->execute(); @@ -122,6 +123,7 @@ RequestManager::flushWaitingRequest() void RequestManager::sendResponse(const ResponseMessage& response) { if (_sessionIO) { + _debug("Sending output...\n"); _sessionIO->send(response.toString()); } diff --git a/src/gui/server/tcpsessionio.cpp b/src/gui/server/tcpsessionio.cpp index ad7ceb495..1d909be05 100644 --- a/src/gui/server/tcpsessionio.cpp +++ b/src/gui/server/tcpsessionio.cpp @@ -10,8 +10,6 @@ // // #include "tcpsessionio.h" -#include "../../global.h" - const int TCPSessionIO::PORT = 3999; const char * const TCPSessionIO::IP = "127.0.0.1"; @@ -36,10 +34,8 @@ bool TCPSessionIO::good() { if (_clientStream) { // just in case - _debug("_clientStream->good() == %d\n", _clientStream->good()); return _clientStream->good(); } - _debug("_clientStream doesn't exists yet..."); return false; } diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp index 34b2c4d25..7998a1ef6 100644 --- a/src/managerimpl.cpp +++ b/src/managerimpl.cpp @@ -517,26 +517,25 @@ ManagerImpl::accessToDirectory (void) return 1; } -int +bool ManagerImpl::sendDtmf (short id, char code) { - int sendType = get_config_fields_int(SIGNALISATION, SEND_DTMF_AS); - - switch (sendType) { + int sendType = get_config_fields_int(SIGNALISATION, SEND_DTMF_AS); + switch (sendType) { // SIP INFO case 0: _voIPLinkVector.at(DFT_VOIP_LINK)->carryingDTMFdigits(id, code); - return 1; + return true; break; // Audio way case 1: - return 1; + return false; break; // rfc 2833 case 2: - return 1; + return false; break; default: diff --git a/src/managerimpl.h b/src/managerimpl.h index 8c89673e5..05c7ae480 100644 --- a/src/managerimpl.h +++ b/src/managerimpl.h @@ -164,9 +164,9 @@ public: * Handle choice of the DTMF-send-way * * @param id: callid of the line. - * @param code: pressed key. + * @param code: pressed key. */ - int sendDtmf (short id, char code); + bool sendDtmf (short id, char code); int incomingCall (short id); diff --git a/src/sipcall.cpp b/src/sipcall.cpp index 3d16b798f..89ced7fec 100644 --- a/src/sipcall.cpp +++ b/src/sipcall.cpp @@ -36,16 +36,24 @@ using namespace std; SipCall::SipCall (short id, CodecDescriptorVector* cdv) { - _id = id; // Same id of Call object - _cid = 0; // call id, from the sipvoiplink - _did = 0; // dialog id - _tid = 0; // transaction id + _id = id; // Same id of Call object + _cid = 0; // call id, from the sipvoiplink + _did = 0; // dialog id + _tid = 0; // transaction id - alloc(); - _cdv = cdv; - _audiocodec = NULL; - _standby = false; - enable_audio = -1; + _standby = false; + _status_code = 0; + + alloc(); // char* allocation + _cdv = cdv; + _audiocodec = NULL; + enable_audio = -1; + + _state = 0; + _local_audio_port = 0; + _remote_sdp_audio_port = 0; + _local_sendrecv = 0; /* _SENDRECV, _SENDONLY, _RECVONLY */ + _remote_sendrecv = 0; } @@ -558,80 +566,83 @@ SipCall::answeredCall(eXosip_event_t *event) { void SipCall::answeredCall_without_hold (eXosip_event_t *event) { - SipCall *ca = this; + SipCall *ca = this; + + if (ca->enable_audio == 1 && event->response != NULL) { + sdp_message_t *sdp = eXosip_get_sdp_info (event->response); + if (sdp != NULL) { + /* audio is started and session has just been modified */ + ca->enable_audio = -1; + sdp_message_free (sdp); + } + } + + if (ca->enable_audio != 1) { /* audio is started */ + sdp_connection_t *conn; + sdp_media_t *remote_med; + char *tmp = NULL; + + sdp_message_t *local_sdp = eXosip_get_sdp_info (event->request); + sdp_message_t *remote_sdp = eXosip_get_sdp_info (event->response); + + if (remote_sdp == NULL) { + _debug("No remote SDP body found for call\n"); + /* TODO: remote_sdp = retreive from ack above */ + } else { + + conn = eXosip_get_audio_connection (remote_sdp); + if (conn != NULL && conn->c_addr != NULL) { + snprintf (_remote_sdp_audio_ip, 49, "%s", conn->c_addr); + } + remote_med = eXosip_get_audio_media (remote_sdp); + if (remote_med != NULL && remote_med->m_port != NULL) { + _remote_sdp_audio_port = atoi (remote_med->m_port); + } + + if (_remote_sdp_audio_port > 0 && _remote_sdp_audio_ip[0] != '\0' && + remote_med != NULL) { + tmp = (char *) osip_list_get (remote_med->m_payloads, 0); + } + + if (tmp != NULL) { + ca->payload = atoi (tmp); + _debug("For outgoing call: ca->payload = %d\n", ca->payload); + setAudioCodec(_cdv->at(0)->alloc(ca->payload, "")); + } - if (ca->enable_audio == 1 && event->response != NULL) { - sdp_message_t *sdp = eXosip_get_sdp_info (event->response); - if (sdp != NULL) { - /* audio is started and session has just been modified */ - ca->enable_audio = -1; - sdp_message_free (sdp); - } } - if (ca->enable_audio != 1) { /* audio is started */ - sdp_message_t *remote_sdp; - sdp_message_t *local_sdp; + if (local_sdp == NULL) { + _debug("SDP body was probably in the ACK (TODO)\n"); + } - local_sdp = eXosip_get_sdp_info (event->request); - remote_sdp = eXosip_get_sdp_info (event->response); - if (remote_sdp == NULL) { - _debug("No remote SDP body found for call\n"); - /* TODO: remote_sdp = retreive from ack above */ + if (remote_sdp != NULL && local_sdp != NULL) { + sdp_media_t *local_med; + int audio_port = 0; + + local_med = eXosip_get_audio_media (local_sdp); + if (local_med != NULL && local_med->m_port != NULL) { + audio_port = atoi (local_med->m_port); + } + + if (tmp != NULL && audio_port > 0 + && _remote_sdp_audio_port > 0 + && _remote_sdp_audio_ip[0] != '\0') { + + /* search if stream is sendonly or recvonly */ + _remote_sendrecv = sdp_analyse_attribute (remote_sdp, remote_med); + _local_sendrecv = sdp_analyse_attribute (local_sdp, local_med); + if (_local_sendrecv == _SENDRECV) { + if (_remote_sendrecv == _SENDONLY) + _local_sendrecv = _RECVONLY; + else if (_remote_sendrecv == _RECVONLY) + _local_sendrecv = _SENDONLY; } - if (local_sdp == NULL) { - _debug("SDP body was probably in the ACK (TODO)\n"); - } - - if (remote_sdp != NULL && local_sdp != NULL) { - sdp_connection_t *conn; - sdp_media_t *local_med; - sdp_media_t *remote_med; - char *tmp = NULL; - int audio_port = 0; - - conn = eXosip_get_audio_connection (remote_sdp); - if (conn != NULL && conn->c_addr != NULL) { - snprintf (_remote_sdp_audio_ip, 49, "%s", conn->c_addr); - } - remote_med = eXosip_get_audio_media (remote_sdp); - if (remote_med != NULL && remote_med->m_port != NULL) { - _remote_sdp_audio_port = atoi (remote_med->m_port); - } - local_med = eXosip_get_audio_media (local_sdp); - if (local_med != NULL && local_med->m_port != NULL) { - audio_port = atoi (local_med->m_port); - } - - if (_remote_sdp_audio_port > 0 - && _remote_sdp_audio_ip[0] != '\0' && remote_med != NULL) { - tmp = (char *) osip_list_get (remote_med->m_payloads, 0); - } - if (tmp != NULL) { - ca->payload = atoi (tmp); - _debug("For outgoing call: ca->payload = %d\n", ca->payload); - setAudioCodec(_cdv->at(0)->alloc(ca->payload, "")); - } - if (tmp != NULL - && audio_port > 0 - && _remote_sdp_audio_port > 0 - && _remote_sdp_audio_ip[0] != '\0') { - - /* search if stream is sendonly or recvonly */ - _remote_sendrecv = - sdp_analyse_attribute (remote_sdp, remote_med); - _local_sendrecv = sdp_analyse_attribute (local_sdp, local_med); - if (_local_sendrecv == _SENDRECV) { - if (_remote_sendrecv == _SENDONLY) - _local_sendrecv = _RECVONLY; - else if (_remote_sendrecv == _RECVONLY) - _local_sendrecv = _SENDONLY; - } - } - } - sdp_message_free (local_sdp); - sdp_message_free (remote_sdp); - } + } + } + sdp_message_free (local_sdp); + sdp_message_free (remote_sdp); + } } int @@ -773,18 +784,24 @@ SipCall::sdp_analyse_attribute (sdp_message_t * sdp, sdp_media_t * med) void SipCall::alloc(void) { - this->_reason_phrase = new char[50]; - this->_textinfo = new char[256]; - this->_remote_uri = new char[256]; - this->_remote_sdp_audio_ip = new char[50]; + this->_reason_phrase = new char[50]; + this->_textinfo = new char[256]; + this->_remote_uri = new char[256]; + this->_remote_sdp_audio_ip = new char[50]; + + // initialize the strings... + this->_reason_phrase[0] = '\0'; + this->_textinfo[0] = '\0'; + this->_remote_uri[0] = '\0'; + strcpy(this->_remote_sdp_audio_ip, "0.0.0.0"); } void SipCall::dealloc(void) { - delete _reason_phrase; - delete _textinfo; - delete _remote_uri; - delete _remote_sdp_audio_ip; + delete [] _reason_phrase; + delete [] _textinfo; + delete [] _remote_uri; + delete [] _remote_sdp_audio_ip; } void diff --git a/src/sipcall.h b/src/sipcall.h index 4d29732a6..53440b6a9 100644 --- a/src/sipcall.h +++ b/src/sipcall.h @@ -120,24 +120,24 @@ private: CodecDescriptorVector* _cdv; AudioCodec* _audiocodec; - short _id; - int _cid; // call id - int _did; // dialog id - int _tid; // transaction id - bool _standby; // wait for a cid and did when outgoing call is made - - int _status_code; - - char* _reason_phrase; - char* _textinfo; - char* _remote_uri; - - char* _remote_sdp_audio_ip; - int _state; - int _local_audio_port; - int _remote_sdp_audio_port; - int _local_sendrecv; /* _SENDRECV, _SENDONLY, _RECVONLY */ - int _remote_sendrecv; /* _SENDRECV, _SENDONLY, _RECVONLY */ + short _id; + int _cid; // call id + int _did; // dialog id + int _tid; // transaction id + bool _standby; // wait for a cid and did when outgoing call is made + + int _status_code; + + char* _reason_phrase; + char* _textinfo; + char* _remote_uri; + + char* _remote_sdp_audio_ip; + int _state; + int _local_audio_port; + int _remote_sdp_audio_port; + int _local_sendrecv; /* _SENDRECV, _SENDONLY, _RECVONLY */ + int _remote_sendrecv; /* _SENDRECV, _SENDONLY, _RECVONLY */ }; #endif // __SIP_CALL_H__ diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp index fd66502af..ca4bf71d1 100644 --- a/src/sipvoiplink.cpp +++ b/src/sipvoiplink.cpp @@ -135,6 +135,7 @@ SipVoIPLink::terminate(void) int SipVoIPLink::setRegister (void) { + _debug("SipVoIPLink::setRegister()\n"); int i; osip_message_t *reg = NULL; @@ -410,6 +411,7 @@ SipVoIPLink::onhold (short id) sdp_message_free (local_sdp); if (i != 0) { osip_message_free (invite); + osip_free (tmp); return -1; } osip_message_set_body (invite, tmp, strlen (tmp)); @@ -469,6 +471,7 @@ SipVoIPLink::offhold (short id) sdp_message_free (local_sdp); if (i != 0) { osip_message_free (invite); + osip_free (tmp); return -1; } osip_message_set_body (invite, tmp, strlen (tmp)); @@ -545,9 +548,10 @@ SipVoIPLink::getEvent (void) if (event == NULL) { return -1; - } + } + + _debug("GetEvent : %d\n", event->type); - Manager::instance().displayErrorText(event->type, "getEvent"); switch (event->type) { // IP-Phone user receives a new call case EXOSIP_CALL_INVITE: // @@ -691,18 +695,26 @@ SipVoIPLink::getEvent (void) return -1; } break; + case EXOSIP_CALL_RELEASED: + id = findCallIdInitial(event); + _debug("Id Released: %d\n", id); + //TODO: find the id... + //Manager::instance().displayErrorText(0, "getEvent:CallReleased"); + break; case EXOSIP_CALL_REQUESTFAILURE: id = findCallId(event); // Handle 4XX errors switch (event->response->status_code) { case AUTH_REQUIRED: + _debug("EXOSIP_CALL_REQUESTFAILURE :: AUTH_REQUIRED\n"); eXosip_lock(); eXosip_automatic_action(); eXosip_unlock(); break; case UNAUTHORIZED: + _debug("EXOSIP_CALL_REQUESTFAILURE :: UNAUTHORIZED\n"); setAuthentication(); break; @@ -757,7 +769,7 @@ SipVoIPLink::getEvent (void) break; case EXOSIP_REGISTRATION_FAILURE: // 2 - Manager::instance().displayError("getEvent:Registration Failure"); + Manager::instance().displayError("getEvent : Registration Failure\n"); break; case EXOSIP_MESSAGE_NEW: @@ -828,13 +840,8 @@ SipVoIPLink::getEvent (void) } break; - case EXOSIP_CALL_RELEASED: - //TODO: find the id... - Manager::instance().displayErrorText(0, "getEvent:CallReleased"); - - break; default: - Manager::instance().displayErrorText(event->type, "getEvent:default"); + //Manager::instance().displayErrorText(event->type, "getEvent:default"); return -1; break; } @@ -979,6 +986,7 @@ SipVoIPLink::sdp_hold_call (sdp_message_t * sdp) /* we need to add a global attribute with a field set to "sendonly" */ sdp_message_a_attribute_add (sdp, -1, osip_strdup ("sendonly"), NULL); } + return 0; } @@ -1138,7 +1146,7 @@ SipVoIPLink::getLocalIp (void) char* myIPAddress = new char[65]; ret = eXosip_guess_localip (2, myIPAddress, 64); setLocalIpAddress(std::string(myIPAddress)); - delete [] myIPAddress; + delete [] myIPAddress; return ret; } @@ -1251,7 +1259,6 @@ SipVoIPLink::startCall (short id, const string& from, const string& to, if (i != 0) { return -1; // error when building the invite } - int payload; unsigned int nb; @@ -1277,10 +1284,14 @@ SipVoIPLink::startCall (short id, const string& from, const string& to, snprintf(rtpmap, 127, "a=rtpmap: %d %s/%d\r\n", payload, Manager::instance().getCodecDescVector()->at(i)->rtpmapPayload(payload).data(), SAMPLING_RATE); - strcat(rtpmap_attr, rtpmap); + strcat(rtpmap_attr, rtpmap); } } + // http://www.antisip.com/documentation/eXosip2/group__howto1__initialize.html + // tell sip if we support SIP extension like 100rel + // osip_message_set_supported (invite, "100rel"); + /* add sdp body */ { char tmp[4096]; @@ -1294,9 +1305,10 @@ SipVoIPLink::startCall (short id, const string& from, const string& to, "c=IN IP4 %s\r\n" "t=0 0\r\n" "m=audio %s RTP/AVP %s\r\n" - "%s", + "%s", localip, localip, port, media_audio, rtpmap_attr); - + // media_audio should be one, two or three numbers? + _debug("%s %d", tmp, strlen(tmp)); osip_message_set_body (invite, tmp, strlen (tmp)); osip_message_set_content_type (invite, "application/sdp"); }