summaryrefslogtreecommitdiff
path: root/pjsip-apps/src/symbian_ua/ua.cpp
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2009-03-12 18:11:37 +0000
committerBenny Prijono <bennylp@teluu.com>2009-03-12 18:11:37 +0000
commit1dacdee696b7591a6dcc0b3c1d0f41573e473168 (patch)
tree302b09dcd989c0c05cf09f6aebaa63d870b421b9 /pjsip-apps/src/symbian_ua/ua.cpp
parentba9d8ca28eb209571c0bd6a080a8bb03d0fa2d33 (diff)
(Major) Task #737 and #738: integration of APS-Direct and Audiodev from aps-direct branch to trunk.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2506 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip-apps/src/symbian_ua/ua.cpp')
-rw-r--r--pjsip-apps/src/symbian_ua/ua.cpp281
1 files changed, 213 insertions, 68 deletions
diff --git a/pjsip-apps/src/symbian_ua/ua.cpp b/pjsip-apps/src/symbian_ua/ua.cpp
index 11adb154..033a2f2a 100644
--- a/pjsip-apps/src/symbian_ua/ua.cpp
+++ b/pjsip-apps/src/symbian_ua/ua.cpp
@@ -19,10 +19,12 @@
*/
#include <pjsua-lib/pjsua.h>
#include <pjsua-lib/pjsua_internal.h>
+//#include <pjmedia/symbian_sound_aps.h>
#include "ua.h"
#define THIS_FILE "symbian_ua.cpp"
-#define LOG_LEVEL 3
+#define CON_LOG_LEVEL 3 // console log level
+#define FILE_LOG_LEVEL 4 // logfile log level
//
// Basic config.
@@ -280,7 +282,7 @@ static pj_status_t app_startup()
pj_log_set_log_func(&log_writer);
/* Set log level */
- pj_log_set_level(LOG_LEVEL);
+ pj_log_set_level(CON_LOG_LEVEL);
/* Create pjsua first! */
status = pjsua_create();
@@ -328,23 +330,20 @@ static pj_status_t app_startup()
pjsua_logging_config_default(&log_cfg);
- log_cfg.level = LOG_LEVEL;
- log_cfg.console_level = LOG_LEVEL;
+ log_cfg.level = FILE_LOG_LEVEL;
+ log_cfg.console_level = CON_LOG_LEVEL;
log_cfg.cb = &log_writer;
- //log_cfg.log_filename = pj_str("C:\\data\\symbian_ua.log");
+ log_cfg.log_filename = pj_str("C:\\data\\symbian_ua.log");
pjsua_media_config_default(&med_cfg);
med_cfg.thread_cnt = 0; // Disable threading on Symbian
med_cfg.has_ioqueue = PJ_FALSE;
med_cfg.clock_rate = 8000;
-#if defined(PJMEDIA_SYM_SND_USE_APS) && (PJMEDIA_SYM_SND_USE_APS==1)
- med_cfg.audio_frame_ptime = 20;
-#else
med_cfg.audio_frame_ptime = 40;
-#endif
med_cfg.ec_tail_len = 0;
med_cfg.enable_ice = USE_ICE;
- med_cfg.snd_auto_close_time = 5; // wait for 5 seconds idle before sound dev get auto-closed
+ med_cfg.snd_auto_close_time = 0; // wait for 0 seconds idle before sound dev get auto-closed
+ //med_cfg.no_vad = PJ_TRUE;
status = pjsua_init(&cfg, &log_cfg, &med_cfg);
if (status != PJ_SUCCESS) {
@@ -491,87 +490,233 @@ void ConsoleUI::DoCancel()
con_->ReadCancel();
}
-static void PrintMenu()
+static void PrintMainMenu()
{
- PJ_LOG(3, (THIS_FILE, "\n\n"
- "Menu:\n"
- " d Dump states\n"
- " D Dump states detail\n"
- " P Dump pool factory\n"
- " l Start loopback audio device\n"
- " L Stop loopback audio device\n"
+ const char *menu =
+ "\n\n"
+ "Main Menu:\n"
+ " d Enable/disable codecs\n"
" m Call " SIP_DST_URI "\n"
" a Answer call\n"
" g Hangup all calls\n"
+ " t Toggle audio route\n"
+#if !defined(PJMEDIA_CONF_USE_SWITCH_BOARD) || PJMEDIA_CONF_USE_SWITCH_BOARD==0
+ " j Toggle loopback audio\n"
+#endif
+ "up/dn Increase/decrease output volume\n"
" s Subscribe " SIP_DST_URI "\n"
" S Unsubscribe presence\n"
" o Set account online\n"
" O Set account offline\n"
- " w Quit\n"));
+ " w Quit\n";
+
+ PJ_LOG(3, (THIS_FILE, menu));
}
-// Implementation: called when read has completed.
-void ConsoleUI::RunL()
+static void PrintCodecMenu()
{
- TKeyCode kc = con_->KeyCode();
- pj_bool_t reschedule = PJ_TRUE;
+ const char *menu =
+ "\n\n"
+ "Codec Menu:\n"
+ " a Enable all codecs\n"
+#if PJMEDIA_HAS_PASSTHROUGH_CODEC_AMR
+ " d Enable only AMR\n"
+#endif
+#if PJMEDIA_HAS_PASSTHROUGH_CODEC_G729
+ " g Enable only G.729\n"
+#endif
+#if PJMEDIA_HAS_PASSTHROUGH_CODEC_ILBC
+ " j Enable only iLBC\n"
+#endif
+ " m Enable only Speex\n"
+ " p Enable only GSM\n"
+ " t Enable only PCMU\n"
+ " w Enable only PCMA\n";
+ PJ_LOG(3, (THIS_FILE, menu));
+}
+
+static void HandleMainMenu(TKeyCode kc) {
switch (kc) {
- case 'w':
- CActiveScheduler::Stop();
- reschedule = PJ_FALSE;
- break;
- case 'D':
- case 'd':
- pjsua_dump(kc == 'D');
- break;
- case 'p':
- case 'P':
- pj_pool_factory_dump(pjsua_get_pool_factory(), PJ_TRUE);
- break;
- case 'l':
- pjsua_conf_connect(0, 0);
- break;
- case 'L':
- pjsua_conf_disconnect(0, 0);
- break;
- case 'm':
- if (g_call_id != PJSUA_INVALID_ID) {
- PJ_LOG(3,(THIS_FILE, "Another call is active"));
- break;
- }
- if (pjsua_verify_sip_url(SIP_DST_URI) == PJ_SUCCESS) {
- pj_str_t dst = pj_str(SIP_DST_URI);
- pjsua_call_make_call(g_acc_id, &dst, 0, NULL,
- NULL, &g_call_id);
+ case EKeyUpArrow:
+ case EKeyDownArrow:
+ {
+ unsigned vol;
+ pj_status_t status;
+
+ status = pjsua_snd_get_setting(
+ PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING, &vol);
+ if (status == PJ_SUCCESS) {
+ if (kc == EKeyUpArrow)
+ vol = PJ_MIN(100, vol+10);
+ else
+ vol = (vol>=10 ? vol-10 : 0);
+ status = pjsua_snd_set_setting(
+ PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING,
+ &vol, PJ_TRUE);
+ }
+
+ if (status == PJ_SUCCESS) {
+ PJ_LOG(3,(THIS_FILE, "Output volume set to %d", vol));
} else {
- PJ_LOG(3,(THIS_FILE, "Invalid SIP URI"));
+ pjsua_perror(THIS_FILE, "Error setting volume", status);
}
- break;
+ }
+ break;
+
+ case 't':
+ {
+ pjmedia_aud_dev_route route;
+ pj_status_t status;
+
+ status = pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE,
+ &route);
+
+ if (status == PJ_SUCCESS) {
+ if (route == PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER)
+ route = PJMEDIA_AUD_DEV_ROUTE_EARPIECE;
+ else
+ route = PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER;
+
+ status = pjsua_snd_set_setting(
+ PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE,
+ &route, PJ_TRUE);
+ }
+
+ if (status != PJ_SUCCESS)
+ pjsua_perror(THIS_FILE, "Error switch audio route", status);
+ }
+ break;
+
+ case 'j':
+ {
+ static pj_bool_t loopback_active = PJ_FALSE;
+ if (!loopback_active)
+ pjsua_conf_connect(0, 0);
+ else
+ pjsua_conf_disconnect(0, 0);
+ loopback_active = !loopback_active;
+ }
+ break;
+
+ case 'm':
+ if (g_call_id != PJSUA_INVALID_ID) {
+ PJ_LOG(3,(THIS_FILE, "Another call is active"));
+ break;
+ }
+
+ if (pjsua_verify_sip_url(SIP_DST_URI) == PJ_SUCCESS) {
+ pj_str_t dst = pj_str(SIP_DST_URI);
+ pjsua_call_make_call(g_acc_id, &dst, 0, NULL,
+ NULL, &g_call_id);
+ } else {
+ PJ_LOG(3,(THIS_FILE, "Invalid SIP URI"));
+ }
+ break;
case 'a':
- if (g_call_id != PJSUA_INVALID_ID)
- pjsua_call_answer(g_call_id, 200, NULL, NULL);
- break;
+ if (g_call_id != PJSUA_INVALID_ID)
+ pjsua_call_answer(g_call_id, 200, NULL, NULL);
+ break;
case 'g':
- pjsua_call_hangup_all();
- break;
+ pjsua_call_hangup_all();
+ break;
case 's':
case 'S':
- if (g_buddy_id != PJSUA_INVALID_ID)
- pjsua_buddy_subscribe_pres(g_buddy_id, kc=='s');
- break;
+ if (g_buddy_id != PJSUA_INVALID_ID)
+ pjsua_buddy_subscribe_pres(g_buddy_id, kc=='s');
+ break;
case 'o':
case 'O':
- pjsua_acc_set_online_status(g_acc_id, kc=='o');
- break;
+ pjsua_acc_set_online_status(g_acc_id, kc=='o');
+ break;
+
default:
- PJ_LOG(3,(THIS_FILE, "Keycode '%c' (%d) is pressed",
- kc, kc));
+ PJ_LOG(3,(THIS_FILE, "Keycode '%c' (%d) is pressed", kc, kc));
+ break;
+ }
+
+ PrintMainMenu();
+}
+
+static void HandleCodecMenu(TKeyCode kc) {
+ const pj_str_t ID_ALL = {"*", 1};
+ pj_str_t codec = {NULL, 0};
+
+ if (kc == 'a') {
+ pjsua_codec_set_priority(&ID_ALL, PJMEDIA_CODEC_PRIO_NORMAL);
+ PJ_LOG(3,(THIS_FILE, "All codecs activated"));
+ } else {
+ switch (kc) {
+ case 'd':
+ codec = pj_str("AMR");
+ break;
+ case 'g':
+ codec = pj_str("G729");
+ break;
+ case 'j':
+ codec = pj_str("ILBC");
+ break;
+ case 'm':
+ codec = pj_str("SPEEX/8000");
+ break;
+ case 'p':
+ codec = pj_str("GSM");
+ break;
+ case 't':
+ codec = pj_str("PCMU");
+ break;
+ case 'w':
+ codec = pj_str("PCMA");
+ break;
+ default:
+ PJ_LOG(3,(THIS_FILE, "Keycode '%c' (%d) is pressed", kc, kc));
break;
+ }
+
+ if (codec.slen) {
+ pj_status_t status;
+
+ pjsua_codec_set_priority(&ID_ALL, PJMEDIA_CODEC_PRIO_DISABLED);
+
+ status = pjsua_codec_set_priority(&codec,
+ PJMEDIA_CODEC_PRIO_NORMAL);
+ if (status == PJ_SUCCESS)
+ PJ_LOG(3,(THIS_FILE, "%s activated", codec.ptr));
+ else
+ PJ_LOG(3,(THIS_FILE, "Failed activating %s, err=%d",
+ codec.ptr, status));
+ }
}
+}
- PrintMenu();
+// Implementation: called when read has completed.
+void ConsoleUI::RunL()
+{
+ enum {
+ MENU_TYPE_MAIN = 0,
+ MENU_TYPE_CODEC = 1
+ };
+ static int menu_type = MENU_TYPE_MAIN;
+ TKeyCode kc = con_->KeyCode();
+ pj_bool_t reschedule = PJ_TRUE;
+
+ if (menu_type == MENU_TYPE_MAIN) {
+ if (kc == 'w') {
+ CActiveScheduler::Stop();
+ reschedule = PJ_FALSE;
+ } else if (kc == 'd') {
+ menu_type = MENU_TYPE_CODEC;
+ PrintCodecMenu();
+ } else {
+ HandleMainMenu(kc);
+ }
+ } else {
+ HandleCodecMenu(kc);
+
+ menu_type = MENU_TYPE_MAIN;
+ PrintMainMenu();
+ }
if (reschedule)
Run();
@@ -815,7 +960,7 @@ private:
}
PJ_LOG(3, (THIS_FILE, "PJSUA restarted."));
- PrintMenu();
+ PrintMainMenu();
}
Start();
@@ -873,7 +1018,7 @@ int ua_main()
ConsoleUI *con = new ConsoleUI(console);
con->Run();
- PrintMenu();
+ PrintMainMenu();
// Init & start connection monitor
CConnMon *connmon = CConnMon::NewL(aConn, aSocketServer);
@@ -910,7 +1055,7 @@ int ua_main()
// Close connection and socket server
aConn.Close();
aSocketServer.Close();
-
+
return status;
}