數位音訊介面 (DAI)

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

由於 FDF 目前並未提供直接取得 FIDL 管道的通訊方式,因此我們定義了透過 fuchsia.hardware.audioBanjo 取得頻道的方式。

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 和 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 個有效組合:

  1. 含有 16 位元樣本的 16 位元運算單元
  2. 含有 32 位元樣本的 32 位元運算單元
  3. 含有 16 位元樣本的 32 位元運算單元

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 傳送樣本。

如需環形緩衝區功能的說明,請參閱音訊串流介面

信號處理

定義於音訊訊號處理步驟。