/** Process MPF response */ static apt_bool_t mpf_suite_response_process(mpf_suite_agent_t *agent, const mpf_message_t *mpf_message) { mpf_task_msg_t *task_msg = NULL; apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Process MPF Response"); if(mpf_message->command_id == MPF_ADD_TERMINATION) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"On Add Termination"); if(mpf_message->termination) { mpf_suite_session_t *session; session = mpf_termination_object_get(mpf_message->termination); if(session->rtp_termination == mpf_message->termination) { mpf_rtp_stream_descriptor_t *descriptor = NULL; if(session == agent->rx_session) { descriptor = mpf_rtp_rx_remote_descriptor_create(agent,session); } if(session == agent->tx_session) { descriptor = mpf_rtp_tx_remote_descriptor_create(agent,session); } if(descriptor) { mpf_engine_termination_message_add( agent->engine, MPF_MODIFY_TERMINATION,session->context,session->rtp_termination,descriptor, &task_msg); } mpf_engine_assoc_message_add( agent->engine, MPF_ADD_ASSOCIATION,session->context,session->file_termination,session->rtp_termination, &task_msg); mpf_engine_topology_message_add( agent->engine, MPF_APPLY_TOPOLOGY,session->context, &task_msg); } } } else if(mpf_message->command_id == MPF_SUBTRACT_TERMINATION) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"On Subtract Termination"); if(mpf_message->termination) { mpf_suite_session_t *session; session = mpf_termination_object_get(mpf_message->termination); if(session->file_termination == mpf_message->termination) { session->file_termination = NULL; } else if(session->rtp_termination == mpf_message->termination) { session->rtp_termination = NULL; } mpf_termination_destroy(mpf_message->termination); if(!session->file_termination && !session->rtp_termination) { mpf_suite_session_destroy(agent,session); } } } return mpf_engine_message_send(agent->engine,&task_msg); }
static apt_bool_t mrcp_client_av_media_answer_process(mrcp_client_session_t *session, mrcp_session_descriptor_t *descriptor) { rtp_termination_slot_t *slot; int i; int count = session->terminations->nelts; if(count != descriptor->audio_media_arr->nelts) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Number of terminations [%d] != Number of audio media in answer [%d]", count,descriptor->audio_media_arr->nelts); count = descriptor->audio_media_arr->nelts; } /* update existing terminations */ for(i=0; i<count; i++) { mpf_rtp_media_descriptor_t *remote_media; mpf_rtp_termination_descriptor_t *rtp_descriptor; /* get existing termination */ slot = &APR_ARRAY_IDX(session->terminations,i,rtp_termination_slot_t); if(!slot) continue; remote_media = mrcp_session_audio_media_get(descriptor,i); if(slot->descriptor) { slot->descriptor->audio.remote = remote_media; } if(slot->termination) { /* construct termination descriptor */ rtp_descriptor = apr_palloc(session->base.pool,sizeof(mpf_rtp_termination_descriptor_t)); mpf_rtp_termination_descriptor_init(rtp_descriptor); rtp_descriptor->audio.local = NULL; rtp_descriptor->audio.remote = remote_media; /* send modify termination request */ apt_obj_log(APT_LOG_MARK,APT_PRIO_DEBUG,session->base.log_obj,"Modify Media Termination "APT_NAMESIDRES_FMT, MRCP_SESSION_NAMESID(session), mpf_termination_name_get(slot->termination)); if(mpf_engine_termination_message_add( session->profile->media_engine, MPF_MODIFY_TERMINATION,session->context,slot->termination,rtp_descriptor, &session->mpf_task_msg) == TRUE) { slot->waiting = TRUE; mrcp_client_session_subrequest_add(session); } if(slot->channel && slot->channel->termination) { if(mpf_engine_assoc_message_add( session->profile->media_engine, MPF_ADD_ASSOCIATION,session->context,slot->termination,slot->channel->termination, &session->mpf_task_msg) == TRUE) { mrcp_client_session_subrequest_add(session); } } } } return TRUE; }