struct my_call_data *call_init_tonegen(pjsua_call_id call_id) { pj_pool_t *pool; struct my_call_data *cd; pjsua_call_info ci; if (call_id !=-1 ) { pjsua_call_get_info(call_id, &ci); } pool = pjsua_pool_create("mycall", 512, 512); cd = PJ_POOL_ZALLOC_T(pool, struct my_call_data); cd->pool = pool; pjmedia_tonegen_create(cd->pool, 8000, 1, 160, 16, 0, &cd->tonegen); pjsua_conf_add_port(cd->pool, cd->tonegen, &cd->toneslot); if (call_id !=-1 ) { pjsua_conf_connect(cd->toneslot, ci.conf_slot); } pjsua_conf_connect(cd->toneslot, 0); if(call_id !=-1) { pjsua_call_set_user_data(call_id, (void*) cd); } return cd; }
struct my_call_data *call_init_tonegen(pjsua_call_id call_id) { pj_pool_t *pool; struct my_call_data *cd; pjsua_call_info ci; if (call_id !=-1 ) { pjsua_call_get_info(call_id, &ci); if (ci.media_status != PJSUA_CALL_MEDIA_ACTIVE) return NULL; } pool = pjsua_pool_create("mycall", 512, 512); cd = PJ_POOL_ZALLOC_T(pool, struct my_call_data); cd->pool = pool; pjmedia_tonegen_create(cd->pool, 8000, 1, 160, 16, 0, &cd->tonegen); pjsua_conf_add_port(cd->pool, cd->tonegen, &cd->toneslot); if (call_id !=-1 ) { pjsua_conf_connect(cd->toneslot, ci.conf_slot); } if (accountSettings.localDTMF) { pjsua_conf_connect(cd->toneslot, 0); } if (call_id !=-1 ) { pjsua_call_set_user_data(call_id, (void*) cd); } return cd; }
bool BlabbleCall::RegisterIncomingCall(pjsua_call_id call_id) { BlabbleAccountPtr p = parent_.lock(); if (!p) return false; if (call_id_ == INVALID_CALL && call_id != INVALID_CALL && call_id >= 0 && call_id < (long)pjsua_call_get_max_count()) { call_id_ = call_id; pjsua_call_set_user_data(call_id, &id_); /* Automatically answer incoming calls with 180/RINGING */ pjsua_call_answer(call_id, 180, NULL, NULL); StartInRinging(); return true; } return false; }
void call_deinit_tonegen(pjsua_call_id call_id) { struct my_call_data *cd; if (call_id !=-1 ) { cd = (struct my_call_data*) pjsua_call_get_user_data(call_id); } else { cd = tone_gen; } if (!cd) return; pjsua_conf_remove_port(cd->toneslot); pjmedia_port_destroy(cd->tonegen); pj_pool_release(cd->pool); if (call_id !=-1 ) { pjsua_call_set_user_data(call_id, NULL); } else { tone_gen = NULL; } }
void SipAccount::onIncomingCall(pjsua_call_id call_id, pjsip_rx_data *rdata) { Logger::debug("SipAccount::onIncomingCall(call_id=%d)...", call_id); PJ_UNUSED_ARG(rdata); pj_status_t status = pjsua_call_set_user_data(call_id, this); if (status != PJ_SUCCESS) { Logger::error("pjsua_acc_set_user_data() failed (%s)", Helper::getPjStatusAsString(status).c_str()); } pjsua_call_info ci; pjsua_call_get_info(call_id, &ci); #if 0 Logger::debug("local_info %s", pj_strbuf(&ci.local_info)); Logger::debug("local_contact %s", pj_strbuf(&ci.local_contact)); Logger::debug("remote_info %s", pj_strbuf(&ci.remote_info)); Logger::debug("remote_contact %s", pj_strbuf(&ci.remote_contact)); Logger::debug("call_id %s", pj_strbuf(&ci.call_id)); #endif std::string display, number; if (!getNumber(&ci.remote_info, &display, &number)) { Logger::warn("invalid URI received '%s'", pj_strbuf(&ci.remote_info)); return; } std::string msg; bool block = false; if (number == "anonymous" or number == "") { block = m_pPhone->isAnonymousNumberBlocked(&m_settings.base, &msg); } else { block = m_pPhone->isNumberBlocked(&m_settings.base, number, &msg); } Logger::notice(msg.c_str()); #if 0 // 302 redirect Use pjsua_call_hangup() and put the destination URL in the Contact header of the pjsua_msg_data. pj_pool_t* pool = pjsua_pool_create("", 512, 512); pjsua_msg_data msgData; pjsua_msg_data_init(&msgData); pj_str_t tmp; pjsip_generic_string_hdr* hdr = pjsip_generic_string_hdr_create(pool, pj_cstr(&tmp, "Contact"), pj_cstr(&tmp, "URI ...TODO")); pj_list_push_back(&msgData.hdr_list, hdr); // codes: http://de.wikipedia.org/wiki/SIP-Status-Codes // enum pjsip_status_code... pjsua_call_hangup(call_id, PJSIP_SC_MOVED_TEMPORARILY, NULL, &msgData); pj_pool_release(pool); #endif if (block) { // answer incoming calls with 200/OK, then we hangup in onCallState... pj_status_t status = pjsua_call_answer(call_id, 200, NULL, NULL); if (status != PJ_SUCCESS) { Logger::warn("pjsua_call_answer() failed (%s)", Helper::getPjStatusAsString(status).c_str()); } } }