HAL 中的 usecase 和 device
usecase 通俗表示音频场景,对应着音频前端
device 表示音频端点设备,包括输出端点(如 speaker、headphone、earpiece)和输入端点(如 headset-mic、builtin-mic)。高通 HAL 对音频设备做了扩展,详见 platform.h 音频设备定义。扩展这么多是为了方便设置 acdb id,比如外放和通话免提虽然都用了同样的喇叭设备,但是这两种情景会使用不同的算法,因此需要设置不同的 acdb id 到 aDSP,区分 SND_DEVICE_OUT_SPEAKER 和 SND_DEVICE_OUT_VOICE_SPEAKER 是为了匹配到各自的 acdb id。所以device与acdb id是多对一的关系。
在高通 HAL 中,我们只看到 usecase(即 FE PCM)和 device,那么上一个节中提到的 BE DAI 为什么没有被提及?很简单,device 和 BE DAI 是“多对一”的关系,device 连接着唯一的 BE DAI(反过来就不成立了,BE DAI 可能连接着多个 device),所以确定了 device 也就能确定所连接的 BE DAI。
FE_PCMs <=> BE_DAIs <=> Devices
在 mixer_pahts.xml 中看到 usecase 相关的通路其实就是连接 usecase、device 之间的路由。比如 “deep-buffer-playback speaker” 是连接 deep-buffer-playback FE PCM、speaker Device 之间的路由。
FE PCM 并非直接到 device 的,而是 FE PCM 先连接到 BE DAI,BE DAI 再连接到 device。这点有助于理解路由控件,路由控件面向的是 FE PCM 和 BE DAI 之间的连接。
例如 “deep-buffer-playback speaker” 通路中的路由控件:
<ctl name="QUAT_MI2S_RX Audio Mixer MultiMedia1" value="1" />
- MultiMedia1:deep_buffer usacase 对应的 FE PCM
- QUAT_MI2S_RX:speaker device 所连接的 BE DAI
- Audio Mixer:表示 DSP 路由功能
- value:1 表示连接,0 表示断开连接
这个控件的意思是:把 MultiMedia1 PCM 与 QUAT_MI2S_RX DAI 连接起来。这个控件并没有指明 QUAT_MI2S_RX DAI 与 speaker device 之间的连接,因为 BE DAIs 与 Devices 之间并不需要路由控件,如之前所强调”device 连接着唯一的 BE DAI,确定了 device 也就能确定所连接的 BE DAI“。
具体某一通路如何连通的请参考https://blog.csdn.net/qq_36247447/article/details/116503899。