轉碼器介面適用於轉碼器次於控制器驅動程式庫的情況。這個介面是編解碼器驅動程式公開的 FIDL 通訊協定。在這種安排中,轉碼器驅動程式不會直接公開串流介面,而是由控制器透過轉碼器介面進行設定。這份參考資料適用於驅動程式庫作者,定義了轉碼器驅動程式必須實作、控制器可使用的介面合約。
標記法和術語
本文件內容:
- 所有索引都從 0 開始。
- n 個元素的向量會以
<x0,x1,...,xn-1>表示,例如包含 5 和 6 兩個元素的向量會以<5,6>表示。 - 向量可以巢狀結構呈現,也就是說,
<<5,6>,<7,8>>代表內含 2 個向量的向量。
| 字詞 | 定義 |
|---|---|
| Channel | 音訊樣本的單一來源或目的地,通常由單一喇叭轉譯或由單一麥克風擷取。在 DAI 中,每個影格都會包含固定數量聲道的固定數量槽位樣本。 |
| Codec | 一種實體或虛擬裝置,可將訊號從數位/類比編碼/解碼為類比/數位,包括所有組合,例如數位到數位。轉碼器範例包括 DAC 放大器組合和 ADC 轉換器。 |
| Controller | 系統中管理音訊訊號的部分,例如 SOC 的音訊子系統或獨立音效卡。 |
| DAI | 數位音訊介面。音訊硬體之間的介面,例如控制器和轉碼器之間的 TDM 或 PDM 連結。 |
| Frame | DAI 中資料、影格同步和 sclk 的單一時間點表示法。 |
| 影格同步 | 標示影格邊界的 DAI 信號,又稱為 LRCLK、SYNC。 |
| 影格格式 | 影格的資料、影格同步和 sclk 排列,例如影格同步相對於資料行中樣本的位置。 |
| Mclk | 主時鐘:有時需要提供時鐘給轉碼器的 DAI 訊號。有時 Sclk 會用做 Mclk (或 Mclk 是從轉碼器中的 Sclk 衍生而來)。 |
| PDM | 脈衝密度調變。用於表示類比訊號的調變形式,例如用於數位麥克風介面。 |
| 範例 | 在特定時間擷取的聲音數位表示法。 |
| Sclk | 用於標記資料線位元傳輸的 DAI 信號:時鐘,也稱為 SCK、BCLK。 |
| Slot | 影格中保留給樣本的位元。版位可能比容納樣本所需的大小更大,例如 32 位元版位容納 24 或 16 位元樣本。 |
| TDM | 時分多工。將不同的資料串流多工處理至一個音訊介面,包括 Sclk、影格同步,以及輸入和輸出資料訊號。 |
基本操作
轉碼器提供的功能分為:
控制器負責設定及控制轉碼器。轉碼器會宣傳功能,而控制器會決定如何使用這些功能,如下所述。控制器可以控制轉碼器的狀態,例如透過重設函式。必須重設,轉碼器才能進入初始化狀態。請注意,轉碼器驅動程式應自行關閉,就像其他驅動程式庫一樣。
轉碼器是複合裝置,可為控制器提供轉碼器通訊協定。預期只有一個控制器會使用轉碼器的通訊協定,且一個控制器可能同時使用多個轉碼器。
simple-codec 程式庫可協助編寫及使用實作轉碼器通訊協定的簡易轉碼器驅動程式。
通訊協定定義
編解碼器通訊協定定義於 FIDL 的 codec.fidl。
許多轉碼器通訊協定作業都是「啟動後便不須控制」,也就是說,這些作業不會預期收到回覆。在收到函式的回覆之前,系統不會將具有回覆的轉碼器通訊協定作業視為已完成,且除非回覆包含狀態 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 允許 48KHz 的 32 位元樣本和 96KHz 的 16 位元樣本,但不允許 96KHz 的 32 位元樣本,則轉碼器會回覆 2 個 DaiSupportedFormats:<<32bits>,<48KHz>> 和 <<16bits>,<96KHz>>。為求簡單起見,本範例會忽略取樣率和每樣本位元數以外的參數。如果轉碼器支援 16 或 32 位元樣本,且取樣率為 48 或 96KHz,則轉碼器會回覆 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| 呼叫,直到插頭狀態與最近回報的狀態不同。
信號處理
定義請見音訊訊號處理。