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.fidl 和 dai_format.fidl 中定義。
由於 FDF 目前未提供直接取得 FIDL 管道進行通訊的方式,因此我們定義了透過 Banjo 取得管道的做法,位於 fuchsia.hardware.audio。
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 或 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 位元樣本
- 32 位元版位,含 16 位元樣本
GetRingBufferFormats
如同串流介面 GetSupportedFormats
函式,請參閱音訊串流介面。
CreateRingBuffer
用戶端會在 CreateRingBuffer
函式中建立環形緩衝區時,指定在 DAI 中使用的格式和環形緩衝區使用的格式。
DAI 格式參數可指定:
- 多個管道。這是 DAI 中的通道數量 (例如 TDM 匯流排上的通道數量,也就是「在線」)。
- 要使用的位元遮罩管道。這些是 DAI 中用於資料傳輸的管道。例如,如要指定 I2S DAI 中的兩個通道,則必須為 3。
- 格式範例。
- 影格格式。
- 影格速率。
- 每個運算單元的位元數。
- 每個樣本的位元數。
環形緩衝區格式參數與串流介面 CreateRingBuffer
函式相同,請參閱 Audio Streaming Interface。
CreateRingBuffer
成功後,系統會將 DAI 格式設定視為已完成,並在 RingBuffer
通訊協定設定完成及呼叫 RingBuffer
Start
函式後,即可透過 DAI 傳送樣本。
如需環狀緩衝區功能的說明,請參閱 Audio Streaming 介面。
訊號處理
請參閱「音訊信號處理」一節。