freeswitch mrcp 源码分析--数据接收(下)

本文深入分析了Freeswitch中MRCP数据接收的流程,从apr_queue_pop取出数据,经过apt_task_msg_process、mrcp_client_msg_process,直至调用recog_message_handler和mrcp_application_message_dispatch。重点讲解了消息处理路径及在recog_on_message_receive中执行的三个关键步骤:设置识别结果头部信息、设置识别结果内容和更新通道状态。
摘要由CSDN通过智能技术生成

这里写图片描述
在前两篇我们介绍了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
freeswitch是一个功能强大的开源电话交换平台,可以用于构建语音、视频和聊天应用程序。想要将freeswitch移植到ARM架构下进行交叉编译,可以按照以下步骤进行。 首先,确保你有一个可以运行Linux操作系统的ARM开发板或设备。ARM架构有许多不同的变种,所以你需要选择适合你设备的版本。 其次,安装交叉编译工具链。交叉编译工具链包含用于在一种架构上生成另一种架构的二进制文件的工具。你需要为ARM架构下载并安装适当的交叉编译工具链。 然后,获取freeswitch的源代码。你可以从官方网站上下载最新的源代码包或从版本控制系统中获取最新的开发版本。将源代码解压到你的开发环境中。 接下来,配置freeswitch的编译选项。进入freeswitch的源代码目录,执行./configure命令来配置编译选项。在configure命令中,使用--host选项指定目标架构为ARM,指定交叉编译工具链的路径。 然后,进行编译。运行make命令来编译freeswitch。这可能需要一些时间,因为编译freeswitch可能涉及到许多依赖库的编译和链接。 最后,将编译后的二进制文件和依赖库安装到ARM设备中。使用make install命令来安装freeswitch到指定的目录。 完成上述步骤后,你就成功地将freeswitch移植到ARM架构中,并进行了交叉编译。现在,你可以在ARM设备上运行freeswitch,并构建语音、视频和聊天应用程序了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值