【Audio driver】mixer_paths.xml文件分析

前言

参考文件:

Qualcomm 音频学习一
Qualcomm Audio HAL 音频通路设置
这两个参考文档逻辑特别清晰,我的这篇文章就是仿照他们的分析整理目前使用的mixer_paths.xml文件

使用平台

处理器:sdm660
音频模块:PM660L

高通音频架构

高通音频框架大体分为以下四个部分:1
音频前端(FE)
音频后端(BE)
DSP
音频设备(Audio Device)

音频框图概述2【Audio driver】mixer_paths.xml文件分析_第1张图片

  • 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 音频框图
【Audio driver】mixer_paths.xml文件分析_第2张图片

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
tinymix查看结果
【Audio driver】mixer_paths.xml文件分析_第3张图片
2、选择输入信号
name=“RX3 MIX1 INP1” value=“RX1”
分析:SPK 以内部的 Rx3 Mix1 作为 mixer 作为输入,在 mixer 端又以 mixer的 Rx1 作为输入
【Audio driver】mixer_paths.xml文件分析_第4张图片
3、Speaker使能
name=“Speaker Boost” value=“ENABLE”
分析:打开PM660L中和speaker相关的boost
Boost主要是作用于speaker的放大器,用于驱动上图黄色的三角形(功放)
【Audio driver】mixer_paths.xml文件分析_第5张图片
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”
【Audio driver】mixer_paths.xml文件分析_第6张图片
name=“ADC1 Volume” value=“6”
分析:红色的是放大器,用于调节音量,这里将音量调节为6,看下它的范围
在这里插入图片描述
需要注意的是这里的value不一样要看该xml文件的path有没有被使用

2、选择通路
name=“DEC1 MUX” value=“ADC1”
分析:这里选择ADC1信号,就是mic1传入时经过的ADC1
【Audio driver】mixer_paths.xml文件分析_第7张图片
3、打开mic1
name=“ADC1_INP1 Switch” value=“1”
分析:推测是外接mic1的control控件
【Audio driver】mixer_paths.xml文件分析_第8张图片
4、IIR滤波信号选择
name=“IIR1 INP1 MUX” value=“DEC1”
分析:IIR1的输入信号只有DEC1
【Audio driver】mixer_paths.xml文件分析_第9张图片
小结:
则整个外部mic的音频链路可以简化为:
mic1 -> ADC1 -> DEC1 -> IIR1

IIR1信号接到三个RX path上,具体看该RX path上的mix1怎么设置,如下图就是将IIR1从RX1的mix接出去到TX_sd1上
【Audio driver】mixer_paths.xml文件分析_第10张图片

在确定通路没有问题的情况下,再将 tinymix 的参数导入到 mixer-path.xml 对应的音频控件中。并将该 mixer-path.xml push 到 /etc/ 目录下替换原来的文件,然后重启设备,通过系统 apk 进行测试。


  1. https://blog.csdn.net/azloong/article/details/79383323 ↩︎

  2. https://blog.csdn.net/q1075355798/article/details/80657365 ↩︎

你可能感兴趣的:(audio,android)