Android底层开发之Audio HAL
在
Android音频底层调试-基于tinyalsa 中以「抛开Android的天生复杂,回归嵌入式Linux的本质」的方式介绍如何调试Linux内核中的音频驱动。
这里向上再伸展一下进入HAL层,看是如何将tinyalsa封装给Frameworks使用的。
基于4.2.2版本源码进行讨论。Android官方教程是
Audio Implementing the HAL .
一个完整的Android音频系统架构如图所示:
注:图来自
Android音频系统之音频框架
简化理解Audio系统
中间部分定义为黑匣子,暂不去了解其内部结果,因为最终的执行都是会到最下端的Android HAL中的。
WiredAccessoryManager.java介绍
该服务是轮循方式地检测有线的音频设备,如有线耳机/HDMI/USB声卡等等。是在如黑匣子图右侧1处将事件传入。
最终会调用到Audio HAL部分。检测的事件以及设备类型见
audio_policy.conf介绍
节。
audio_policy.conf介绍
除了global_configuration,还有一个audio_hw_modules是代表不同音频硬件模块,
*
primary 是主要的处理模块;
*
a2dp 是处理蓝牙音乐传输模块;
*
usb 是处理usb声卡模块;
*
r_submix 是全称是remote submix,是处理远程音频目前主要是Miracast(基于Wi-Fi Direct的屏幕共享协议)。
这么分类是Google的意思,但是真正做的时候并不一定完全坚如照做。比如单独使用primary就附带做了hdmi/usb音频处理也是可行的。当然了,这里需要在对于模块的device中加入需要处理的device type。
常见的有线的音频设备类型与其对应的中文意思:
AUDIO_DEVICE_OUT_WIRED_HEADSET 耳机
AUDIO_DEVICE_OUT_WIRED_HEADPHONE 无Mic耳机
AUDIO_DEVICE_OUT_AUX_DIGITAL HDMI
AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET USB Sound Card(USB audio)
注:还有很多设备类型,由于并没有接触过就不翻译试的介绍了。
待续…