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 衍生而來)。 |
| Frame | 在資料中代表單一時間點,: DAI 中的影格同步和 sclk。 |
| 影格格式 | 影格的資料、影格同步和 sclk 排列,例如影格同步相對於資料行中樣本的位置。 |
| Slot | 在一個影格中,為樣本保留的位元。版位可能比容納樣本所需的大小更大,例如 32 位元版位容納 24 或 16 位元樣本。 |
| Channel | 音訊樣本的單一來源或目的地,通常由單一揚聲器算繪或單一麥克風擷取。每個影格都會在固定數量的時段中包含樣本,且通道數量也固定。 |
| 範例 | 在特定時間擷取聲音的數位表示法。 |
基本操作
DAI 用戶端負責設定 DAI。提供 DAI 介面的驅動程式 (以下簡稱 DAI 驅動程式庫) 會宣傳支援的格式,並允許建立 Ring Buffer,用於音訊樣本傳輸。
請注意,DAI 驅動程式應自行關閉,就像其他驅動程式庫一樣 (請參閱「驅動程式」一節)。
通訊協定定義
DAI 通訊協定定義於 FIDL 的 dai.fidl 和 dai_format.fidl。
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 支援 48 或 96 KHz 的 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 傳送樣本。
如需環狀緩衝區功能的說明,請參閱「音訊串流介面」。
信號處理
定義於「音訊訊號處理」。