數位音訊介面 (DAI)

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 衍生而來)。
框架 在 DAI 中,代表資料中單一時間點的項目:影格同步和 sclk。
影格格式 影格資料、影格同步和 sclk 排列,例如影格同步位置相對於資料行中的樣本。
時段 在影格內,為取樣保留的位元。一個插槽可能比容納樣本所需的大小還大,例如 32 位元插槽可容納 24 位元或 16 位元樣本。
管道 單一音訊樣本的來源或目的地,通常由單一揚聲器算繪或由單一麥克風擷取。每個影格都會包含固定數量的槽,用於固定數量的管道。
範例 在特定時間記錄的聲音數位表示法。

基本操作

DAI 用戶端負責設定 DAI。提供 DAI 介面的驅動程式 (從此處的 DAI 驅動程式庫) 會宣傳支援的格式,並允許建立環緩衝區,用於音訊樣本傳輸。

請注意,DAI 驅動程式應自行執行關閉作業,就像其他驅動程式庫一樣 (請參閱「驅動程式」一節)。

通訊協定定義

DAI 通訊協定已在 FIDL 的 dai.fidldai_format.fidl 中定義。

由於 FDF 目前未提供直接取得 FIDL 管道進行通訊的方式,因此我們定義了透過 Banjo 取得管道的做法,位於 fuchsia.hardware.audio

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 的 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. 32 位元版位,含 16 位元樣本

GetRingBufferFormats

如同串流介面 GetSupportedFormats 函式,請參閱音訊串流介面

CreateRingBuffer

用戶端會在 CreateRingBuffer 函式中建立環形緩衝區時,指定在 DAI 中使用的格式和環形緩衝區使用的格式。

DAI 格式參數可指定:

  1. 多個管道。這是 DAI 中的通道數量 (例如 TDM 匯流排上的通道數量,也就是「在線」)。
  2. 要使用的位元遮罩管道。這些是 DAI 中用於資料傳輸的管道。例如,如要指定 I2S DAI 中的兩個通道,則必須為 3。
  3. 格式範例。
  4. 影格格式。
  5. 影格速率。
  6. 每個運算單元的位元數。
  7. 每個樣本的位元數。

環形緩衝區格式參數與串流介面 CreateRingBuffer 函式相同,請參閱 Audio Streaming Interface

CreateRingBuffer 成功後,系統會將 DAI 格式設定視為已完成,並在 RingBuffer 通訊協定設定完成及呼叫 RingBuffer Start 函式後,即可透過 DAI 傳送樣本。

如需環狀緩衝區功能的說明,請參閱 Audio Streaming 介面

訊號處理

請參閱「音訊信號處理」一節。