DAI 接口是 DAI 驱动程序公开的 FIDL 协议。DAI 接口用于控制 DAI 链接的配置,以便传输音频数据。
符号和术语
- 所有索引均从 0 开始。
- 包含 n 个元素的矢量表示为
<x0,x1,...,xn-1>,例如,包含两个元素 5 和 6 的矢量表示为<5,6>。 - 矢量可以嵌套,即
<<5,6>,<7,8>>表示包含 2 个矢量的矢量。
| 术语 | 定义 |
|---|---|
| DAI | 数字音频接口。音频硬件之间的接口,例如控制器和编解码器之间的 TDM 或 PDM 链接。 |
| 帧同步 | 用于标记帧边界的 DAI 信号,也称为 LRCLK、SYNC。 |
| Sclk | 用于标记数据线位传输的 DAI 信号,也称为 SCK、BCLK。 |
| Mclk | 主时钟,有时需要使用 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_connector.fidl 提供与 DAI 协议服务器的直接连接。
重置
客户端可以随时通过发出 Reset 函数来重置 DAI。
GetInfo
GetInfo 函数会从 DAI 检索信息,包括:
- 制造商名称。
- 商品名称。
GetDaiFormats
借助 GetDaiFormats 函数,DAI 驱动程序可以列出其支持的 DAI 格式。支持的格式可能包括多个采样格式、速率等。DAI 驱动程序提供支持的格式,其客户端强制要求在 CreateRingBuffer 函数中使用哪种格式。
DAI 驱动程序会以 DaiSupportedFormats 的矢量进行响应,其中每个 DaiSupportedFormats 都包含:
- 频道数的矢量。此字段列出了 DAI 支持的通道数量,例如
<2,4,6,8>。立体声 DAI 会报告一个元素为<2>的矢量。请注意,如果 DAI 采用一个声道,并在其所有输入/输出(例如立体声放大器的 2 个)中输入/输出其内容,则会报告一个包含一个元素的矢量<1>;如果它支持一个或两个输入声道,则会报告一个包含两个元素的矢量<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 支持 48KHz 或 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 发送选段。
如需了解环形缓冲区功能,请参阅音频流式传输接口。
信号处理
如音频信号处理中所定义。