From 1dacdee696b7591a6dcc0b3c1d0f41573e473168 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Thu, 12 Mar 2009 18:11:37 +0000 Subject: (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 --- pjsip-apps/src/symbian_ua/ua.cpp | 281 +++++++++++++++++++++++++++++---------- 1 file changed, 213 insertions(+), 68 deletions(-) (limited to 'pjsip-apps/src/symbian_ua/ua.cpp') 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 #include +//#include #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; } -- cgit v1.2.3