當編解碼器是控制器驅動程式庫的次要項目時,應使用編解碼器介面。這個介面是編解碼驅動程式公開的 FIDL 通訊協定。在這種安排中,編解碼驅動程式不會直接公開串流介面,而是由控制器透過編解碼介面進行設定。這是驅動程式庫作者的參考資料,定義了編解碼驅動程式必須實作且控制器可使用的介面合約。
符號和術語
本文內容:
- 所有索引都從 0 開始。
- n 個元素的向量會以
<x0,x1,...,xn-1>
表示,例如包含 5 和 6 兩個元素的向量為<5,6>
。 - 向量可嵌套,也就是說
<<5,6>,<7,8>>
代表含有 2 個向量的向量。
字詞 | 定義 |
---|---|
管道 | 單一音訊樣本的來源或目的地,通常由單一揚聲器算繪或由單一麥克風擷取。在 DAI 中,每個影格都會包含固定數量的槽,用於固定數量的管道。 |
轉碼器 | 實體或虛擬裝置,可將數位/類比信號編碼/解碼,包括所有組合,例如數位到數位。轉碼器的範例包括 DAC 擴大器組合和 ADC 轉換器。 |
控制器 | 系統中管理音訊訊號的部分,例如 SOC 的音訊子系統或獨立音效卡。 |
DAI | 數位音訊介面。音訊硬體之間的介面,例如控制器和編解碼器之間的 TDM 或 PDM 連結。 |
框架 | 在 DAI 中,代表資料中單一時間點的項目:影格同步和 sclk。 |
影格同步 | 標示影格邊界的 DAI 信號,又稱為 LRCLK、SYNC。 |
影格格式 | 影格資料、影格同步和 sclk 排列,例如影格同步位置相對於資料行中的樣本。 |
Mclk | 主時鐘,有時需要 DAI 信號才能為編解碼提供時鐘。有時會使用 Sclk 做為 Mclk (或 Mclk 是從編解碼器中的 Sclk 衍生而來)。 |
PDM | 脈衝密度調變。用於表示類比訊號的調變形式,例如在數位麥克風介面中使用。 |
範例 | 在特定時間記錄的聲音數位表示法。 |
Sclk | 用於標示資料線位元傳輸的 DAI 信號:時脈(又稱 SCK、BCLK)。 |
時段 | 在影格內,為取樣保留的位元。一個插槽可能比容納樣本所需的容量還大,例如 32 位元插槽可容納 24 位元或 16 位元樣本。 |
TDM | 時間分割多工處理。將不同資料串流匯集至單一音訊介面,包括 Sclk、影格同步和輸入/輸出資料訊號。 |
基本操作
編解碼提供的功能分為以下幾種:
控制器負責設定及控制編解碼。編解碼會宣傳功能,而控制器會決定如何使用這些功能,如下所述。控制器可以控制編解碼器的狀態,例如透過重設函式。必須重設才能將編解碼設為初始化狀態。請注意,編解碼驅動程式應自行執行關閉作業,就像其他驅動程式庫一樣。
編解碼是複合裝置,可為控制器提供編解碼通訊協定。預期只有一個控制器會使用編解碼的通訊協定,且一個控制器可能會同時使用多個編解碼。
simple-codec 程式庫可協助您編寫及使用實作編碼器通訊協定的簡易編碼器驅動程式。
通訊協定定義
編解碼器通訊協定會在 codec.fidl 中定義於 FIDL。
請注意,由於 FDF 目前未提供直接取得通訊用 FIDL 管道的方式,因此我們定義了透過 fuchsia.hardware.audio 的 Banjo 取得管道的方式。
許多編解碼器通訊協定作業都是「發送後即忘」,也就是不會預期回覆。Codec 通訊協定作業會在收到函式的回應後才視為完成,且除非回應包含狀態 ZX_OK
,否則不會視為成功完成。
主要控制項
控制器可隨時發出 Reset
函式,藉此重設編解碼。
GetInfo
函式會從編解碼器擷取資訊,包括:
- 編解碼單元的專屬永久 ID,例如序號或連線路徑。
- 製造商名稱。
- 產品名稱。
您隨時可以使用 Start
和 Stop
函式啟動和停止編解碼器作業。根據預設,編解碼器狀態會停止,因此必須至少發出一次「Start」才能讓編解碼器完全運作。停止編碼器作業可用於安全地變更 DAI 設定,避免編碼器作業出現異常或錯誤。
橋接模式
在啟動期間,驅動程式庫可能會或可能不會設為在橋接模式下設定裝置。驅動程式只會宣傳驅動程式庫在目前設定模式中支援的 DAI 格式。因此,支援的 DAI 格式清單可能會因驅動程式庫啟動設定而異。
DAI 格式
DAI 格式相關的通訊協定函式可讓編解碼器列出其支援的 DAI 格式。支援的格式可能包括多個取樣格式、速率等。每個編解碼都會宣告可支援的內容,而控制器會規定每個編解碼應使用的 DAI 格式。
如要瞭解特定編解碼支援哪些格式,控制器會使用 GetDaiFormats
函式。編碼器會以 DaiSupportedFormats
向量回應,其中每個 DaiSupportedFormats
包含:
- 頻道數量的向量。這會列出編解碼支援的通道數量,例如
<2,4,6,8>
。立體聲編碼器會回報含有一個元素<2>
的向量。請注意,如果編解碼器採用一個管道,並透過所有輸出端輸出內容 (例如立體擴大機的 2 個輸出端),就會回報含有一個元素<1>
的向量;如果編解碼器支援一個或兩個輸入頻道,就會回報含有兩個元素<1,2>
的向量。 - 範例格式的向量。DAI 取樣格式,例如
PCM_SIGNED
。 - 影格格式的向量,例如
STEREO_LEFT
和STEREO_RIGHT
。 - 費率向量。畫面更新率,例如 44100、48000 和 96000。
- 每個運算單元的位元數。DAI 中每個插槽的位元數,例如每個插槽 32 位元。
- 每個樣本的位元向量。樣本寬度,例如每個樣本 24 位元。
如果編解碼支援的組合無法全部用一個 DaiSupportedFormats
描述,編解碼會在傳回的向量中傳回多個 DaiSupportedFormats
。
舉例來說,如果一個 DaiSupportedFormats
允許 48 kHz 的 32 位元樣本和 96 kHz 的 16 位元樣本,但不允許 96 kHz 的 32 位元樣本,編解碼器就會回傳 2 個 DaiSupportedFormats
:<<32bits>,<48KHz>>
和 <<16bits>,<96KHz>>
。為求簡單起見,本範例會略過速率和每個樣本的位元以外的參數。如果編解碼器支援 48 或 96KHz 的 16 位元或 32 位元樣本,則會回覆 1 DaiSupportedFormats
:<<16bits,32bits>,<48KHz,96KHz>>
。
此外,假設每個樣本的位元數一律小於或等於每個時段的位元數。因此,編解碼器可以回報 <<16bits_per_slot,32bits_per_slot>,<16bits_per_sample,32bits_per_sample>>
,但這並不表示它會回報 16 位元取樣中每個取樣的 32 位元有效,它只會指定 3 個有效組合:
- 16 位元版位搭配 16 位元樣本
- 32 位元插槽,含 32 位元樣本
- 32 位元版位,含 16 位元樣本
控制器會使用 IsBridgeable
和 GetDaiFormat
中的編解碼提供的資訊、控制器支援的內容,以及任何其他需求,透過 SetDaiFormat
函式指定在 DAI 中使用的格式。這個函式會採用指定下列項目的參數:
- 多個管道。這是 DAI 中要使用的通道數量 (例如 TDM 匯流排上的通道數量,也就是「在線」)。如為 I2S,則必須為 2。
- 要使用的管道向量。這些是編碼器要使用的 DAI 中的頻道。對於 I2S,此向量必須包含 2 個索引
<0,1>
,也就是同時使用左聲道和右聲道。在橋接模式中,這項功能只會列出編解碼器要使用的一個管道,例如編解碼器的立體聲擴大器輸出內容,會橋接至 I2S DAI 右管道的一組電氣式單聲道輸出內容,因此只會列出<1>
管道。如果未橋接,則具有多個電氣輸出的編解碼 (在SetDaiFormat
中以單一管道設定) 應會在所有輸出端複製此單聲輸入端的樣本。 - 格式範例。
- 影格格式。
- 影格速率。
- 每個運算單元的位元數。
- 每個樣本的位元數。
SetDaiFormat
成功後,系統會視為 DAI 格式設定已完成,並可透過 DAI 傳送樣本。
增強控制
任何指定編解碼會在 GainFormat
結構體中回應 GetGainFormat
函式,以便取得相關支援。控制器可使用 SetGainState
函式,控制編碼器中的增益、靜音和 AGC 狀態。
用戶端可以使用 WatchGainState
指令,要求編解碼器傳送增益狀態變更的非同步通知。驅動程式會回覆用戶端傳送的第一個 |WatchGainState|,且在增益狀態變更為最近回報的狀態之前,不會回應後續的用戶端 |WatchGainState| 呼叫。
插電偵測
如果驅動程式庫在 GetPlugDetectCapabilites
中傳送 CAN_ASYNC_NOTIFY
標記,用戶端可以要求編解碼透過 WatchPlugState
指令,以非同步方式傳送插頭狀態變更通知。未設定 CAN_ASYNC_NOTIFY
標記的編解碼驅動程式可以自由忽略由用戶端傳送的 WatchPlugState
。設定 CAN_ASYNC_NOTIFY
的驅動程式會回覆用戶端傳送的第一個 |WatchPlugState|,且在插頭狀態變更為最近一次回報的狀態前,不會回應後續的用戶端 |WatchPlugState| 呼叫。
訊號處理
請參閱「音訊信號處理」一節。