前言
参考文件:
Qualcomm 音频学习一
Qualcomm Audio HAL 音频通路设置
这两个参考文档逻辑特别清晰,我的这篇文章就是仿照他们的分析整理目前使用的mixer_paths.xml文件
使用平台
处理器:sdm660
音频模块:PM660L
高通音频架构
高通音频框架大体分为以下四个部分:1
音频前端(FE)
音频后端(BE)
DSP
音频设备(Audio Device)
音频框图概述2
- Front End PCMs:音频前端,一个前端对应着一个 PCM 设备
- Back End DAIs:音频后端,一个后端对应着一个 DAI
接口,一个 FE PCM 能够连接到一个或多个 BE DAI Audio - Device:有
headset、speaker、earpiece、mic、bt、modem 等;不同的设备可能与不同的 DAI 接口连接,也可能与同一个
DAI 接口连接(如上图,Speaker 和 Earpiece 都连接到 DAI1) - Soc DSP:本文范围内实现路由功能:连接 FE
PCMs 和 BE DAIs,例如连接 PCM0 与 DAI1:
【注】这里直接引用了
高通 SDM660 音频框图
FE PCMs:
deep_buffer
low_latency
mutil_channel
compress_offload
audio_record
compress_record
BE DAIs:
SLIM_BUS *2
SLIM_BUS *1 (WCD装用)
3 MI2S (2 ×data) interfaces
1 MI2S (4 ×data) interface
SoundWire interface
Audio Device
speaker
mic
【注】BE DAI一般是用于连接外部的音频器件的接口,特殊情况如first MI2S可用于连接内部的digital codec。
目前我的项目只使用了两个audio devices
HAL 中的 usecase 和 device
usecase 通俗表示音频场景,对应着音频前端,比如:
播放:
deep_buffer:音乐、视频等对时延要求不高的放音场景
low_latency:按键音、触摸音、游戏背景音等低延时的放音场景
mutil_channel:多媒体播放。和hdmi相关
compress_offload:mp3、flac、aac等格式的音源播放场景,这种音源不需要软件解码,直接把数据送到硬件解码器(aDSP),由硬件解码器(aDSP)进行解码
录制:
record:普通录音场景
compress_record:待了解
查看usecase 和 device定义
usecase : audio_hw.h
device : platform.h
音频通路配置(音频控件配置)
简单的来说,就是将音频前端(FE)经过音频后端(BE),与音频设备(Audio Device)连接起来。
(FE <=> BE <==> Devices)
usecase 通过路由与音频设备相关联。其配置一般放在某个 xml 文件,以 SDM660 为例,其放在 mixer_paths_mpos.xml 文件中。该文件中的配置,又称为音频控件配置。
音频控件配置:
在高通 bring up 音频的时候,一般不会先去修改 mixer_paths.xml 文件,而是先使用以下几个工具,进行通路配置验证:
tinymix : 配置音频路由
tinycap: 录音
tinyplay: 播放
外部 SPK 调试举例
查看下mixer_paths_mpos.xml文件中的定义
<path name="speaker">
<ctl name="INT0_MI2S_RX Channels" value="One" />
<ctl name="RX3 MIX1 INP1" value="RX1" />
<ctl name="Speaker Boost" value="ENABLE" />
<ctl name="SPK" value="Switch" />
</path>
1、设置通道数目
name=“INT0_MI2S_RX Channels” value=“One”
分析:first MI2S的输出通道数为1

2、选择输入信号
name=“RX3 MIX1 INP1” value=“RX1”
分析:SPK 以内部的 Rx3 Mix1 作为 mixer 作为输入,在 mixer 端又以 mixer的 Rx1 作为输入
3、Speaker使能
name=“Speaker Boost” value=“ENABLE”
分析:打开PM660L中和speaker相关的boost
Boost主要是作用于speaker的放大器,用于驱动上图黄色的三角形(功放)
4、外部speaker硬件
name=“SPK” value=“Switch”
分析:代码的第五行中"SPK"是实际的speaker,这个就是我们在前面的看到的那两个SPKR信号接到连接器后,连接器接到speaker硬件
mic调试举例
<path name="adc1">
<ctl name="ADC1 Volume" value="6" />
<ctl name="DEC1 MUX" value="ADC1" />
<ctl name="ADC1_INP1 Switch" value="1" />
</path>
<path name="speaker-mic">
<path name="adc1" />
<ctl name="IIR1 INP1 MUX" value="DEC1" />
</path>
1、调节输入音量
name=“ADC1 Volume” value=“6”
name=“ADC1 Volume” value=“6”
分析:红色的是放大器,用于调节音量,这里将音量调节为6,看下它的范围
需要注意的是这里的value不一样要看该xml文件的path有没有被使用
2、选择通路
name=“DEC1 MUX” value=“ADC1”
分析:这里选择ADC1信号,就是mic1传入时经过的ADC1
3、打开mic1
name=“ADC1_INP1 Switch” value=“1”
分析:推测是外接mic1的control控件
4、IIR滤波信号选择
name=“IIR1 INP1 MUX” value=“DEC1”
分析:IIR1的输入信号只有DEC1
小结:
则整个外部mic的音频链路可以简化为:
mic1 -> ADC1 -> DEC1 -> IIR1
IIR1信号接到三个RX path上,具体看该RX path上的mix1怎么设置,如下图就是将IIR1从RX1的mix接出去到TX_sd1上
在确定通路没有问题的情况下,再将 tinymix 的参数导入到 mixer-path.xml 对应的音频控件中。并将该 mixer-path.xml push 到 /etc/ 目录下替换原来的文件,然后重启设备,通过系统 apk 进行测试。