音訊轉碼器介面

轉碼器介面適合用於控制器驅動程式庫次要時。這個介面是由轉碼器驅動程式公開的 FIDL 通訊協定。在此配置中,轉碼器驅動程式不會直接公開串流介面,而是透過控制器的轉碼器介面來設定轉碼器。此為驅動程式庫作者的參考資料,定義了轉碼器驅動程式必須實作的介面合約,以及控制器可使用的介面合約。

標記與術語

在本文件中:

  • 所有索引皆從 0 開始。
  • n 元素的向量會以 <x0,x1,...,xn-1> 表示,例如有兩個元素 5 和 6 的向量為 <5,6>
  • 向量可以是巢狀,例如 <<5,6>,<7,8>> 代表包含 2 個向量的向量。
字詞 定義
頻道 音訊樣本的單一來源或目的地,通常是由單一喇叭轉譯,或由單一麥克風擷取。在 DAI 中,每個影格都會包含相同數量管道的固定運算單元數量樣本。
轉碼器 實體或虛擬裝置,對數位/類比/數位管道的訊號進行編碼/解碼,包括所有組合 (例如數位與數位組合)。程式碼範例包括 DAC 擴大器組合和 ADC 轉換器。
控制器 管理音訊訊號的系統部分,例如 SOC 音訊子系統或獨立音效卡。
DAI 數位音訊介面。音訊 HW 介面,例如控制器與轉碼器之間的 TDM 或 PDM 連結。
頁框 資料中的單一時間點表示法:DAI 同步影格和 sclk。
影格同步 標記影格邊界的 DAI 信號 (a.k.a. LRCLK, SYNC)。
影格格式 影格的資料、影格同步和捲動排列,例如影格同步的位置,以及資料行中的樣本。
麥克 主要時鐘,有時需要 DAI 信號來提供轉碼器。有時 Sclk 會用做 Mclk (或 Mclk 從轉碼器中的 Sclk) 取得)。
產品經理 Pulse-Density 調性。用來表示類比訊號的模組,例如用於數位麥克風介面
範例 在特定時間以數位方式呈現的聲音。
Sclk 用於標記資料行位元傳輸的 DAI 信號:時鐘、a.k.a. SCK、BCLK。
版位 影格中會保留樣本的位元。運算單元可能比保存樣本所需還要大,例如可容納 24 或 16 位元樣本的 32 位元運算單元。
技術開發主管 多工處理。將不同的資料串流至單一音訊介面,包括 Sclk、Frame Sync 和輸入和輸出資料信號。

基本操作

轉碼器所提供的功能分為以下幾個部分:

這個控制器會負責設定及控制轉碼器。轉碼器會通告功能,控制器則會決定這些功能的使用方式,如下所述。控制器可控制轉碼器的狀態,例如透過重設函式。需要重設才能將轉碼器取得初始化狀態。請注意,轉碼器驅動程式應自行執行關閉作業,就像任何其他驅動程式庫一樣。

轉碼器是能為控制器提供轉碼器通訊協定的複合裝置。預期只有一個控制器會使用轉碼器的通訊協定,且一個控制器可以一次使用多個轉碼器。

simple-codec 程式庫可協助您編寫及使用實作轉碼器通訊協定的簡易轉碼器驅動程式。

通訊協定定義

轉碼器通訊協定是在 FIDL 的 codec.fidl 中定義。

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

許多轉碼器通訊協定作業都是「fire-and-forget」,也就是系統預期不會做出回覆。除非收到函式回覆,否則系統不會將包含回覆的 Codec 通訊協定作業視為已完成。除非回覆包含 ZX_OK 狀態,否則系統不會將作業視為已完成。

主要控制項

控制器可隨時發出 Reset 函式來重設轉碼器。

GetInfo 函式會從轉碼器擷取資訊,包括:

  1. 轉碼器單元的專屬永久 ID,例如序號或連線路徑。
  2. 製造商名稱。
  3. 產品名稱。

您可以隨時使用 StartStop 函式啟動及停止轉碼器作業。轉碼器狀態預設為停止,因此「Start」必須發出至少一次,轉碼器才能完全運作。您可以停止轉碼器作業,例如安全地變更 DAI 設定,避免轉碼器作業中出現故障或錯誤。

橋接模式

驅動程式庫在啟動時不一定能設為處於橋接模式的裝置。驅動程式只會在目前設定的模式中通告驅動程式庫支援的 DAI 格式。因此,支援的 DAI 格式清單可能會因驅動程式庫啟動設定而異。

DAI 格式

DAI 格式相關的通訊協定函式可讓轉碼器列出其支援的 DAI 格式。支援的格式可能包含多種取樣格式和費率等。每個轉碼器均會宣傳可支援的內容,控制器要求每個轉碼器使用哪種 DAI 格式。

為了找出特定轉碼器支援哪些格式,控制器會使用 GetDaiFormats 函式。轉碼器以 DaiSupportedFormats 向量回應,其中每個 DaiSupportedFormats 都包含:

  1. 管道數量的向量。這會列出轉碼器支援的頻道數,例如 <2,4,6,8>。立體聲轉碼器回報含有一個元素 <2> 的向量。請注意,如果轉碼器取得一個管道,並在所有輸出內容中輸出其內容 (例如,2 代表立體聲擴大器的 2),其向量如果支援一或兩個輸入聲道,就會回報具有一個元素 <1> 的向量,如果編碼器支援一或兩個輸入聲道,就會回報具有兩個元素 <1,2> 的向量。
  2. 範例格式的向量。DAI 範例格式,例如 PCM_SIGNED
  3. 影格格式的向量,例如 STEREO_LEFTSTEREO_RIGHT
  4. 費率向量。畫面更新率,例如 44100、48000 和 96000。
  5. 每個運算單元的位元數。DAI 中每個版位的位元數,例如每個版位 32 位元。
  6. 每個樣本位元的向量。寬度範例,例如每個樣本 24 位元。

當轉碼器支援的所有組合都無法以一個 DaiSupportedFormats 描述時,轉碼器會在傳回的向量中傳回多個 DaiSupportedFormats

舉例來說,如果一個 DaiSupportedFormats 允許以 48KHz 及 96KHz 接收 32 位元樣本和 96KHz 的 16 位元樣本,但不支援在 96KHz 的 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 個有效組合:

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

控制器會使用 IsBridgeableGetDaiFormat 中轉碼器提供的資訊、控制器支援的資訊以及任何其他要求,藉此指定要搭配 SetDaiFormat 函式在 DAI 中使用的格式。此函式採用的參數會指定:

  1. 多個頻道。這是指可在 DAI 中使用的通道數量 (例如 TDM 匯流排上的聲道數,例如「接線」)。如果是 I2S,這個值必須是 2。
  2. 要使用的管道向量。這些是 DAI 中供轉碼器使用的管道。如果是 I2S,這必須是包含 2 個索引 <0,1> 的向量,也就是同時使用左側和右側管道。在橋接模式中,系統只會列出轉碼器要使用的一個管道,例如轉碼器的立體聲擴大器輸出內容從 I2S DAI 的右管道輸出至一個電子單聲道輸出,只會列出 <1> 管道。如未橋接,在 SetDaiFormat 中使用一個管道設定並有多個電子輸出的轉碼器,預期會在所有輸出內容複製這個單聲道輸入中的範例。
  3. 範例格式。
  4. 影格格式。
  5. 畫面更新率。
  6. 每個運算單元的位元數。
  7. 每個樣本的數量位元。

成功 SetDaiFormat 後,系統會將 DAI 格式設定視為已完成,並將樣本傳送到 DAI。

增強控制

由轉碼器傳回相關支援,用於回應 GainFormat 結構中的 GetGainFormat 函式。控制器可使用 SetGainState 函式,控制轉碼器中的增減和 AGC 狀態。

用戶端可以使用 WatchGainState 指令,要求轉碼器傳送有關狀態變更的非同步通知。驅動程式會回應用戶端傳送的第一則 |WatchGainState|,但不會回應後續的用戶端 |WatchGainState| 呼叫,直到取得最近回報的狀態變更為止。

插頭偵測

如果 GetPlugDetectCapabilites 中的驅動程式庫傳送 CAN_ASYNC_NOTIFY 標記,用戶端可以使用 WatchPlugState 指令,要求轉碼器,傳送有關插入狀態變更的非同步通知。針對未設定 CAN_ASYNC_NOTIFY 標記的轉碼器,驅動程式可自由忽略由用戶端傳送的 WatchPlugState。已設定 CAN_ASYNC_NOTIFY 的驅動程式會回覆用戶端傳送的第一個 |WatchPlugState|,且不會回應後續的用戶端 |WatchPlugState| 呼叫直到外掛程式狀態與最近回報的內容改變為止。

信號處理

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