AAudio 是 Android 8.0 版本中引入的一种音频 API。Android 8.1 版本提供了增强功能,在与支持 MMAP 的 HAL 和驱动程序结合使用时,可缩短延迟时间。本文档说明了在 Android 中支持 AAudio 的 MMAP 功能所需的硬件抽象层 (HAL) 及驱动程序更改。
如欲支持 AAudio MMAP,需执行以下操作:
报告 HAL 的 MMAP 功能
在 HAL 中实现新功能
为“专有”模式缓冲区实现自定义 ioctl()(可选)
提供一个额外的硬件数据路径
设置用于启用 MMAP 功能的系统属性
注意:请仅在 Android O MR1 或更高版本上启用 MMAP 功能。
AAudio 架构
AAudio 是一种新的本地 C API,可提供 Open SL ES 的替代方案。它使用“构建器”设计模式来创建音频流。
AAudio 提供了一个低延迟数据路径。在“专有”模式下,使用该功能可将客户端应用代码直接写入与 ALSA 驱动程序共享的内存映射缓冲区。在“共享”模式下,MMAP 缓冲区由 AudioServer 中运行的混音器使用。在“专有”模式下,由于数据会绕过混音器,延迟时间会明显缩短。
在“专有”模式下,服务可从 HAL 请求 MMAP 缓冲区并管理资源。MMAP 缓冲区将在 NOIRQ 模式下运行,因此没有共享的读/写计数器来管理缓冲区的访问权限。相反,客户端会维护硬件的计时模型,并预测将在何时读取缓冲区。
在下图中,我们可以看到脉冲编码调制 (PCM) 数据通过 MMAP FIFO 向下流入 ALSA 驱动程序。AAudio 服务会定期请求时间戳,然后通过原子消息队列将其传递给客户端的计时模型。