DAI 介面是 DAI 驅動程式公開的 FIDL 通訊協定。DAI 介面可控制用於音訊資料移轉的 DAI 連結設定。
標記與術語
- 所有索引皆從 0 開始。
- n 元素的向量會以
<x0,x1,...,xn-1>
表示,例如有兩個元素 5 和 6 的向量為<5,6>
。 - 向量可以是巢狀,例如
<<5,6>,<7,8>>
代表包含 2 個向量的向量。
字詞 | 定義 |
---|---|
DAI | 數位音訊介面。音訊 HW 介面,例如控制器與轉碼器之間的 TDM 或 PDM 連結。 |
影格同步 | 標記影格邊界的 DAI 信號 (a.k.a. LRCLK, SYNC)。 |
Sclk | 用於標記資料行位元傳輸的 DAI 信號:如 SCK、BCLK。 |
麥克 | 主要時鐘,有時需要 DAI 信號,以便提供 DAI 的時鐘。有時 Sclk 會用做 Mclk,或 Mclk 從 DAI 的 Sclk 中取得。 |
頁框 | 資料中的單一時間點表示法:DAI 同步影格和 sclk。 |
影格格式 | 影格的資料、影格同步和捲動排列,例如影格同步的位置,以及資料行中的樣本。 |
版位 | 影格中會保留樣本的位元。運算單元可能比保存樣本所需還要大,例如可容納 24 或 16 位元樣本的 32 位元運算單元。 |
頻道 | 音訊樣本的單一來源或目的地,通常是由單一喇叭轉譯,或由單一麥克風擷取。每個影格都會包含相同數量管道的固定運算單元數量樣本。 |
範例 | 在特定時間以數位方式呈現的聲音。 |
基本作業
DAI 用戶端負責設定 DAI。提供 DAI 介面的驅動程式 (從此處位於 DAI 驅動程式庫) 會宣傳支援的格式,並允許建立 Ring 緩衝區來傳輸音訊樣本。
請注意,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 和 96KHz 之間提供 32 位元樣本,以及 96KHz 的 16 位元樣本,但不支援在 96KHz 的 32 位元樣本,則 DAI 會使用 2 個 DaiSupportedFormats
:<<32bits>,<48KHz>>
和 <<16bits>,<96KHz>>
回應。為求簡單起見,這個範例忽略頻率和每個樣本位元以外的參數。如果 DAI 支援 48 或 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 位元運算單元
- 含有 16 位元樣本的 32 位元運算單元
GetRingBufferFormats
與串流介面 GetSupportedFormats
函式相同,請參閱音訊串流介面。
CreateRingBuffer
用戶端在建立 CreateRingBuffer
函式環形緩衝區的過程中,會指定在 DAI 中使用的格式和用於環形緩衝區的格式。
DAI 格式參數會指定:
- 多個頻道。這是指 DAI 中的頻道數 (例如 TDM 匯流排上的頻道數,例如「傳輸中」)。
- 使用位元遮罩的頻道。這些是 DAI 中用於資料移轉的管道。舉例來說,如要指定 I2S DAI 中的兩個管道都必須為 3。
- 範例格式。
- 影格格式。
- 畫面更新率。
- 每個運算單元的位元數。
- 每個樣本的數量位元。
環形緩衝區格式參數與串流介面 CreateRingBuffer
函式相同,請參閱音訊串流介面。
成功 CreateRingBuffer
後,系統會將 DAI 格式設定視為已完成,而且一旦 RingBuffer
通訊協定設定完成並呼叫 RingBuffer
Start
函式後,就可以透過 DAI 傳送樣本。
如需環形緩衝區功能的說明,請參閱音訊串流介面。
信號處理
定義於音訊訊號處理步驟。