数字音频接口 (DAI)

DAI 接口是 DAI 驱动程序公开的 FIDL 协议。DAI 接口用于控制用于音频数据传输的 DAI 链接的配置。

表示法和术语

  • 所有索引都从 0 开始。
  • n 个元素的向量表示为 <x0,x1,...,xn-1>,例如,包含两个元素 5 和 6 的向量表示为 <5,6>
  • 向量可以嵌套,即 <<5,6>,<7,8>> 表示包含两个向量的向量。
术语 定义
DAI 数字音频接口。音频硬件之间的接口,例如控制器与编解码器之间的 TDM 或 PDM 链路。
帧同步 一种用于标记帧边界的 DAI 信号,也称为 LRCLK、SYNC。
Sclk 用于标记数据线路位传输的 DAI 信号:也称为 SCK、BCLK。
麦克克 主时钟,有时需要向 DAI 提供时钟的 DAI 信号。有时 Sclk 被用作 Mclk(或者 Mclk 从 DAI 中的 Sclk 派生而来)。
框架 代表数据中某个时刻的表示形式:DAI 中的帧同步和 sclk。
帧格式 帧的数据、帧同步和 sclk 排列,例如帧的位置与数据行中的样本同步。
在帧内,为样本预留的位。槽位可能大于容纳样本所需的大小,例如,32 位槽位容纳 24 位或 16 位样本。
渠道 音频样本的单个来源或目标,通常由单个扬声器呈现或由单个麦克风捕获。每一帧都将在固定数量的槽中包含相同固定数量的通道的样本。
示例 以数字方式呈现在特定时间所拍的声音。

基本操作

DAI 客户端负责配置 DAI。提供 DAI 接口的驱动程序(从这里开始介绍 DAI 驱动程序)会通告支持的格式,并允许创建环形缓冲区,以进行音频样本传输。

请注意,DAI 驱动程序应该会自行关闭,就像所有其他驱动程序一样(请参阅驱动程序部分)。

协议定义

DAI 协议在 FIDL 中的 dai.fidldai_format.fidl 中定义。

由于 FDF 目前未提供直接获取 FIDL 通道以进行通信的方法,因此我们在 fuchsia.hardware.audio 上定义了通过 Banjo 获取通道的方法。

与 DAI 协议服务器的直接连接由 dai_connector.fidl 提供。

重置

客户端可以随时通过发出 Reset 函数来重置 DAI。

GetInfo

GetInfo 函数会从 DAI 检索信息,包括:

  1. 制造商名称。
  2. 产品名称。

GetDaiFormats

GetDaiFormats 函数允许 DAI 驱动程序列出其支持 DAI 的格式。支持的格式可能包括多种采样格式、费率等。DAI 驱动程序提供支持的格式,并且其客户端规定了要在 CreateRingBuffer 函数中使用的格式。

DAI 驱动程序以 DaiSupportedFormats 向量进行回复,其中每个 DaiSupportedFormats 都包含:

  1. 通道数的向量。此列表会列出 DAI 支持的频道数量,例如 <2,4,6,8>。立体声 DAI 会报告包含一个元素 <2> 的矢量。请注意,如果某个 DAI 接受一个声道并在其所有输入/输出中输入/输出其内容(例如,立体声放大器为 2 个),则会报告包含一个元素 <1> 的向量;如果该 DAI 支持一个或两个输入声道,则会报告一个包含两个元素 <1,2> 的向量。
  2. 样本格式的向量。DAI 示例格式,例如 PCM_SIGNED
  3. 帧格式的矢量,例如 I2STDM1;或 CUSTOM 选项,其中 DaiFrameFormatCustom 单独指定帧配置的每个参数,例如 frame_sync_sizesclk_on_raising
  4. 费率矢量。帧速率,例如 44100、48000 和 96000。
  5. 每个插槽的位数。DAI 中每个槽的位数,例如每个槽位 32 位。
  6. 每个样本的位矢量。样本宽度,例如每个样本 24 位。

单个 DaiSupportedFormats 中支持所提供的参数的任意组合。

如果并非所有 DAI 支持的组合都可以使用一个 DaiSupportedFormats 进行描述,DAI 会在返回的向量中返回多个 DaiSupportedFormats。例如,如果一个 DaiSupportedFormats 允许在 48KHz 下进行 32 位样本,在 96KHz 下允许 16 位样本,但不允许在 96KHz 下进行 32 位样本,那么 DAI 将回复 2 个 DaiSupportedFormats<<32bits>,<48KHz>><<16bits>,<96KHz>>。为简单起见,此示例忽略了除速率和每样本位数外的其他参数。如果 DAI 支持 48 或 96KHz 的 16 或 32 位样本,则 DAI 会回复 1 个 DaiSupportedFormats<<16bits,32bits>,<48KHz,96KHz>>

此外,假设每个样本的位数始终小于或等于每个插槽的位数。因此,DAI 可以报告 <<16bits_per_slot,32bits_per_slot>,<16bits_per_sample,32bits_per_sample>>,这并不意味着它报告 16 位样本上每个样本 32 位是有效的,而是仅指定了 3 个有效组合:

  1. 16 位插槽,具有 16 位样本
  2. 具有 32 位样本的 32 位插槽
  3. 32 位插槽,具有 16 位样本

GetRingBufferFormats

与流式传输接口 GetSupportedFormats 函数相同,请参阅音频流式传输接口

CreateRingBuffer

CreateRingBuffer 函数中创建环形缓冲区时,客户端会同时指定要在 DAI 中使用的格式以及要在环形缓冲区中使用的格式。

DAI 格式参数指定了:

  1. 多个频道。这是 DAI 中的通道数(例如 TDM 总线上的通道数,即“传输线上的通道数”)。
  2. 使用位掩码的通道。这些是 DAI 中用于数据传输的通道。例如,如需指定 I2S DAI 中的两个频道,此值必须为 3。
  3. 示例格式。
  4. 帧格式。
  5. 帧速率。
  6. 每个插槽的位数。
  7. 每个样本的位数。

环形缓冲区格式参数与流式传输接口 CreateRingBuffer 函数相同,请参阅音频流式传输接口

CreateRingBuffer 成功后,DAI 格式配置被视为已完成,RingBuffer 协议配置已完成并调用 RingBuffer Start 函数后,即可通过 DAI 发送样本。

如需了解环形缓冲区功能,请参阅音频流式传输接口

信号处理

定义请参见音频信号处理