diff --git a/ChangeLog b/ChangeLog index 49fc2a79a70dafdcc4ec5a92df87671561548316..883d5e73ba918df06c309e1058f5bb4f8593db22 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-12-07 Yan Morin + + * First implementation of IAX account in QT Gui + + * First implementation of sending sound (very unstable!) in iax + + * Handling incompatibilities in libosip2 ABI (2.2.2 -> 3.0.1) + Quick patch that should be remove after 3.0.1 is very stable and in + distribution + 2006-11-30 Yan Morin * Fix .spec problem on fedora core 6 diff --git a/Makefile.am b/Makefile.am index 0f8e9a312c83505ce0b6065faaa9c3f43633bd36..da47c8abea229f38d33b69ad11aaab63355ccdd6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3,6 +3,6 @@ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = libs src ringtones skins -EXTRA_DIST = m4/*.m4 tools/*.sh platform/* images/* +EXTRA_DIST = m4/*.m4 tools/*.sh platform/* images/* README.gentoo diff --git a/configure.ac b/configure.ac index 9af3a5ce1d25b0fecaf6b296492ad4670614b825..347a5dcbac170b399428539ff69fc80ab6d83e26 100644 --- a/configure.ac +++ b/configure.ac @@ -142,6 +142,12 @@ dnl AM_CONDITIONAL(USE_SAMPLERATE, test x$with_samplerate = xyes) dnl Check for GNU ccRTP PKG_PROG_PKG_CONFIG +LIBOSIP2_OSIPLISTNOPOINTER_MIN_VERSION=3.0.0 +PKG_CHECK_MODULES([libosip2], [libosip2 >= ${LIBOSIP2_OSIPLISTNOPOINTER_MIN_VERSION}], + [LIBOSIP2_CFLAGS=""], [LIBOSIP2_CFLAGS="-DLIBOSIP2_WITHPOINTER"]) +SIP_CFLAGS="$SIP_CFLAGS $LIBOSIP2_CFLAGS"; +AC_SUBST(SIP_CFLAGS) + LIBSAMPLERATE_MIN_VERSION=0.1.1 PKG_CHECK_MODULES(samplerate, samplerate >= ${LIBSAMPLERATE_MIN_VERSION}) SFLPHONE_CFLAGS="$SFLPHONE_CFLAGS $samplerate_CFLAGS" diff --git a/src/Makefile.am b/src/Makefile.am index 2beb3c8863bfbc246a5396a64347d0cd65fd1dbc..dfcbfcfd34fe430896bba2c95bb5a6bf5e3a00d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -33,7 +33,7 @@ sflphoned_SOURCES = eventthread.cpp main.cpp voIPLink.cpp \ sipvoiplink.cpp call.cpp sipcall.cpp \ $(IAXSOURCES) -sflphoned_CXXFLAGS = -DPREFIX=\"$(prefix)\" -DPROGSHAREDIR=\"${datadir}/sflphone\" $(ZEROCONFFLAGS) $(IAX_FLAGS) $(SFLPHONE_CFLAGS) +sflphoned_CXXFLAGS = -DPREFIX=\"$(prefix)\" -DPROGSHAREDIR=\"${datadir}/sflphone\" $(ZEROCONFFLAGS) $(IAX_FLAGS) $(SFLPHONE_CFLAGS) $(SIP_CFLAGS) #sflphoned_LDFLAGS = -static sflphoned_LDADD = ./libsflphone.la $(SFLPHONE_LIBS) $(ZEROCONFLIB) $(LIB_DNSSD) $(IAX_LIBS) $(EXOSIP_LIBS) diff --git a/src/gui/qt/ConfigurationPanel.ui b/src/gui/qt/ConfigurationPanel.ui index d48fb4706cb44f75b9ea00212588dd94da4f83b1..2e5d3ca14c2b7efb6fe3a9a3a79c79270f09223d 100644 --- a/src/gui/qt/ConfigurationPanel.ui +++ b/src/gui/qt/ConfigurationPanel.ui @@ -230,11 +230,9 @@ <cstring>unnamed</cstring> </property> <widget class="QLabel" row="0" column="0"> - <property name="name"> - <cstring>lblAuthorizationUsre</cstring> - </property> + <property name="name"><cstring>lblAuthorizationUser</cstring></property> <property name="text"> - <string>Authorization user</string> + <string>Authorization user</string> </property> </widget> <widget class="QLineEdit" row="1" column="0"> @@ -330,7 +328,7 @@ </spacer> <widget class="QPushButton"> <property name="name"> - <cstring>buttonRegister</cstring> + <cstring>buttonSIPRegister</cstring> </property> <property name="enabled"> <bool>true</bool> @@ -478,6 +476,126 @@ </vbox> </widget> </widget> + <widget class="QWidget"> + <property name="name"><cstring>IAXPage</cstring></property> + <attribute name="title"><string>IAX Authentication</string></attribute> + <widget class="QLayoutWidget"> + <property name="name"><cstring>IAXLayoutMain</cstring></property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>410</width> + <height>393</height> + </rect> + </property> + <vbox> + <property name="name"><cstring>IAXvboxName</cstring></property> + <property name="margin"><number>0</number></property> + <widget class="QGroupBox"> + <property name="name"><cstring>IAXgroupBoxName</cstring></property> + <property name="margin"><number>0</number></property> + <property name="title"><string></string></property> + <grid> + <property name="name"><cstring>unnamed</cstring></property> + <widget class="QComboBox" rows="0" column="0" rowspan="1" colspan="2"> + <property name="name"><cstring>cboIAXAccount</cstring></property> + <property name="currentItem"><number>0</number></property> + </widget> + <widget class="QLineEdit" row="0" column="2" rowspan="1" colspan="1"> + <property name="name"><cstring>IAXalias</cstring></property> + </widget> + </grid> + </widget> + <widget class="QGroupBox"> + <property name="name"><cstring>IAXgroupBoxAuth</cstring></property> + <property name="margin"><number>0</number></property> + <property name="title"><string></string></property> + <grid> + <property name="name"><cstring>unnamed</cstring></property> + <widget class="QLabel" row="0" column="0"> + <property name="name"><cstring>lblIAXhost</cstring></property> + <property name="text"><string>Host (ie: asterisk.domain.com)</string></property> + </widget> + <widget class="QLineEdit" row="1" column="0"> + <property name="name"><cstring>IAXhost</cstring></property> + </widget> + <widget class="QLabel" row="2" column="0"> + <property name="name"><cstring>lblIAXuser</cstring></property> + <property name="text"><string>Authorization user</string></property> + </widget> + <widget class="QLineEdit" row="3" column="0"> + <property name="name"><cstring>IAXuser</cstring></property> + </widget> + <widget class="QLabel" row="4" column="0"> + <property name="name"><cstring>lblIAXPass</cstring></property> + <property name="text"><string>Password</string></property> + </widget> + <widget class="QLineEdit" row="5" column="0"> + <property name="name"><cstring>IAXpass</cstring></property> + <property name="echoMode"><enum>Password</enum></property> + </widget> + </grid> + </widget> + <widget class="QLayoutWidget"> + <property name="name"><cstring>IAXLayoutChk</cstring></property> + <vbox> + <property name="name"><cstring>IAXvboxChk</cstring></property> + <widget class="QLayoutWidget"> + <property name="name"><cstring>IAXLayoutChk2</cstring></property> + <hbox> + <property name="name"><cstring>IAXhboxChk</cstring></property> + <widget class="QCheckBox"> + <property name="name"><cstring>chkIAXAutoregister</cstring></property> + <property name="text"><string>Auto-register</string></property> + <property name="checked"><bool>true</bool></property> + </widget> + <widget class="QCheckBox"> + <property name="name"><cstring>chkIAXEnable</cstring></property> + <property name="text"><string>Enable</string></property> + <property name="checked"><bool>true</bool></property> + </widget> + <spacer> + <property name="name"><cstring>unnamed</cstring></property> + <property name="orientation"><enum>Horizontal</enum></property> + <property name="sizeType"><enum>Expanding</enum></property> + <property name="sizeHint"> + <size> + <width>201</width> + <height>21</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"><cstring>buttonIAXRegister</cstring></property> + <property name="enabled"><bool>true</bool></property> + <property name="text"><string>IAXRegister</string></property> + </widget> + </hbox> + </widget> + <widget class="QLabel"> + <property name="name"><cstring>lblIAXError</cstring></property> + <property name="text"><string></string></property> + <property name="paletteForegroundColor"> + <color><red>255</red><green>0</green><blue>0</blue></color> + </property> + </widget> + <spacer> + <property name="name"><cstring>unnamed</cstring></property> + <property name="orientation"><enum>Vertical</enum></property> + <property name="sizeType"><enum>Expanding</enum></property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>21</height> + </size> + </property> + </spacer> + </vbox> + </widget> + </vbox> + </widget> + </widget> <widget class="QWidget"> <property name="name"> <cstring>DTMFPage</cstring> @@ -1453,6 +1571,12 @@ Montreal, Quebec H2T 1S6, Canada</p></string> <receiver>ConfigurationPanel</receiver> <slot>slotSIPAccountChange(int)</slot> </connection> + <connection> + <sender>cboIAXAccount</sender> + <signal>activated(int)</signal> + <receiver>ConfigurationPanel</receiver> + <slot>slotIAXAccountChange(int)</slot> + </connection> <connection> <sender>buttonOk</sender> <signal>clicked()</signal> @@ -1466,10 +1590,16 @@ Montreal, Quebec H2T 1S6, Canada</p></string> <slot>changeTabSlot()</slot> </connection> <connection> - <sender>buttonRegister</sender> + <sender>buttonSIPRegister</sender> + <signal>clicked()</signal> + <receiver>ConfigurationPanel</receiver> + <slot>slotSIPRegister()</slot> + </connection> + <connection> + <sender>buttonIAXRegister</sender> <signal>clicked()</signal> <receiver>ConfigurationPanel</receiver> - <slot>slotRegister()</slot> + <slot>slotIAXRegister()</slot> </connection> <connection> <sender>buttonTestSoundDriver</sender> @@ -1525,7 +1655,15 @@ Montreal, Quebec H2T 1S6, Canada</p></string> <tabstop>sipproxy</tabstop> <tabstop>chkAutoregister</tabstop> <tabstop>chkEnable</tabstop> - <tabstop>buttonRegister</tabstop> + <tabstop>buttonSIPRegister</tabstop> + <tabstop>cboIAXAccount</tabstop> + <tabstop>IAXalias</tabstop> + <tabstop>IAXhost</tabstop> + <tabstop>IAXuser</tabstop> + <tabstop>IAXpass</tabstop> + <tabstop>chkIAXAutoregister</tabstop> + <tabstop>chkIAXEnable</tabstop> + <tabstop>buttonIAXRegister</tabstop> <tabstop>buttonOk</tabstop> <tabstop>buttonCancel</tabstop> <tabstop>Tab_Signalisations</tabstop> @@ -1559,7 +1697,9 @@ Montreal, Quebec H2T 1S6, Canada</p></string> <slots> <slot>generate()</slot> <slot>slotSIPAccountChange(int)</slot> - <slot>slotRegister()</slot> + <slot>slotIAXAccountChange(int)</slot> + <slot>slotSIPRegister()</slot> + <slot>slotIAXRegister()</slot> <slot>slotRegisterReturn( bool, QString )</slot> <slot>slotTestSoundDriver()</slot> <slot>slotReloadSoundDriver()</slot> @@ -1580,9 +1720,12 @@ Montreal, Quebec H2T 1S6, Canada</p></string> <function access="private" specifier="non virtual">init()</function> <function access="private" specifier="non virtual">loadSIPAccount(int number)</function> <function access="private" specifier="non virtual">saveSIPAccount(int number)</function> + <function access="private" specifier="non virtual">loadIAXAccount(int number)</function> + <function access="private" specifier="non virtual">saveIAXAccount(int number)</function> </functions> <variables> <variable access="private">int lastSIPAccount;</variable> + <variable access="private">int lastIAXAccount;</variable> <variable access="private">int _cutStringCombo;</variable> <variable access="private">std::map < int, int > _deviceInMap</variable> <variable access="private">std::map < int, int > _deviceOutMap</variable> diff --git a/src/gui/qt/ConfigurationPanel.ui.h b/src/gui/qt/ConfigurationPanel.ui.h index 47348218f5a0346871f0b3d8eabc401e034cde61..54832125a437bbc81163c9c277a607e692940a32 100644 --- a/src/gui/qt/ConfigurationPanel.ui.h +++ b/src/gui/qt/ConfigurationPanel.ui.h @@ -56,6 +56,7 @@ void ConfigurationPanel::init() _cutStringCombo = 30; //DebugOutput::instance() << "ConfigurationPanel::init()\n"; lblError->hide(); + lblIAXError->hide(); Tab_Signalisations->show(); Tab_Audio->hide(); Tab_Preferences->hide(); @@ -126,11 +127,15 @@ ConfigurationPanel::generate() ringsChoice->setCurrentText(ConfigurationManager::instance().get(AUDIO_SECTION, AUDIO_RINGTONE)); // For signalisations tab + + // Account + QComboBox* cbo = 0; + int nbItem = 0; // Load account - QComboBox* cbo = cboSIPAccount; + cbo = cboSIPAccount; cbo->clear(); - int nbItem = 4; + nbItem = 4; for (int iItem = 0; iItem < nbItem; iItem++) { QString accountId = "SIP" + QString::number(iItem); QString aliasName = ConfigurationManager::instance().get(accountId, ACCOUNT_ALIAS); @@ -147,6 +152,28 @@ ConfigurationPanel::generate() } loadSIPAccount(0); + // Load IAX Account + cbo = cboIAXAccount; + cbo->clear(); + nbItem = 1; + for (int iItem = 0; iItem < nbItem; iItem++) { + QString accountId = "IAX" + QString::number(iItem); + QString aliasName = ConfigurationManager::instance().get(accountId, ACCOUNT_ALIAS); + if (aliasName != "") { + QString accountName; + if (aliasName.isEmpty()) { + accountName = QObject::tr("IAX Account #%1").arg(iItem+1); + } else { + if (aliasName.length() > 30) { + aliasName = aliasName.left(30) + "..."; + } + accountName = aliasName + " (" + QObject::tr("IAX Account #%1").arg(iItem+1) + ")"; + } + cbo->insertItem(accountName,iItem); + } + } + loadIAXAccount(0); + sendDTMFas->setCurrentItem(ConfigurationManager::instance().get(SIGNALISATION_SECTION, SIGNALISATION_SEND_DTMF_AS).toUInt()); playTones->setChecked(ConfigurationManager::instance().get(SIGNALISATION_SECTION, @@ -201,6 +228,7 @@ ConfigurationPanel::generate() void ConfigurationPanel::saveSlot() { saveSIPAccount(cboSIPAccount->currentItem()); + saveIAXAccount(cboIAXAccount->currentItem()); ConfigurationManager::instance().set(SIGNALISATION_SECTION, SIGNALISATION_PULSE_LENGTH, @@ -396,23 +424,36 @@ ConfigurationPanel::SkinChoice_selected( const QString & ) } void -ConfigurationPanel::slotRegister() +ConfigurationPanel::slotSIPRegister() { saveSIPAccount(cboSIPAccount->currentItem()); emit needRegister("SIP" + QString::number(cboSIPAccount->currentItem())); } +void +ConfigurationPanel::slotIAXRegister() +{ + saveIAXAccount(cboIAXAccount->currentItem()); + emit needRegister("IAX" + QString::number(cboIAXAccount->currentItem())); +} + void ConfigurationPanel::slotRegisterReturn( bool hasError, QString ) { + // here we check the current page... if (hasError) { lblError->setPaletteForegroundColor(red); // red lblError->setText(QObject::tr("Register failed")); + lblIAXError->setPaletteForegroundColor(red); // red + lblIAXError->setText(QObject::tr("Register failed")); } else { lblError->setPaletteForegroundColor(black); // black lblError->setText(QObject::tr("Register Succeed")); + lblIAXError->setPaletteForegroundColor(black); // black + lblIAXError->setText(QObject::tr("Register Succeed")); } lblError->show(); + lblIAXError->show(); } /** @@ -558,3 +599,64 @@ ConfigurationPanel::saveSIPAccount(int number) SIGNALISATION_STUN_SERVER, STUNserver->text()); } + +void +ConfigurationPanel::slotIAXAccountChange(int index) +{ + if (lastIAXAccount!=index) { + + QString account = "IAX" + QString::number(index); + + saveIAXAccount(lastIAXAccount); + loadIAXAccount(index); + lblIAXError->setText(""); + } +} + +void +ConfigurationPanel::loadIAXAccount(int number) +{ + QString account = "IAX" + QString::number(number); + QString type = ConfigurationManager::instance().get(account, ACCOUNT_TYPE); + + chkIAXAutoregister->setChecked(ConfigurationManager::instance() + .get(account,ACCOUNT_AUTO_REGISTER).toUInt()); + + chkIAXEnable->setChecked(ConfigurationManager::instance() + .get(account,ACCOUNT_ENABLE).toUInt()); + + QString aliasName = ConfigurationManager::instance().get(account, ACCOUNT_ALIAS); + IAXalias->setText(aliasName); + + IAXuser->setText(ConfigurationManager::instance().get(account,SIGNALISATION_IAXUSER)); + IAXpass->setText(ConfigurationManager::instance().get(account,SIGNALISATION_IAXPASS)); + IAXhost->setText(ConfigurationManager::instance().get(account,SIGNALISATION_IAXHOST)); + lastIAXAccount = number; +} + +void +ConfigurationPanel::saveIAXAccount(int number) +{ + QString account = "IAX" + QString::number(number); + QString aliasName = IAXalias->text(); + ConfigurationManager::instance().set(account, ACCOUNT_ALIAS, aliasName); + QString accountName; + if (aliasName.isEmpty()) { + accountName = QObject::tr("IAX Account #%1").arg(number+1); + } else { + if (aliasName.length() > 30) { + aliasName = aliasName.left(30) + "..."; + } + accountName = aliasName + " (" + QObject::tr("IAX Account #%1").arg(number+1) + ")"; + } + cboIAXAccount->changeItem(accountName, number); + ConfigurationManager::instance().set(account, SIGNALISATION_IAXUSER, IAXuser->text()); + ConfigurationManager::instance().set(account, SIGNALISATION_IAXPASS, IAXpass->text()); + ConfigurationManager::instance().set(account, SIGNALISATION_IAXHOST, IAXhost->text()); + ConfigurationManager::instance().set(account, + ACCOUNT_AUTO_REGISTER, + QString::number(chkAutoregister->isChecked())); + ConfigurationManager::instance().set(account, + ACCOUNT_ENABLE, + QString::number(chkEnable->isChecked())); +} diff --git a/src/gui/qt/globals.h b/src/gui/qt/globals.h index b2c6f7c9da2f93115a5765aac69ed538f6ae4a72..f21c293acb897c832bc2b5c0525c222e628ccb0f 100644 --- a/src/gui/qt/globals.h +++ b/src/gui/qt/globals.h @@ -48,6 +48,9 @@ #define SIGNALISATION_PLAY_TONES "DTMF.playTones" #define SIGNALISATION_PULSE_LENGTH "DTMF.pulseLength" #define SIGNALISATION_SEND_DTMF_AS "DTMF.sendDTMFas" +#define SIGNALISATION_IAXHOST "IAX.host" +#define SIGNALISATION_IAXPASS "IAX.pass" +#define SIGNALISATION_IAXUSER "IAX.user" #define ACCOUNT_DEFAULT_NAME "SIP0" #define ACCOUNT_TYPE "Account.type" diff --git a/src/iaxvoiplink.cpp b/src/iaxvoiplink.cpp index 4bb7fee18a4d113a5822aaef10eb98b0ec1bfb69..c6718e03dcae2a6cc6dc1c7e7d63b1a7df03e682 100644 --- a/src/iaxvoiplink.cpp +++ b/src/iaxvoiplink.cpp @@ -210,6 +210,19 @@ IAXVoIPLink::getEvent() } iax_event_free(event); } + + // send sound here + if(_currentCall != 0 && audiolayer != 0) { + int samples = audiolayer->canGetMic(); + if (samples != 0) { + int datalen = audiolayer->getMic(_sendDataEncoded, samples); + _debug("iax_send_voice(%p, %d, ,%d, %d)\n", _currentCall->getSession(), _currentCall->getFormat(), datalen, samples); + //if ( iax_send_voice(_currentCall->getSession(), _currentCall->getFormat(), (char*)_sendDataEncoded, datalen, samples) == -1) { + // // error sending voice + //} + } + } + // unlock mutex here _mutexIAX.leaveMutex(); //iaxRefreshRegistrations(); @@ -458,6 +471,7 @@ IAXVoIPLink::iaxHandleCallEvent(iax_event* event, IAXCall* call) case IAX_EVENT_HANGUP: Manager::instance().peerHungupCall(id); if (Manager::instance().isCurrentCall(id)) { + _currentCall = 0; audiolayer->stopStream(); // stop audio } @@ -468,6 +482,7 @@ IAXVoIPLink::iaxHandleCallEvent(iax_event* event, IAXCall* call) Manager::instance().peerHungupCall(id); if (Manager::instance().isCurrentCall(id)) { // stop audio + _currentCall = 0; audiolayer->stopStream(); } removeCall(id); @@ -487,6 +502,7 @@ IAXVoIPLink::iaxHandleCallEvent(iax_event* event, IAXCall* call) call->setFormat(event->ies.format); Manager::instance().peerAnsweredCall(id); + _currentCall = call; audiolayer->startStream(); // start audio here? } else { @@ -539,19 +555,19 @@ IAXVoIPLink::iaxHandleCallEvent(iax_event* event, IAXCall* call) nbSample = ( src_data.output_frames_gen > IAX__20S_48KHZ_MAX) ? IAX__20S_48KHZ_MAX : src_data.output_frames_gen; #ifdef DATAFORMAT_IS_FLOAT toAudioLayer = _floatBuffer48000; - #else + #else src_float_to_short_array(_floatBuffer48000, _dataAudioLayer, nbSample); - toAudioLayer = _dataAudioLayer; - #endif + toAudioLayer = _dataAudioLayer; + #endif } else { nbSample = nbInt16; #ifdef DATAFORMAT_IS_FLOAT - // convert _receiveDataDecoded to float inside _receiveData + // convert _receiveDataDecoded to float inside _receiveData src_short_to_float_array(_receiveDataDecoded, _floatBuffer8000, nbSample); - toAudioLayer = _floatBuffer8000; + toAudioLayer = _floatBuffer8000; #else - toAudioLayer = _receiveDataDecoded; // int to int + toAudioLayer = _receiveDataDecoded; // int to int #endif } audiolayer->putMain(toAudioLayer, nbSample * sizeof(SFLDataFormat)); diff --git a/src/iaxvoiplink.h b/src/iaxvoiplink.h index 091bdad089e93a566d0790aa5687168c86a8762c..8d95bf33869fb1648b689cf9dd43eceb948c0e86 100644 --- a/src/iaxvoiplink.h +++ b/src/iaxvoiplink.h @@ -139,6 +139,9 @@ private: /** Buffer for 8000hz samples for mic conversion */ int16* _intBuffer8000; + + /** Current IAX call pointer, used for sending, change when starting audio, switching */ + IAXCall* _currentCall; }; #endif diff --git a/src/sipcall.cpp b/src/sipcall.cpp index 5225ed1bc7e0a48c66f7cdb27558926f2f97e303..92dae7a9fd838bfe9c8ac3c3eff199e19a1f96dd 100644 --- a/src/sipcall.cpp +++ b/src/sipcall.cpp @@ -283,12 +283,12 @@ SIPCall::SIPCallAnswered(eXosip_event_t *event) * @return true if ok (change / no change) or false on error */ bool -SIPCall::SIPCallAnsweredWithoutHold(eXosip_event_t *event) +SIPCall::SIPCallAnsweredWithoutHold(eXosip_event_t* event) { if (event->response == NULL || event->request == NULL) { return false; } eXosip_lock(); - sdp_message_t *remote_sdp = eXosip_get_sdp_info (event->response); + sdp_message_t* remote_sdp = eXosip_get_sdp_info (event->response); eXosip_unlock(); if (remote_sdp == NULL) { _debug("SIP Failure: no remote sdp\n"); @@ -296,7 +296,7 @@ SIPCall::SIPCallAnsweredWithoutHold(eXosip_event_t *event) return false; } - sdp_media_t *remote_med = getRemoteMedia(event->tid, remote_sdp); + sdp_media_t* remote_med = getRemoteMedia(event->tid, remote_sdp); if (remote_med==NULL) { sdp_message_free(remote_sdp); return false; @@ -306,8 +306,11 @@ SIPCall::SIPCallAnsweredWithoutHold(eXosip_event_t *event) return false; } - char *tmp = (char *) osip_list_get (remote_med->m_payloads, 0); - +#ifdef LIBOSIP2_WITHPOINTER + char *tmp = (char*) osip_list_get (remote_med->m_payloads, 0); +#else + char *tmp = (char*) osip_list_get (&(remote_med->m_payloads), 0); +#endif setAudioCodec(0); if (tmp != NULL) { int payload = atoi (tmp); @@ -400,8 +403,15 @@ SIPCall::sdp_complete_message(sdp_message_t * remote_sdp, osip_message_t * msg) // for each medias int iMedia = 0; char *tmp = NULL; - while (!osip_list_eol(remote_sdp->m_medias, iMedia)) { - sdp_media_t *remote_med = (sdp_media_t *)osip_list_get(remote_sdp->m_medias, iMedia); + #ifdef LIBOSIP2_WITHPOINTER + const osip_list_t* remote_sdp_m_medias = remote_sdp->m_medias; // old abi + #else + const osip_list_t* remote_sdp_m_medias = &(remote_sdp->m_medias); + #endif + osip_list_t* remote_med_m_payloads = 0; + + while (!osip_list_eol(remote_sdp_m_medias, iMedia)) { + sdp_media_t *remote_med = (sdp_media_t *)osip_list_get(remote_sdp_m_medias, iMedia); if (remote_med == 0) { continue; } if (0 != osip_strcasecmp (remote_med->m_media, "audio")) { @@ -413,8 +423,14 @@ SIPCall::sdp_complete_message(sdp_message_t * remote_sdp, osip_message_t * msg) // search for compatible codec: foreach payload int iPayload = 0; - while (!osip_list_eol(remote_med->m_payloads, iPayload)) { - tmp = (char *)osip_list_get(remote_med->m_payloads, iPayload); + #ifdef LIBOSIP2_WITHPOINTER + remote_med_m_payloads = remote_med->m_payloads; // old abi + #else + remote_med_m_payloads = &(remote_med->m_payloads); + #endif + + while (!osip_list_eol(remote_med_m_payloads, iPayload)) { + tmp = (char *)osip_list_get(remote_med_m_payloads, iPayload); if (tmp!=NULL) { int payload = atoi(tmp); AudioCodec* audiocodec = _codecMap.getCodec((CodecType)payload); @@ -464,10 +480,15 @@ SIPCall::sdp_analyse_attribute (sdp_message_t * sdp, sdp_media_t * med) /* test media attributes */ pos = 0; - while (!osip_list_eol (med->a_attributes, pos)) { + #ifdef LIBOSIP2_WITHPOINTER + const osip_list_t* med_a_attributes = med->a_attributes; // old abi + #else + const osip_list_t* med_a_attributes = &(med->a_attributes); + #endif + while (!osip_list_eol (med_a_attributes, pos)) { sdp_attribute_t *at; - at = (sdp_attribute_t *) osip_list_get (med->a_attributes, pos); + at = (sdp_attribute_t *) osip_list_get (med_a_attributes, pos); if (at->a_att_field != NULL && 0 == strcmp (at->a_att_field, "sendonly")) { return _SENDONLY; @@ -484,10 +505,15 @@ SIPCall::sdp_analyse_attribute (sdp_message_t * sdp, sdp_media_t * med) /* test global attributes */ pos_media = -1; pos = 0; - while (!osip_list_eol (sdp->a_attributes, pos)) { + #ifdef LIBOSIP2_WITHPOINTER + const osip_list_t* sdp_a_attributes = sdp->a_attributes; // old abi + #else + const osip_list_t* sdp_a_attributes = &(sdp->a_attributes); + #endif + while (!osip_list_eol (sdp_a_attributes, pos)) { sdp_attribute_t *at; - at = (sdp_attribute_t *) osip_list_get (sdp->a_attributes, pos); + at = (sdp_attribute_t *) osip_list_get (sdp_a_attributes, pos); if (at->a_att_field != NULL && 0 == strcmp (at->a_att_field, "sendonly")) { return _SENDONLY; @@ -622,8 +648,13 @@ SIPCall::setAudioCodecFromSDP(sdp_media_t* remote_med, int tid) // Remote Payload char *tmp = NULL; int pos = 0; - while (!osip_list_eol (remote_med->m_payloads, pos)) { - tmp = (char *) osip_list_get (remote_med->m_payloads, pos); + #ifdef LIBOSIP2_WITHPOINTER + const osip_list_t* remote_med_m_payloads = remote_med->m_payloads; // old abi + #else + const osip_list_t* remote_med_m_payloads = &(remote_med->m_payloads); + #endif + while (!osip_list_eol (remote_med_m_payloads, pos)) { + tmp = (char *) osip_list_get (remote_med_m_payloads, pos); if (tmp != NULL ) { int payload = atoi(tmp); // stop if we find a correct codec