数字音频接口 ( 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.fidl 和dai_format.fidl 中。
因为 FDF 当前不提供一种直接的方式来获取 FIDL 通道用于通信,所以我们定义了一个在fuchsia.hardware.audio中的Banjo 的方式来获取通道。
dai_connect.fidl提供直接连接 DAI 协议服务器。
复位{#reset}
DAI 可以通过一个客户端在任意时刻调用Reset
功能进行复位。
获取信息
GetInfo
可以从 DAI 中查询获取信息包括:
- 供应商名字。
- 产品名。
获取 DAI 格式
GetDaiFormats
函数允许 DAI 驱动列出它支持的 DAI 格式。支持的格式可能包括多采样格式,比率等。 DAI 驱动提供其支持的格式和他们客户端授权,即可以在CreateRingBuffer
功能中使用的格式。
DAI 驱动依赖DaiSupportedFormats
的向量,其中每个DaiSupportedFormats
包含:
- 通道数量的向量。列举了 DAI 支持的通道数量,例如
<2,4,6,8>
。一个立体声 DAI 报告了一个有一个元素的向量<2>
。注意占用一个通道并输出内容到所有它的输出器(例如,2个立体声扬声器)的 DAI 可能报告一个有一个元素的向量<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
允许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种有效的组合:
- 16比特槽,16比特采样
- 32比特槽,32比特采样
- 32比特槽,16比特采样
获取环形缓冲区格式
类似于流媒体接口GetSupportedFormats
功能,参见Audio Streaming Interface。
创建环形缓冲区
客户端同时定义了 DAI 中使用的格式和作为在CreateRingBuffer
函数中创建的环形缓冲区部分的环形缓冲。
DAI 格式参数定义:
- 通道数量。这是在 DAI 中的通道数量(例如在 TDM 总线上的通道数量,也就是“在线”)。
- 使用位掩码的通道。这是在 DAI 中使用的用于数据转移的通道。例如明确两个通道在 I2S DAI 中必须为3。
- 采样格式。
- 帧格式。
- 帧率
- 每个槽中的 bits 数量
- 每个采样的 bits 数量
环形缓冲区和流媒体接口CreateRingBuffer
的格式参数相同,详情参见Audio Streaming Interface。
一旦CreateRingBuffer
调用成功, DAI 格式配置就被认为是完成;一旦RingBuffer
协议配置完成, RingBuffer
的Start
函数被调用,采样结果可以通过 DAI 发送。
对于环形缓冲区功能的介绍,详情参见Audio Streaming Interface。