数字音频接口 ( DAI )

DAI 接口是 DAI 驱动暴露的 FIDL 接口。 DAI 接口控制音频数据传输的 DAI 连接配置。

注释和术语表

  • 所有指数都是从0开始。
  • 元素向量以<x0,x1,...,xn-1>方式来表示,例如一个包含两个元素5和6的向量表示为<5,6>
  • 向量可嵌套,例如<<5,6>,<7,8>>代表一个向量包含两个向量。
术语 定义
DAI 数字音频接口。接口位于音频硬件之间,例如在控制器和编解码器之间的 TDM 和 PDM 链接。
Frame Sync DAI 信号标记了帧的便捷,又称 LRCLK, SYNC。
Sclk DAI 信号用于标记数据链传输 bits,又称 SCK, BCLK 。
Mclk 主时钟, 有时需要一个 DAI 信号来为 DAI 提供一个时钟。有时 Sclk 被用作 Mclk(或者 Mclk 是 在 DAI 中起源于 sclk的
Frame 在不同的数据中对单一时间点的表述,在 DAI 中的帧同步和 sclk 。
Frame format 一帧的数据,帧同步和 sclk 约定,例如帧同步的位置,即数据线中的样本。
Slot 在一帧中, 样本预留的 bit 位。 一个槽中可能比容纳样品所需的大,例如:一个 32 bit 的槽中保留24或者16 bit 的样本。
Channel 单一源或目的地的音频样本,通常被一个单扬声器渲染或被单麦克风捕获。 在 DAI 的每一帧都将包含一个固定数量槽的样本对应相同固定数量的通道
Sample 特定时间获取的声音数字表示。

基本操作

DAI 客户端负责配置 DAI 。驱动提供 DAI 接口(从这里的 DAI 驱动程序),用于发布支持的格式和允许音频样本传输的环形缓冲区创建。

注意, DAI 驱动期望自己实现关机操作,就像任意的其他驱动程序一样。(参见 FDF )。

协议定义

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

因为 FDF 当前不提供一种直接的方式来获取 FIDL 通道用于通信,所以我们定义了一个在fuchsia.hardware.audio中的Banjo 的方式来获取通道。

dai_connect.fidl提供直接连接 DAI 协议服务器。

复位{#reset}

DAI 可以通过一个客户端在任意时刻调用Reset 功能进行复位。

获取信息

GetInfo可以从 DAI 中查询获取信息包括:

  1. 供应商名字。
  2. 产品名。

获取 DAI 格式

GetDaiFormats函数允许 DAI 驱动列出它支持的 DAI 格式。支持的格式可能包括多采样格式,比率等。 DAI 驱动提供其支持的格式和他们客户端授权,即可以在CreateRingBuffer功能中使用的格式。

DAI 驱动依赖DaiSupportedFormats的向量,其中每个DaiSupportedFormats包含:

  1. 通道数量的向量。列举了 DAI 支持的通道数量,例如 <2,4,6,8>。一个立体声 DAI 报告了一个有一个元素的向量 <2>。注意占用一个通道并输出内容到所有它的输出器(例如,2个立体声扬声器)的 DAI 可能报告一个有一个元素的向量<1>,如果它支持一个或两个输入通道,那么它会报告一个两个元素的向量<1,2>
  2. 样本格式的向量。 DAI 样本格式,例如PCM_SIGNED
  3. 框架格式的向量。例如I2S或者TDM1,或者CUSTOM选项,其中DaiFrameFormatCustom定义了帧单独配置的每一个参数。例如frame_sync_sizesclk_on_raising
  4. 采样率向量。单帧采样率,例如44100,48000和96000。
  5. 每个槽的比特数。在 DAI 中每个槽中的比特数,例如每个槽32比特。
  6. 每个样本的比特向量。采样宽度,例如每个样本24比特。

在单独的DaiSupportedFormats中,提供参数的任意组合都是可支持的。

当 DAI 支持的所有组不能用一个DaiSupportedFormats来描述时, DAI 在返回向量中返回超过一个DaiSupportedFormats。假如一个DaiSupportedFormats允许32比特的采样频率为48KHz,和一个16比特的采样频率为96KHz,但不允许32比特的采样频率为96KHz,然后 DAI 将回复两个 DaiSupportedFormats: <<32bits>,<48KHz>><<16bits>,<96KHz>>的结果。为了简单起见,示例将忽略其他参数,包括速率和每个采样位数。在 DAI 支持16或者32比特样本在48或96KHz的场景中, DAI 将回复一个DaiSupportedFormats: <<16bits,32bits>,<48KHz,96KHz>>作为返回值。

另外,假设每个样本的比特总是小于等于每个槽的比特。因此编解码器可以报告<<16bits_per_slot,32bits_per_slot>,<16bits_per_sample,32bits_per_sample>>,并且这并不表明报告的每个样本32比特在16比特的样本上是有效的,它只规定了3种有效的组合:

  1. 16比特槽,16比特采样
  2. 32比特槽,32比特采样
  3. 32比特槽,16比特采样

获取环形缓冲区格式

类似于流媒体接口GetSupportedFormats 功能,参见Audio Streaming Interface

创建环形缓冲区

客户端同时定义了 DAI 中使用的格式和作为在CreateRingBuffer函数中创建的环形缓冲区部分的环形缓冲。

DAI 格式参数定义:

  1. 通道数量。这是在 DAI 中的通道数量(例如在 TDM 总线上的通道数量,也就是“在线”)。
  2. 使用位掩码的通道。这是在 DAI 中使用的用于数据转移的通道。例如明确两个通道在 I2S DAI 中必须为3。
  3. 采样格式。
  4. 帧格式。
  5. 帧率
  6. 每个槽中的 bits 数量
  7. 每个采样的 bits 数量

环形缓冲区和流媒体接口CreateRingBuffer的格式参数相同,详情参见Audio Streaming Interface

一旦CreateRingBuffer调用成功, DAI 格式配置就被认为是完成;一旦RingBuffer协议配置完成, RingBufferStart函数被调用,采样结果可以通过 DAI 发送。

对于环形缓冲区功能的介绍,详情参见Audio Streaming Interface