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.fidl 和 dai_format.fidl 中定义。
由于 FDF 目前未提供直接获取 FIDL 通道以进行通信的方法,因此我们在 fuchsia.hardware.audio 上定义了通过 Banjo 获取通道的方法。
与 DAI 协议服务器的直接连接由 dai_connector.fidl 提供。
重置
客户端可以随时通过发出 Reset
函数来重置 DAI。
GetInfo
GetInfo
函数会从 DAI 检索信息,包括:
- 制造商名称。
- 产品名称。
GetDaiFormats
GetDaiFormats
函数允许 DAI 驱动程序列出其支持 DAI 的格式。支持的格式可能包括多种采样格式、费率等。DAI 驱动程序提供支持的格式,并且其客户端规定了要在 CreateRingBuffer
函数中使用的格式。
DAI 驱动程序以 DaiSupportedFormats
向量进行回复,其中每个 DaiSupportedFormats
都包含:
- 通道数的向量。此列表会列出 DAI 支持的频道数量,例如
<2,4,6,8>
。立体声 DAI 会报告包含一个元素<2>
的矢量。请注意,如果某个 DAI 接受一个声道并在其所有输入/输出中输入/输出其内容(例如,立体声放大器为 2 个),则会报告包含一个元素<1>
的向量;如果该 DAI 支持一个或两个输入声道,则会报告一个包含两个元素<1,2>
的向量。 - 样本格式的向量。DAI 示例格式,例如
PCM_SIGNED
。 - 帧格式的矢量,例如
I2S
或TDM1
;或CUSTOM
选项,其中DaiFrameFormatCustom
单独指定帧配置的每个参数,例如frame_sync_size
和sclk_on_raising
。 - 费率矢量。帧速率,例如 44100、48000 和 96000。
- 每个插槽的位数。DAI 中每个槽的位数,例如每个槽位 32 位。
- 每个样本的位矢量。样本宽度,例如每个样本 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 个有效组合:
- 16 位插槽,具有 16 位样本
- 具有 32 位样本的 32 位插槽
- 32 位插槽,具有 16 位样本
GetRingBufferFormats
与流式传输接口 GetSupportedFormats
函数相同,请参阅音频流式传输接口。
CreateRingBuffer
在 CreateRingBuffer
函数中创建环形缓冲区时,客户端会同时指定要在 DAI 中使用的格式以及要在环形缓冲区中使用的格式。
DAI 格式参数指定了:
- 多个频道。这是 DAI 中的通道数(例如 TDM 总线上的通道数,即“传输线上的通道数”)。
- 使用位掩码的通道。这些是 DAI 中用于数据传输的通道。例如,如需指定 I2S DAI 中的两个频道,此值必须为 3。
- 示例格式。
- 帧格式。
- 帧速率。
- 每个插槽的位数。
- 每个样本的位数。
环形缓冲区格式参数与流式传输接口 CreateRingBuffer
函数相同,请参阅音频流式传输接口。
CreateRingBuffer
成功后,DAI 格式配置被视为已完成,RingBuffer
协议配置已完成并调用 RingBuffer
Start
函数后,即可通过 DAI 发送样本。
如需了解环形缓冲区功能,请参阅音频流式传输接口。
信号处理
定义请参见音频信号处理。