在pjsip 2.6的pjproject-2.6\pjsip-apps\src\pjsua 目錄下,有個很好的例子,可以撥打單方通話和多方通話。
示例在:pjsua_app_cli.c裡面static pj_status_t cmd_make_multi_call(pj_cli_cmd_val *cval)函數中。
多方通話的邏輯和單獨撥打一個電話的邏輯是一樣的,隻是撥打一個電話,調用一次pjsua_call_make_call,而多方通話多次調用該接口,撥出多個電話。另外,在on_call_media_state中主要connect port,否則是聽不到聲音的。
撥打多方通話的代碼:
for (i=0; i<count; ++i) {
pj_status_t status;
status = pjsua_call_make_call(current_acc, &tmp, &call_opt, NULL, NULL, NULL);
if (status != PJ_SUCCESS)
break;
}
connect port的方法:
比如A 先打電話給B,在打電話給C,進行3方通話,正常情況下,
A和B通話是這樣連接配接:
static void on_call_media_state(pjsua_call_id call_id)
{
pjsua_call_info AandB;
pjsua_call_get_info(call_id, &AandB);
if (ci.media_status == PJSUA_CALL_MEDIA_ACTIVE) {
// When media is active, connect call to sound device.
pjsua_conf_connect(AandB.conf_slot, 0);
pjsua_conf_connect(0, AandB.conf_slot);
}
}
A和C通話是這樣連接配接:
static void on_call_media_state(pjsua_call_id call_id)
{
pjsua_call_info AandC;
pjsua_call_get_info(call_id, &AandC);
if (ci.media_status == PJSUA_CALL_MEDIA_ACTIVE) {
// When media is active, connect call to sound device.
pjsua_conf_connect(AandC.conf_slot, 0);
pjsua_conf_connect(0, AandC.conf_slot);
}
}
上面這樣連結後,A可以和B/C通話,但是B和C互相聽不到對方的聲音。
需要加入下面的步驟,這個可以在A和C的on_call_media_state調用後,在加入下面的兩個connect:
pjsua_conf_connect(AandB.conf_slot, AandC.conf_slot);
pjsua_conf_connect(AandC, AandB.conf_slot);
這樣A/B/C互相之間,都會聽到對方的聲音了。