Android底层开发之Audio HAL

2019-07-13 03:17发布

Android底层开发之Audio HAL 在Android音频底层调试-基于tinyalsa中以「抛开Android的天生复杂,回归嵌入式Linux的本质」的方式介绍如何调试Linux内核中的音频驱动。
这里向上再伸展一下进入HAL层,看是如何将tinyalsa封装给Frameworks使用的。 基于4.2.2版本源码进行讨论。Android官方教程是Audio Implementing the HAL. 一个完整的Android音频系统架构如图所示:
Alt text
注:图来自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) 注:还有很多设备类型,由于并没有接触过就不翻译试的介绍了。

待续…