音频驱动程序架构

在 Fuchsia 中,驱动程序的架构方式有很多种,具体取决于所用驱动程序的数量、它们的通信方式以及它们的职责。音频驱动程序的职责由暴露给驱动程序客户端的接口决定,客户端可以是其他驱动程序或使用驱动程序设施的应用程序用户。

定义

术语 定义
硬件编解码器 一种真实或虚拟设备,可将信号从数字/模拟编码/解码为模拟/数字,包括所有组合,例如数字到数字。 编解码器示例包括 DAC-放大器组合和 ADC 转换器。
控制器或引擎 系统中用于管理音频信号的硬件部分,例如 SOC 的音频子系统。
DAI 数字音频接口。音频硬件之间的接口,例如控制器和编解码器之间的 TDM 或 PDM 链路。
环形缓冲区 用于数据传输的共享内存区域(在主内存中)的管理抽象;此共享内存区域由 VMO 对象提供。
数据包流 通过离散数据包传输来抽象基于数据包的音频流式传输(例如,对于 AAC 和 SBC 等编码音频格式)。

音频接口

音频驱动程序的应用/客户端用户要使用的 API 是 Audio Composite Interface。此 API 允许应用访问驱动程序公开的音频硬件功能。它允许驱动程序公开各种类型硬件的功能,包括具有一个或多个 DAI 的硬件编解码器、具有环形缓冲区、数据包流和 DAI 的控制器,以及 Audio Signal Processing API 允许的任何处理元素组合。

音频硬件中常见的一种拆分方式是,让音频引擎配置与音频硬件编解码器通信的 DAI。在这种拆分方式中,我们可以为音频引擎和编解码器分别配备一个驱动程序。这两个驱动程序都可以使用音频复合接口来公开其相关功能。编解码器驱动程序将公开一个或多个 DAI 互连接口,而音频引擎驱动程序将配置音频引擎硬件,包括连接到编解码器驱动程序或多个驱动程序的 DAI。

这些驱动程序的客户端应配置所有驱动程序。此架构的一种使用示例,适用于两个不同编解码器实际连接到引擎的系统,例如抽象化 SoC 的音频子系统。

                           +-----------------+
                +----------+     Client      +----------+
                |          +-----------------+          |
                |                   |                   |
          Composite API       Composite API      Composite API
                |                   |                   |
       +-----------------+ +-----------------+ +-----------------+
       | audio subsystem | |     Codec 1     | |     Codec 2     |
       +-----------------+ +-----------------+ +-----------------+

已弃用的接口

已弃用的接口包括:

  1. StreamConfig:用于通过 audio_core 和 audio-driver-ctl 捕获或渲染音频。前者是音频系统核心的第 1 版(提供软件混音、路由等),后者是用于测试和启动新平台的实用程序。

之前使用 StreamConfig API 的驱动程序可以使用带有一个环形缓冲区的 Audio Composite 来实现。

  1. 编解码器:用于通过一个 DAI 抽象化硬件编解码器。以前使用编解码器 API 的驱动程序可以使用 Audio Composite(一个 DAI,无环形缓冲区)来实现。

  2. DAI:用于通过一个环形缓冲区和一个 DAI 来抽象化 SoC 硬件。以前使用 DAI API 的驱动程序可以使用音频复合(包含一个 DAI 和一个环形缓冲区)来实现。

虚拟音频驱动程序

对于自动化测试和子系统开发,虚拟音频驱动程序可在软件中模拟音频硬件: * 新式 virtual-audio 驱动程序实现了 Composite API。 * 旧版 virtual-audio-legacy 驱动程序实现了已弃用的 StreamConfig、Dai 和 Codec API。