音频驱动架构

在 Fuchsia 中,有很多方法可以构建驱动程序,这是由使用的驱动数量,它们的通信方式和它们的职责来定义。音频驱动的职责就是由暴露给驱动客户端的接口决定,客户端可以是其他驱动或者驱动的应用程序用户。

定义

术语 定义
Codec 一个真实或者虚拟的设备对数字/模拟信号进行编码/解码,包括所有组合

: : 例如,数字到数字。 : : 示例 解码包含 DAC 放大器组合和 ADC 转换器。 | Controller or engine | 系统管理音频信号的硬件部分 | : : 例如一个 SOC 的音频子系统。 : | DAI | Digital Audio Interface 。在音频硬件之间的接口 | : : 例如在控制器间的 TDM 或者 PDM 连接和编解码: : : :

音频接口

应用使用的主要 API 在 Audio Streaming Interface中说明。 这个 API 允许应用捕获或者渲染音频。使用音频驱动的流接口的应用示例包括 audio_coreaudio-driver-ctl。前者为音频系统的核心(提供软件混合,路由等),后者为测试和启动一个新平台的实例。

提供流媒体接口的驱动抽象了 API 中描述的硬件功能,但是它不需要成为实际配置所有硬件的驱动。在音频硬件中通用的分割方式为,一个音频引擎来配置 DAI 与音频硬件编解码器通信。Codec Interface 允许有一个编解码器实现的驱动,和其他驱动配置包括 DAI 和编解码器(s)配置的音频引擎硬件。在这个配置中,解码器(s)是控制器的次级部分。例如mt8167-tdm-output 是一个 MediaTek MT8167S 音频子系统(音频引擎)的驱动,同时也提供了对于应用程序和与任意编解码器驱动通信的流媒体接口,例如tas58xx 就暴露了编解码器接口如下所示:

  1. +-----------------+
  2. | audio_core |
  3. +-----------------+
  4. |
  5. Streaming Interface
  6. |
  7. +-----------------+
  8. |mt8167-tdm-output|
  9. +-----------------+
  10. |
  11. Codec Interface
  12. |
  13. +-----------------+
  14. | tas58xx |
  15. +-----------------+

引擎/编解码分离的架构驱动的另一种方式则是有一个编解码器来提供流媒体接口,并且音频引擎提供一个DAI interface。例如对于 AMLogic g12 音频子系统(音频引擎)的 aml-g12-tdm-dai 驱动提供 DAI 接口来供其他驱动或应用使用,并且编解码器可以驱动引擎,并对类似 audio-driver-ctl 的应用提供流媒体接口。

  1. +-----------------+
  2. |audio-driver-ctl |
  3. +-----------------+
  4. |
  5. Streaming Interface
  6. |
  7. +-----------------+
  8. | codec-driver |
  9. +-----------------+
  10. |
  11. DAI Interface
  12. |
  13. +-----------------+
  14. | aml-g12-tdm-dai |
  15. +-----------------+

我们同样可以有一个非驱动组件使用 DAI 或者编解码器接口来直接访问音频引擎或者音频硬件编解码器。在下图中,我们有一个下提供流式接口的蓝牙音频,和使用 DAI 接口来配置 AMLogic g12 音频子系统:

  1. +-----------------+ Streaming +-----------------+
  2. | BT Stack +-----------------+ audio_core |
  3. +-----------------+ Interface +-----------------+
  4. |
  5. DAI Interface
  6. |
  7. +-----------------+
  8. | aml-g12-tdm-dai |
  9. +-----------------+

同样也可以同时使用 DAI 和解码接口,例如与另一个提供流媒体接口的驱动程序捆绑在一起。这种架构的使用示例是,在一个系统中,有两个不同编解码器物理连接的同一个 DAI 流。

  1. +-----------------+
  2. | audio_core |
  3. +-----------------+
  4. |
  5. Streaming Interface
  6. |
  7. +-----------------+
  8. +----------+ glue driver +----------+
  9. | +-----------------+ |
  10. | | |
  11. DAI Interface Codec Interface Codec Interface
  12. | | |
  13. +-----------------+ +-----------------+ +-----------------+
  14. | aml-g12-tdm-dai | | tas-5720 | | tas-5720 |
  15. +-----------------+ +-----------------+ +-----------------+

最后,还有一种可能是仅有一个驱动配置所有硬件和暴露的流媒体接口。当没有逻辑 DAI 或单独的硬件编解码器时,则使用这种方式。

  1. +-----------------+
  2. | audio_core |
  3. +-----------------+
  4. |
  5. Streaming Interface
  6. |
  7. +-----------------+
  8. |USB audio driver |
  9. +-----------------+