在前两篇我们介绍了mrcp接收后的处理,最后会调用apr_queue_push扔到消息队列里面。
对应的,在apt_consumer_task.apt_consumer_task_run()中会循环调用pr_queue.apr_queue_pop()从队列里面取出数据:
apt_consumer_task.apt_consumer_task_run –>
apr_queue.apr_queue_pop –>
apt_task.apt_task_msg_process –>
mrcp_client.mrcp_client_msg_process –>
mrcp_client_session.mrcp_client_on_message_receive–>
mrcp_client_session.mrcp_app_control_message_raise–>
mod_unimrcp.recog_message_handler –> mrcp_application.mrcp_application_message_dispatch–>
mod_unimrcp.recog_on_message_receive–>
mod_unimrcp.recog_channel_set_result_headers–>
mod_unimrcp.recog_channel_set_results–>
mod_unimrcp.speech_channel_set_state
在apt_consumer_task_run中是一个while循环,调用apr_queue_pop不断去读取队列数据。然后调用apt_task_msg_process处理取出来的数据。
APT_DECLARE(apt_bool_t) apt_task_msg_process(apt_task_t *task, apt_task_msg_t *msg)
{
apt_bool_t status = FALSE;
apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Process Message [%s] ["APT_PTR_FMT";%d;%d]",
task->name, msg, msg->type, msg->sub_type);
if(msg->type == TASK_MSG_CORE) {
status = apt_core_task_msg_process(task,msg);
}
else {
if(task->vtable.process_msg) {
status = task->vtable.process_msg(task,msg);
}
}
apt_task_msg_release(msg);
return status;
}
这里主要调用task->vtable.process_msg来处理。在mrcp_client_create函数中,process_msg 被赋值为mrcp_client_msg_process:
vtable = apt_task_vtable_get(task);
if(vtable) {
vtable->process_msg = mrcp_client_msg_process;
vtable->on_start_complete = mrcp_client_on_start_complete;
vtable->on_terminate_complete = mrcp_client_on_terminate_complete;
}
所以实际上调用的是mrcp_client_msg_process()。消息的type为:MRCP_CLIENT_CONNECTION_TASK_MSG,subtype为:CONNECTION_AGENT_TASK_MSG_RECEIVE_MESSAGE,所以会调用mrcp_client_on_message_receive,进而调用mrcp_app_control_message_raise()。
static apt_bool_t mrcp_app_control_message_raise(mrcp_client_session_t *session, mrcp_channel_t *channel, mrcp_message_t *mrcp_message)
{
if(mrcp_message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE) {
mrcp_app_message_t *response;
mrcp_message_t *mrcp_request;
if(!session->active_request || !session->active_request->control_message) {
return FALSE;
}
response = mrcp_client_app_response_create(session->active_request,0,session->base.pool);
mrcp_request = session->active_request->control_message;
mrcp_message->start_line.method_id = mrcp_request->start_line.method_id;
mrcp_message->start_line.m