数字音频接口 (DAI)

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.fidldai_format.fidl 中定义。

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

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

重置

客户端可以随时通过发出 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>;如果它支持一个或两个输入声道,则会报告一个包含两个元素的矢量 <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 支持 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 种有效组合:

  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 发送选段。

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

信号处理

音频信号处理中所定义。