好~接着上面的来:
上面说到DPCM,按照内核文档贴个DPCM应用示例:
耳机----》扬声器切换过程。
DAPM:
动态音频电源管理,怎么个动态法呢,概述就音频通路中的各个控件PCM设备打开使用的时候上电,不使用的时候下电从而实现动态管理。这就就涉及到上下电时序,因为电流的突变往往会造成POP音的发生,我们需要避免这种情况。DAPM怎么实现的呢? 首先看一下Route的定义
这里面我们主要关注三个量: sink control source ,要了解这个再看张图。
嗯~ 看到这个我想大概原理你已经明白了,图中有四个控件,把他们全部定义成DAPM Widget,然后通过SINK PATH SOURCE的形式首尾链接起来。拿高通为例,我们使用命令播放声音需要首先敲类似这种命令:
tinymix MulitiMedia0 Mixer QUAT_TDM_TX_4 1,对和你想的一样,他就是通过DAPM 的管理触发物理控件工作。同时设置逻辑PCM设备上面的状态。认真思考的读者会疑问,按高通拓扑结构,AFE—>ADM—>ASM期间有很多个拓扑结构,为什么命令中只有EndPoint Widget呢?这个就涉及到DAPM电源管理逻辑的上下电实现,具体的可以网上看看大神的博客,有很多写的比较详细。在这就不展开说明了,因为从Kcontrol DAPM Widget展开来说又是一个大课题,这个文章还是以搭建整体音频架构为出发点。嗯,当然并不是所有的控件都需要进行电源管理,如逻辑算法单元就不需要,但是AD DC等数模模数就需要,对于一些Topology我们更多的是对于暴露他的控制接口kcontrol 至应用层,在HAL中通过alsaMix配置同路。
内核文档可以找到比较详细的demo。
Code DAI:
Each codec driver must hava a struct snd_soc_dai_driver to define its DAI and PCM capabilities and opetactions this struct is exported so that it can be registered with the core by your machine driver.
eg:
CPU DAI:
cpu dai 和 codec组成 dai links。CPU DAI 即CPU 侧数字音频接口配置。
Machine Driver:
关于Also Driver 提到了 codec platform DAI 等组件,那么他们怎么连接,这个就是Machine Driver的工作。另外和机器相关的一些硬件设备如clock voltage等配置可以放这。
好 ALSA 的介绍就到这。
Android Audio Hal
Audio_policy_configuration,xm : 描述硬件设备资源的配置文件给Android
AudioHal 模块:
Primary:
USB:USB相关音频设备的输入,如USB 话筒
A2DP:蓝牙音乐等
Remote Submix:就是创建一个虚拟的声卡,将下行的声音Loopback回去。
看图理解:
Android Framwork:
这块具体实现比较复杂,也是一个比较大的模块,这里暂且大概介绍一下,不细致展开。
AudioFocuse: 音频焦点的管理
AudioPolicy:音频策略加载及定制管理
AudioFlinger:音频策略的执行以及音频流的处理
AudioTrack AudioRecord MediaPlay MediaRecord:前两个裸流的播放录音API 后面两个带编解码的录音播放API。
Media Extractor 编解码相关。
Android Car Audio
暂且就这样吧~ 有兴趣了再写