From 34355a3f57bbc1f421fc200d34fb0e2599621918 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Wed, 13 Aug 2008 13:56:24 +0000 Subject: Ticket #594: Improvements in PocketPJ Windows Mobile application: added TCP option, VAD option, option to select codec priority order, and auto-answer option git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2211 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip-apps/src/pocketpj/PocketPJ.rc | 46 +++++---- pjsip-apps/src/pocketpj/PocketPJ.vcc | 46 +++++---- pjsip-apps/src/pocketpj/PocketPJDlg.cpp | 50 ++++++++-- pjsip-apps/src/pocketpj/SettingsDlg.cpp | 159 +++++++++++++++++++++++++++----- pjsip-apps/src/pocketpj/SettingsDlg.h | 10 ++ pjsip-apps/src/pocketpj/resource.h | 6 +- 6 files changed, 244 insertions(+), 73 deletions(-) (limited to 'pjsip-apps') diff --git a/pjsip-apps/src/pocketpj/PocketPJ.rc b/pjsip-apps/src/pocketpj/PocketPJ.rc index 4e551723..f5488fdb 100644 --- a/pjsip-apps/src/pocketpj/PocketPJ.rc +++ b/pjsip-apps/src/pocketpj/PocketPJ.rc @@ -79,7 +79,7 @@ IDI_INVISIBLE ICON DISCARDABLE "res\\invisibl.ico" // Dialog // -IDD_POCKETPJ_DIALOG DIALOG DISCARDABLE 0, 0, 139, 151 +IDD_POCKETPJ_DIALOG DIALOGEX 0, 0, 139, 151 STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION EXSTYLE WS_EX_APPWINDOW | 0x80000000L CAPTION "PocketPJ" @@ -87,7 +87,7 @@ FONT 8, "System" BEGIN LTEXT "sip:user@pjsip.lab",IDC_ACC_ID,22,5,115,8 CONTROL 135,IDC_BTN_ACC,"Static",SS_BITMAP | SS_NOTIFY | - WS_TABSTOP,7,3,12,11 + WS_BORDER | WS_TABSTOP,7,3,12,11 CONTROL "List1",IDC_BUDDY_LIST,"SysListView32",LVS_SMALLICON | LVS_SINGLESEL | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,7,35,127,109 @@ -97,33 +97,43 @@ BEGIN WS_BORDER,125,16,12,11 END -IDD_SETTING DIALOG DISCARDABLE 0, 0, 140, 127 +IDD_SETTING DIALOG DISCARDABLE 0, 0, 140, 143 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PocketPJ Settings.." FONT 8, "System" BEGIN - LTEXT "Domain:",IDC_STATIC,7,8,30,9 EDITTEXT IDC_DOMAIN,38,7,78,12,ES_AUTOHSCROLL EDITTEXT IDC_USER,38,21,78,12,ES_AUTOHSCROLL EDITTEXT IDC_PASSWD,38,35,78,12,ES_PASSWORD | ES_AUTOHSCROLL + EDITTEXT IDC_DNS,38,49,78,12,ES_AUTOHSCROLL + EDITTEXT IDC_STUN_SRV,56,64,77,12,ES_AUTOHSCROLL + CONTROL "ICE",IDC_ICE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,79, + 24,10 + CONTROL "TCP",IDC_TCP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33, + 79,24,10 + CONTROL "SRTP",IDC_SRTP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,61, + 79,29,10 + CONTROL "PUBLISH",IDC_PUBLISH,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,93,79,40,10 + CONTROL "EC, tail:",IDC_ECHO_SUPPRESS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,92,37,10 + EDITTEXT IDC_EC_TAIL,47,91,23,12,ES_AUTOHSCROLL + CONTROL "VAD",IDC_VAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,93, + 92,25,10 + COMBOBOX IDC_CODECS,59,105,42,39,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + PUSHBUTTON "OK",IDOK,17,122,50,14 + PUSHBUTTON "Cancel",IDCANCEL,73,122,50,14 + LTEXT "Domain:",IDC_STATIC,7,8,30,9 LTEXT "User:",IDC_STATIC,7,22,30,9 LTEXT "Passwd:",IDC_STATIC,7,36,30,9 CONTROL "STUN Srv:",IDC_STUN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,65,47,10 - EDITTEXT IDC_STUN_SRV,56,64,77,12,ES_AUTOHSCROLL - CONTROL "ICE",IDC_ICE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,79, - 27,10 - CONTROL "SRTP",IDC_SRTP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,47, - 79,33,10 - CONTROL "PUBLISH",IDC_PUBLISH,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,85,79,43,10 - EDITTEXT IDC_DNS,38,49,78,12,ES_AUTOHSCROLL LTEXT "DNS:",IDC_STATIC,8,50,30,9 - PUSHBUTTON "OK",IDOK,17,106,50,14 - PUSHBUTTON "Cancel",IDCANCEL,73,106,50,14 - CONTROL "Suppress echo, tail:",IDC_ECHO_SUPPRESS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,92,79,10 - EDITTEXT IDC_EC_TAIL,89,91,33,12,ES_AUTOHSCROLL + LTEXT "ms",IDC_STATIC,75,92,13,9 + LTEXT "Codec priority:",IDC_STATIC,7,107,49,9 + CONTROL "AA",IDC_AA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,107, + 107,25,10 END @@ -192,7 +202,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 133 TOPMARGIN, 7 - BOTTOMMARGIN, 120 + BOTTOMMARGIN, 136 END END #endif // APSTUDIO_INVOKED diff --git a/pjsip-apps/src/pocketpj/PocketPJ.vcc b/pjsip-apps/src/pocketpj/PocketPJ.vcc index 80c3c6f3..5320b2d3 100644 --- a/pjsip-apps/src/pocketpj/PocketPJ.vcc +++ b/pjsip-apps/src/pocketpj/PocketPJ.vcc @@ -12,9 +12,9 @@ Class1=CPocketPJApp Class2=CPocketPJDlg ResourceCount=5 -Resource2=IDD_SETTING +Resource2=IDR_ACC_MENU Resource3=IDD_POCKETPJ_DIALOG -Resource4=IDR_ACC_MENU +Resource4=IDD_SETTING Resource1=IDR_MAINFRAME Class3=CSettingsDlg Resource5=IDR_URI_MENU @@ -40,7 +40,7 @@ Type=1 Class=CPocketPJDlg ControlCount=6 Control1=IDC_ACC_ID,static,1342308352 -Control2=IDC_BTN_ACC,static,1342243086 +Control2=IDC_BTN_ACC,static,1350631694 Control3=IDC_BUDDY_LIST,SysListView32,1350631446 Control4=IDC_STATIC,static,1342308352 Control5=IDC_URL,edit,1350631552 @@ -66,24 +66,30 @@ CommandCount=3 [DLG:IDD_SETTING] Type=1 Class=CSettingsDlg -ControlCount=17 -Control1=IDC_STATIC,static,1342308352 -Control2=IDC_DOMAIN,edit,1350631552 -Control3=IDC_USER,edit,1350631552 -Control4=IDC_PASSWD,edit,1350631584 -Control5=IDC_STATIC,static,1342308352 -Control6=IDC_STATIC,static,1342308352 -Control7=IDC_STUN,button,1342242819 -Control8=IDC_STUN_SRV,edit,1350631552 -Control9=IDC_ICE,button,1342242819 -Control10=IDC_SRTP,button,1342242819 -Control11=IDC_PUBLISH,button,1342242819 -Control12=IDC_DNS,edit,1350631552 -Control13=IDC_STATIC,static,1342308352 +ControlCount=23 +Control1=IDC_DOMAIN,edit,1350631552 +Control2=IDC_USER,edit,1350631552 +Control3=IDC_PASSWD,edit,1350631584 +Control4=IDC_DNS,edit,1350631552 +Control5=IDC_STUN_SRV,edit,1350631552 +Control6=IDC_ICE,button,1342242819 +Control7=IDC_TCP,button,1342242819 +Control8=IDC_SRTP,button,1342242819 +Control9=IDC_PUBLISH,button,1342242819 +Control10=IDC_ECHO_SUPPRESS,button,1342242819 +Control11=IDC_EC_TAIL,edit,1350631552 +Control12=IDC_VAD,button,1342242819 +Control13=IDC_CODECS,combobox,1344339971 Control14=IDOK,button,1342242816 Control15=IDCANCEL,button,1342242816 -Control16=IDC_ECHO_SUPPRESS,button,1342242819 -Control17=IDC_EC_TAIL,edit,1350631552 +Control16=IDC_STATIC,static,1342308352 +Control17=IDC_STATIC,static,1342308352 +Control18=IDC_STATIC,static,1342308352 +Control19=IDC_STUN,button,1342242819 +Control20=IDC_STATIC,static,1342308352 +Control21=IDC_STATIC,static,1342308352 +Control22=IDC_STATIC,static,1342308352 +Control23=IDC_AA,button,1342242819 [CLS:CSettingsDlg] Type=0 @@ -92,5 +98,5 @@ ImplementationFile=SettingsDlg.cpp BaseClass=CDialog Filter=D VirtualFilter=dWC -LastObject=IDC_ECHO_SUPPRESS +LastObject=CSettingsDlg diff --git a/pjsip-apps/src/pocketpj/PocketPJDlg.cpp b/pjsip-apps/src/pocketpj/PocketPJDlg.cpp index b6b7e3fd..4f388b45 100644 --- a/pjsip-apps/src/pocketpj/PocketPJDlg.cpp +++ b/pjsip-apps/src/pocketpj/PocketPJDlg.cpp @@ -80,6 +80,7 @@ void CPocketPJDlg::Error(const CString &title, pj_status_t rc) BOOL CPocketPJDlg::Restart() { + unsigned i; pj_status_t status; char ver[80]; @@ -178,6 +179,7 @@ BOOL CPocketPJDlg::Restart() media_cfg.quality = 5; media_cfg.thread_cnt = 1; media_cfg.enable_ice = m_Cfg.m_UseIce; + media_cfg.no_vad = !m_Cfg.m_VAD; if (m_Cfg.m_EchoSuppress) { media_cfg.ec_options = PJMEDIA_ECHO_SIMPLE; @@ -195,7 +197,7 @@ BOOL CPocketPJDlg::Restart() } // Create one UDP transport - PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE3, "Add transport.."); + PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE3, "Adding UDP transport.."); pjsua_transport_id transport_id; pjsua_transport_config udp_cfg; @@ -210,16 +212,35 @@ BOOL CPocketPJDlg::Restart() return FALSE; } + if (m_Cfg.m_TCP) { + // Create one TCP transport + PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE3, "Adding TCP transport.."); + pjsua_transport_id transport_id; + pjsua_transport_config tcp_cfg; + + pjsua_transport_config_default(&tcp_cfg); + tcp_cfg.port = 0; + status = pjsua_transport_create(PJSIP_TRANSPORT_TCP, + &tcp_cfg, &transport_id); + if (status != PJ_SUCCESS) { + Error(_T("Error creating TCP transport"), status); + pjsua_destroy(); + PopUp_Hide(POPUP_REGISTRATION); + return FALSE; + } + } + // Adjust codecs priority pj_str_t tmp; - pjsua_codec_set_priority(pj_cstr(&tmp, "speex"), 0); - pjsua_codec_set_priority(pj_cstr(&tmp, "speex/8000"), 200); - pjsua_codec_set_priority(pj_cstr(&tmp, "GSM"), 180); - pjsua_codec_set_priority(pj_cstr(&tmp, "PCMU"), 160); - pjsua_codec_set_priority(pj_cstr(&tmp, "PCMA"), 150); - pjsua_codec_set_priority(pj_cstr(&tmp, "iLBC"), 0); - pjsua_codec_set_priority(pj_cstr(&tmp, "L16"), 0); - + pjsua_codec_set_priority(pj_cstr(&tmp, "*"), 0); + for (i=0; i<(unsigned)m_Cfg.m_Codecs.GetSize(); ++i) { + CString codec = m_Cfg.m_Codecs.GetAt(i); + char tmp_nam[80]; + + pj_unicode_to_ansi((LPCTSTR)codec, codec.GetLength(), + tmp_nam, sizeof(tmp_nam)); + pjsua_codec_set_priority(pj_cstr(&tmp, tmp_nam), 200-i); + } // Start! PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE3, "Starting.."); @@ -261,6 +282,15 @@ BOOL CPocketPJDlg::Restart() acc_cfg.srtp_secure_signaling = 0; acc_cfg.publish_enabled = m_Cfg.m_UsePublish; + char route[80]; + if (m_Cfg.m_TCP) { + snprintf(route, sizeof(route), "", domain); + acc_cfg.proxy[acc_cfg.proxy_cnt++] = pj_str(route); + } else { + snprintf(route, sizeof(route), "", domain); + acc_cfg.proxy[acc_cfg.proxy_cnt++] = pj_str(route); + } + status = pjsua_acc_add(&acc_cfg, PJ_TRUE, &m_PjsuaAccId); if (status != PJ_SUCCESS) { Error(_T("Invalid account settings"), status); @@ -366,6 +396,8 @@ void CPocketPJDlg::OnCallState() PopUp_Show(POPUP_CALL, "Incoming call..", ci.remote_info.ptr, "", "Answer", "Hangup", 0); pjsua_call_answer(0, 180, NULL, NULL); + if (m_Cfg.m_AutoAnswer) + OnPopUpButton(1); break; case PJSIP_INV_STATE_EARLY: /**< After response with To tag. */ case PJSIP_INV_STATE_CONNECTING:/**< After 2xx is sent/received. */ diff --git a/pjsip-apps/src/pocketpj/SettingsDlg.cpp b/pjsip-apps/src/pocketpj/SettingsDlg.cpp index af49a1eb..1357044a 100644 --- a/pjsip-apps/src/pocketpj/SettingsDlg.cpp +++ b/pjsip-apps/src/pocketpj/SettingsDlg.cpp @@ -4,6 +4,7 @@ #include "stdafx.h" #include "PocketPJ.h" #include "SettingsDlg.h" +#include #include #ifdef _DEBUG @@ -26,14 +27,31 @@ static char THIS_FILE[] = __FILE__; #define REG_BUDDY_X _T("Buddy%u") #define REG_ENABLE_EC _T("EnableEC") #define REG_EC_TAIL _T("ECTail") +#define REG_ENABLE_VAD _T("EnableVAD") +#define REG_ENABLE_TCP _T("EnableTCP") +#define REG_CODEC_CNT _T("CodecCnt") +#define REG_CODEC_X _T("Codec%u") +#define REG_AUTO_ANSWER _T("AutoAnswer") ///////////////////////////////////////////////////////////////////////////// // Settings CPocketPJSettings::CPocketPJSettings() : m_UseStun(FALSE), m_UseIce(FALSE), m_UseSrtp(FALSE), m_UsePublish(FALSE), - m_EchoSuppress(TRUE), m_EcTail(200) + m_EchoSuppress(TRUE), m_EcTail(200), m_TCP(FALSE), m_VAD(FALSE), + m_AutoAnswer(FALSE) { + /* Init codec list */ +#if defined(PJMEDIA_HAS_GSM_CODEC) && PJMEDIA_HAS_GSM_CODEC + m_Codecs.Add(_T("GSM")); +#endif +#if defined(PJMEDIA_HAS_G711_CODEC) && PJMEDIA_HAS_G711_CODEC + m_Codecs.Add(_T("PCMU")); + m_Codecs.Add(_T("PCMA")); +#endif +#if defined(PJMEDIA_HAS_SPEEX_CODEC) && PJMEDIA_HAS_SPEEX_CODEC + m_Codecs.Add(_T("Speex")); +#endif } // Load from registry @@ -76,21 +94,15 @@ void CPocketPJSettings::LoadRegistry() dwordVal = 0; if (key.QueryValue(dwordVal, REG_USE_STUN) == ERROR_SUCCESS) { m_UseStun = dwordVal != 0; - } else { - m_UseStun = 0; } if (key.QueryValue(dwordVal, REG_USE_ICE) == ERROR_SUCCESS) { m_UseIce = dwordVal != 0; - } else { - m_UseIce = 0; } if (key.QueryValue(dwordVal, REG_USE_SRTP) == ERROR_SUCCESS) { m_UseSrtp = dwordVal != 0; - } else { - m_UseSrtp = 0; } @@ -102,15 +114,26 @@ void CPocketPJSettings::LoadRegistry() cbData = sizeof(dwordVal); if (key.QueryValue(dwordVal, REG_ENABLE_EC) == ERROR_SUCCESS) { m_EchoSuppress = dwordVal != 0; - } else { - m_EchoSuppress = 1; } cbData = sizeof(dwordVal); if (key.QueryValue(dwordVal, REG_EC_TAIL) == ERROR_SUCCESS) { m_EcTail = dwordVal; - } else { - m_EcTail = 200; + } + + cbData = sizeof(dwordVal); + if (key.QueryValue(dwordVal, REG_ENABLE_TCP) == ERROR_SUCCESS) { + m_TCP = dwordVal != 0; + } + + cbData = sizeof(dwordVal); + if (key.QueryValue(dwordVal, REG_ENABLE_VAD) == ERROR_SUCCESS) { + m_VAD = dwordVal != 0; + } + + cbData = sizeof(dwordVal); + if (key.QueryValue(dwordVal, REG_AUTO_ANSWER) == ERROR_SUCCESS) { + m_AutoAnswer = dwordVal != 0; } m_BuddyList.RemoveAll(); @@ -132,6 +155,23 @@ void CPocketPJSettings::LoadRegistry() } } + DWORD codecCount = 0; + cbData = sizeof(dwordVal); + if (key.QueryValue(codecCount, REG_CODEC_CNT) == ERROR_SUCCESS) { + + m_Codecs.RemoveAll(); + + for (i=0; i m_Codecs; CArray m_BuddyList; CPocketPJSettings(); @@ -48,6 +52,7 @@ public: // Dialog Data //{{AFX_DATA(CSettingsDlg) enum { IDD = IDD_SETTING }; + CComboBox m_Codecs; CString m_Domain; BOOL m_ICE; CString m_Passwd; @@ -59,6 +64,9 @@ public: CString m_Dns; BOOL m_EchoSuppress; CString m_EcTail; + BOOL m_TCP; + BOOL m_VAD; + BOOL m_AutoAnswer; //}}AFX_DATA @@ -79,6 +87,8 @@ protected: //{{AFX_MSG(CSettingsDlg) afx_msg void OnStun(); afx_msg void OnEchoSuppress(); + afx_msg void OnSelchangeCodecs(); + virtual void OnOK(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; diff --git a/pjsip-apps/src/pocketpj/resource.h b/pjsip-apps/src/pocketpj/resource.h index 1ba70d33..85eefa2e 100644 --- a/pjsip-apps/src/pocketpj/resource.h +++ b/pjsip-apps/src/pocketpj/resource.h @@ -37,6 +37,10 @@ #define IDC_BUTTON1 1021 #define IDC_EC_TAIL 1021 #define IDC_BUTTON2 1022 +#define IDC_VAD 1022 +#define IDC_TCP 1023 +#define IDC_CODECS 1024 +#define IDC_AA 1025 #define IDS_CAP_ONLINE 32772 #define IDS_CAP_OFFLINE 32774 #define IDS_CAP_INVISIBLE 32776 @@ -61,7 +65,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 145 #define _APS_NEXT_COMMAND_VALUE 32796 -#define _APS_NEXT_CONTROL_VALUE 1023 +#define _APS_NEXT_CONTROL_VALUE 1025 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif -- cgit v1.2.3