數位音訊介面 (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 衍生而來)。
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 擷取資訊,包括:

  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. 影格格式的向量,例如 I2S 或 TDM1,或 CUSTOM 選項,其中 DaiFrameFormatCustom 分別指定影格設定的每個參數,例如 frame_sync_size 和 sclk_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 或 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 種有效組合:

  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 函式相同,請參閱「音訊串流介面」。

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

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

信號處理

定義於「音訊訊號處理」。