Biu~笔记:高通蓝牙ADK6.x(10)-- chain是什么?

        Biu~的突然更新,好久没更新6.x的博文了,这次更新主要是注意到很多人开始对DSP下手了_φ( °-°)/ ,而DSP里最基本的是要认识音频的处理链路,也就是平台中的chain。他是由多个模块(operator)连接起来的,连接的方法sink和earbud有些不同,这里会从6.x开始聊聊sink的chain,再到20.x中的博文中聊聊earbud的chain。

        应该不乱吧(〃'▽'〃)

        那么这一篇我们先来说说,sink的chain中,各个节点是怎么定义和串起来的。这里我们以hfp通话为例,找到以下文件

        audio_voice_common_config.c

        我们可以看到,这个文件中定义了很多东西,其实只是窄带、宽带、超宽带、无敌超宽带和单mic、双mic以及heaset、handfree、speaker等这几种类型交叉组合出来的配置,我们把窄带1mic headset的配置(结构体变量)留下,其他的都先删了,这样方便代码查看学习。


第一部分

       你会发现其中宏定义语句MAKE_OPERATOR_CONFIG_PRIORITY_X在前面用得很多,

这个宏定义其实是用来构造模块的参数,这些参数会用在operator_config_t类型的数组中,这个数组就是声明了chain中有多少个模块(并不完全,这只是主要的模块,代码中会根据环境多加入一些没出现在这个数组中的模块)。而这个宏定义会根据参数不同,演化出多个变种,特点就是MAKE_OPERATOR_CONFIG后面跟不同的名。不要在意名字多,只是方便可读性而已。

直接看operator_config_t了解其中全部设置的参数:

       capability_id这个id是唯一的模块id,如果是平台自带的模块,可在“Kymera Capability Library User Guide 80-CF976-1”这个文档中找到详细的介绍

       role这也可以看成一个id,只不过是将capability_id映射出来在chain中方便使用的id,数值可以随意但是必须在这个chain中唯一,代码中对模块的使用都是用这个id的。

       processor_id:这是设置模块在哪个DSP上运行,一般都在P0运行

       priority:设置调度优先级,重要的模块高优先级

       setup:预设设置,在模块创建之后立即设置相关参数(一些模块参数是根据当前环境去设置的,所以不是所有的模块都需要预设设置)



第二部分

       有了上面的模块声明,下面就开始连接模块,这里用到了operator_path_node_t这个结构体类型。

里面的参数有:

        operator_role:和第一部分的role一样

        input_terminal:这个模块的输入口

        output_terminal:这个模块的输出口

这里要注重说明一下,这个结构体看上去就描述模块的输入输出而已,但是当这个结构体用数组表示时,就会变成数组中第一个模块的输出口连到数组中第二个模块的输入口,以此类推,一个数组表示一条链路。然而不管数组中有多少个模块,都是只要一个或零个输入/输出口






第三部分

       当所有链路都定义好之后,就得把他们整合到一块,形成一个大的复杂的链路结构。这个结构用operator_path_t这个结构体类型去存储,形成一个数组,

其中的参数:

       path_role:这个也是一个自定义id,用来区分每条链路

       type:链路类型,一共用四种类型,简单来说就是表明这条链路有没有输入输出口

       number_of_nodes:链路中有多少模块

       nodes:链路结构体,是上面第二部分说的operator_path_node_t类型,存储了这条链路的模块、接口连接的数据




第四部分

       用以上结构体装载完了数据之后,就得到完整的链路数据了,但还不是给系统调用的变量,还需要把它装到chain的结构体中供系统使用了,这个结构体为chain_config_t,它有两种使用方式,一种是用在sink中的,将每条链路都用数组存出来(path);另外一种是用在earbud上,将输入、输出和连接分别装在不同的数组。
 

在sink中会用到以下参数:

       chain_id:用来标识这个chain的id,也是可以自定义,但必须唯一

       audio_ucid:use case id,与chain_id有点类似,系统常用这个id去申请或释放资源

       operator_config:第一部分的内容

       paths:第三部分的内容

       number_of_paths:链路条数

 

到这里这个config就完整的包含了chain的信息了,也是最基本的信息。使用时,会在从这个结构体变量获取数据去建造audio chain。

        好了,以上是本期博文的全部内容,如有疑问就别在博文下方评论留言了,有什么疑问或想了解的当面和我说(如果你知道我是谁的话ヽ( ̄▽ ̄)و),我会尽量安排上(o´ω`o)و。谢谢大家浏览,我们下期再见。

 

多看文档,多上官网

多看文档,多上官网

多看文档,多上官网

 


 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论

biu biu biu 居然系广东人!!