PJ_DECL(pj_status_t) vid_set_android_capturer(jobject window) { unsigned ci, i, count; pj_status_t status = PJ_ENOTFOUND; pjsua_call *call; pjsua_call_id calls_id[PJSUA_MAX_ACC]; count = PJ_ARRAY_SIZE(calls_id); status = pjsua_enum_calls(calls_id, &count); if(status != PJ_SUCCESS){ return status; } PJ_LOG(4, (THIS_FILE, "Setup android capturer for all calls")); PJSUA_LOCK(); for(ci = 0; ci < count; ++ci){ pjsua_call_id call_id = calls_id[ci]; if(pjsua_call_is_active(call_id) && pjsua_call_has_media(call_id)){ call = &pjsua_var.calls[call_id]; for (i = 0; i < call->med_cnt; ++i) { pjsua_call_media *call_med = &call->media[i]; vid_set_stream_window(call_med, PJMEDIA_DIR_CAPTURE, window); status = PJ_SUCCESS; } } } PJSUA_UNLOCK(); return status; }
void call_hangup_all_noincoming() { pjsua_call_id call_ids[PJSUA_MAX_CALLS]; unsigned count = PJSUA_MAX_CALLS; if (pjsua_enum_calls ( call_ids, &count)==PJ_SUCCESS) { for (unsigned i = 0; i < count; ++i) { pjsua_call_info call_info; pjsua_call_get_info(call_ids[i], &call_info); if (call_info.role!=PJSIP_ROLE_UAS || (call_info.state!=PJSIP_INV_STATE_INCOMING && call_info.state!=PJSIP_INV_STATE_EARLY)) { call_hangup_fast(call_ids[i]); } } } }
unsigned call_get_count_noincoming() { unsigned noincoming_count = 0; pjsua_call_id call_ids[PJSUA_MAX_CALLS]; unsigned count = PJSUA_MAX_CALLS; if (pjsua_enum_calls ( call_ids, &count)==PJ_SUCCESS) { for (unsigned i = 0; i < count; ++i) { pjsua_call_info call_info; pjsua_call_get_info(call_ids[i], &call_info); if (call_info.role!=PJSIP_ROLE_UAS || (call_info.state!=PJSIP_INV_STATE_INCOMING && call_info.state!=PJSIP_INV_STATE_EARLY)) { noincoming_count++; } } } return noincoming_count; }
void call_hold_all_except(pjsua_call_id call_id) { pjsua_call_id call_ids[PJSUA_MAX_CALLS]; unsigned count = PJSUA_MAX_CALLS; if (pjsua_enum_calls ( call_ids, &count)==PJ_SUCCESS) { for (unsigned i = 0; i < count; ++i) { if (call_id == PJSUA_INVALID_ID || call_ids[i] != call_id ) { pjsua_call_info call_info; pjsua_call_get_info(call_ids[i], &call_info); if (call_info.media_cnt>0) { if (call_info.media_status != PJSUA_CALL_MEDIA_LOCAL_HOLD && call_info.media_status != PJSUA_CALL_MEDIA_NONE) { pjsua_call_set_hold(call_info.id, NULL); } } } } } }
/* * Callback on media state changed event. * The action may connect the call to sound device, to file, or * to loop the call. */ static void on_call_media_state(pjsua_call_id call_id) { pjsua_call_info call_info; pjsua_call_get_info(call_id, &call_info); /* Connect ports appropriately when media status is ACTIVE or REMOTE HOLD, * otherwise we should NOT connect the ports. */ if (call_info.media_status == PJSUA_CALL_MEDIA_ACTIVE || call_info.media_status == PJSUA_CALL_MEDIA_REMOTE_HOLD) { pj_bool_t connect_sound = PJ_TRUE; /* Loopback sound, if desired */ if (app_config.auto_loop) { pjsua_conf_connect(call_info.conf_slot, call_info.conf_slot); connect_sound = PJ_FALSE; } /* Automatically record conversation, if desired */ if (app_config.auto_rec && app_config.rec_port != PJSUA_INVALID_ID) { pjsua_conf_connect(call_info.conf_slot, app_config.rec_port); } /* Stream a file, if desired */ if ((app_config.auto_play || app_config.auto_play_hangup) && app_config.wav_port != PJSUA_INVALID_ID) { pjsua_conf_connect(app_config.wav_port, call_info.conf_slot); connect_sound = PJ_FALSE; } /* Put call in conference with other calls, if desired */ if (app_config.auto_conf) { pjsua_call_id call_ids[PJSUA_MAX_CALLS]; unsigned call_cnt=PJ_ARRAY_SIZE(call_ids); unsigned i; /* Get all calls, and establish media connection between * this call and other calls. */ pjsua_enum_calls(call_ids, &call_cnt); for (i=0; i<call_cnt; ++i) { if (call_ids[i] == call_id) continue; if (!pjsua_call_has_media(call_ids[i])) continue; pjsua_conf_connect(call_info.conf_slot, pjsua_call_get_conf_port(call_ids[i])); pjsua_conf_connect(pjsua_call_get_conf_port(call_ids[i]), call_info.conf_slot); /* Automatically record conversation, if desired */ if (app_config.auto_rec && app_config.rec_port != PJSUA_INVALID_ID) { pjsua_conf_connect(pjsua_call_get_conf_port(call_ids[i]), app_config.rec_port); } } /* Also connect call to local sound device */ connect_sound = PJ_TRUE; } /* Otherwise connect to sound device */ if (connect_sound) { pjsua_conf_connect(call_info.conf_slot, 0); pjsua_conf_connect(0, call_info.conf_slot); /* Automatically record conversation, if desired */ if (app_config.auto_rec && app_config.rec_port != PJSUA_INVALID_ID) { pjsua_conf_connect(call_info.conf_slot, app_config.rec_port); pjsua_conf_connect(0, app_config.rec_port); } } } PJ_LOG(3,(THIS_FILE, "Media for call %d is active", call_id)); /* Handle media status */ switch (call_info.media_status) { case PJSUA_CALL_MEDIA_ACTIVE: PJ_LOG(3,(THIS_FILE, "Media for call %d is active", call_id)); break; case PJSUA_CALL_MEDIA_LOCAL_HOLD: PJ_LOG(3,(THIS_FILE, "Media for call %d is suspended (hold) by local", call_id)); // call on call hold handler cb_callholdconf(call_id); break; case PJSUA_CALL_MEDIA_REMOTE_HOLD: PJ_LOG(3,(THIS_FILE, "Media for call %d is suspended (hold) by remote", call_id)); break; case PJSUA_CALL_MEDIA_ERROR: PJ_LOG(3,(THIS_FILE, "Media has reported error, disconnecting call")); { pj_str_t reason = pj_str("ICE negotiation failed"); pjsua_call_hangup(call_id, 500, &reason, NULL); } break; case PJSUA_CALL_MEDIA_NONE: PJ_LOG(3,(THIS_FILE, "Media for call %d is inactive", call_id)); break; default: pj_assert(!"Unhandled media status"); break; } }
static void ui_call_transfer_replaces(pj_bool_t no_refersub) { if (current_call == -1) { PJ_LOG(3,(THIS_FILE, "No current call")); } else { int call = current_call; int dst_call; pjsip_generic_string_hdr refer_sub; pj_str_t STR_REFER_SUB = { "Refer-Sub", 9 }; pj_str_t STR_FALSE = { "false", 5 }; pjsua_call_id ids[PJSUA_MAX_CALLS]; pjsua_call_info ci; pjsua_msg_data msg_data; char buf[128]; unsigned i, count; count = PJ_ARRAY_SIZE(ids); pjsua_enum_calls(ids, &count); if (count <= 1) { puts("There are no other calls"); return; } pjsua_call_get_info(current_call, &ci); printf("Transfer call [%d] %.*s to one of the following:\n", current_call, (int)ci.remote_info.slen, ci.remote_info.ptr); for (i=0; i<count; ++i) { pjsua_call_info call_info; if (ids[i] == call) continue; pjsua_call_get_info(ids[i], &call_info); printf("%d %.*s [%.*s]\n", ids[i], (int)call_info.remote_info.slen, call_info.remote_info.ptr, (int)call_info.state_text.slen, call_info.state_text.ptr); } if (!simple_input("Enter call number to be replaced", buf, sizeof(buf))) return; dst_call = my_atoi(buf); /* Check if call is still there. */ if (call != current_call) { puts("Call has been disconnected"); return; } /* Check that destination call is valid. */ if (dst_call == call) { puts("Destination call number must not be the same " "as the call being transferred"); return; } if (dst_call >= PJSUA_MAX_CALLS) { puts("Invalid destination call number"); return; } if (!pjsua_call_is_active(dst_call)) { puts("Invalid destination call number"); return; } pjsua_msg_data_init(&msg_data); if (no_refersub) { /* Add Refer-Sub: false in outgoing REFER request */ pjsip_generic_string_hdr_init2(&refer_sub, &STR_REFER_SUB, &STR_FALSE); pj_list_push_back(&msg_data.hdr_list, &refer_sub); } pjsua_call_xfer_replaces(call, dst_call, PJSUA_XFER_NO_REQUIRE_REPLACES, &msg_data); } }