音訊訊號處理

總覽

訊號處理介面可供音訊複合驅動程式使用。 這個介面 SignalProcessing 是由 Composite 通訊協定用於提供的 FIDL 通訊協定 以及音訊訊號處理功能

SignalProcessing 通訊協定是用於控制訊號處理硬體及其 拓撲我們將處理元素 (PE) 定義為提供的音訊資料處理邏輯單元 我們將拓撲定義為管道中 PE 的安排方式, 所有控制項

SignalProcessing 通訊協定可讓硬體廠商以穩定版實作驅動程式 應用程式二進位檔介面 (ABI),並讓系統整合商設定驅動程式以執行 在執行階段使用這些介面,視系統或產品需求而定 儲存空間設定

SignalProcessing 通訊協定構成 Reader 信號處理通訊協定。信號處理 只會擷取資訊的方法包含在 Reader 通訊協定中,其他的方法包含在 SignalProcessing 通訊協定本身。這個區隔可讓這個介面的用戶端 如果要求提供唯讀,Reader 會將信號處理通訊協定加入自己的通訊協定 功能子集

SignalProcessing 通訊協定和相關定義包含在 fuchsia.hardware.audio.signalprocessing FIDL 程式庫。

拓撲

每個驅動程式庫都有專屬的拓撲。驅動程式可從應用程式拓撲中提取 視特定設定或產品的需求時,由其他驅動程式公開。請注意 但不一定要向應用程式公開拓撲,尤其是 audio_core

注意:

  • 拓撲並不是用來完整說明音訊管道狀態/格式/設定 每一位產品專家的實際經驗目的在於說明用戶端可以變更/重新排列的項目 可依知識、設定 (例如來自中繼資料) 和特定商業邏輯執行。
  • 提供 Composite 通訊協定的音訊驅動程式使用的拓撲必須包含 ENDPOINT 為驅動程式庫支援的環形緩衝區和 DAI 互連網路提供 ID。

處理元素

PE (在 fuchsia.hardware.audio.signalprocessing FIDL 程式庫中定義為 Element) 應由特定驅動程式庫管理的硬體提供功能 ( 模擬軟體和其他驅動程式庫功能)。管道是由一或多位 PE 組成 且拓撲是由一或多個管道組成

我們將伺服器視為提供信號處理通訊協定的驅動程式庫。 我們稱客戶為功能的使用者,例如使用 audio_core 之類的應用程式。

基本作業

用戶端必須負責要求,並設定任何信號處理功能。 伺服器回覆客戶的 GetElements 提供 PE 後,用戶端 發出 WatchElement 呼叫 (請參閱「懸掛取得模式」),以擷取 以便視需要動態控制 PE 參數,例如 PE 狀態和 SetElementState。適用對象 執行個體,如要擷取 type GAIN 中 PE 的 gain,用戶端問題 WatchElement 呼叫,用於擷取初始狀態 (驅動程式庫會回覆 第一個 WatchElement),以及後續接收更新的通知 移至包含 gainElementState。同樣地,擷取 PE 狀態 type EQUALIZERbands_state 由多個錶帶組成,用戶端會 發出 WatchElement,以便擷取初始狀態 (驅動程式庫會回覆 第一個 WatchElement),包括用於以下執行個體的 frequency 欄位:frequency 每個錶帶

伺服器透過回覆用戶端的 GetElements 提供 PE 後,用戶端 可能會使用 GetTopologies 方法要求可用的拓撲。如果有多個拓撲 GetTopologies 傳回的,則 SetTopology 可用於挑選要使用的拓撲。

GetElements

GetElements 可讓您視需要取得所有 PE 的清單。舉例來說,這個方法 由用戶端在抽象的硬體轉碼器上呼叫。已知產品專家清單上 用戶端可能會根據 PE 類型公開的參數來設定 PE。

SetElementState

SetElementState 可讓用戶端使用 GetElements。不同類型的 PE 可能會向用戶端公開不同的狀態, SetElementState 參數 state 的類型會因 PE 類型而異。

WatchElement

WatchElement 可讓用戶端使用 GetElements。不同類型的 PE 可能會向用戶端公開不同的狀態, WatchElement 參數 state 的類型會因 PE 類型而異。

產品專家的 state 由用戶端透過呼叫 SetElement,或者呼叫 SetElement 不同 PE,或完全獨立於用戶端 (例如插頭偵測變更) 之外。

GetTopologies

GetTopologies 可讓您視需要取得拓撲清單。舉例來說, 由用戶端在抽象的硬體轉碼器上呼叫。確認拓撲清單後 用戶端則可能會將伺服器設為使用特定拓撲。

SetTopology

SetTopology 可讓用戶端控制伺服器使用的拓撲。僅限 1 個 您隨時可以選取拓撲

處理元素類型

GetElements 傳回的 PE 支援多種信號處理 由產品專家類型和參數定義PE 類型定義了標準信號處理方式 (例如 GAINDELAYEQUALIZER 等)、供應商專屬的信號處理 (VENDOR_SPECIFIC 例如,不是 SignalProcessing 通訊協定中定義的) 和 CONNECTION_POINT/ENDPOINT,用來建構 多管道拓撲 (允許管道開始、結束、轉送及混合定義,請參閱 請參閱下方的連線點端點})。

每位 PE 可能會有一或多個輸入內容,以及一或多個輸出管道。對於轉送和 因為 PE 可能會提供不同的輸出管道和輸入管道的數量。

PE 可能會變更各個管道的資料 (也就是處理的信號)。例如 表示管道中有 AGL 類型的單一 PE,其中包含 ENDPOINT 類型的 DAI_INTERCONNECTDaiFormat number_of_channels 設為 2,然後 AGL (自動增益) 限制) 可呼叫 SetElementState 來啟用或停用 2 個管道 state enable 設為 true 或 false (假設已設定 AGL Elements can_disable 設為 true)。

如果不包含不同 PE 類型中的選填欄位,請輸入處理狀態 則不會變更特定欄位的相關元素。舉例來說 SetElement 中的 EqualizerBandState 不包含選用的 frequency,然後 等化器的頻帶頻率狀態未變更。

供應商專屬資料

ElementState vendor_specific_data 是可為任何 來處理元素如此一來,處理元素就能指定要傳送 至 SetElementState 的駕駛人,或直接在 WatchElementState

VENDOR_SPECIFIC 類型的處理元素除了可用於任何類型的不透明資料外,還可以允許 這些驅動程式會指定未在 SignalProcessing 通訊協定中定義的類型,例如 非標準或不適合使用的標準參數 目標供應商VENDOR_SPECIFIC 類型的處理元素未指定任何 TypeSpecificElement 參數,而是可能會指定傳送或接收的不透明資料。 使用 ElementState vendor_specific_data 參數和任何其他相同 處理元素類型

拓撲

GetTopologies 傳回的拓撲支援對 GetElements。「GetTopologies」可以宣傳一或多個拓撲。

一個拓撲

如果廣告有一個拓撲,例如 GetTopologies 會傳回含有一個元素的向量,那麼所有 PE 就會 屬於這個明確的單一管道的一部分在這個情況下,順序明確。舉例來說 GetElements 會傳回 2 位 PE:

  1. Element:id = 1,類型 = AUTOMATIC_GAIN_LIMITER (AGL)
  2. Element:id = 2,類型 = EQUALIZER (EQ)

GetTopologies 傳回的 Topology 元素會列出 idprocessing_elements_edge_pairs 向量明確地宣傳信號處理的順序 執行此範例:

  1. Topology:id = 1,processing_elements_edge_pairs = 含有一個元素的向量 processing_element_id_from = 1,processing_element_id_to = 2。

這會透過一個管道通告這個拓撲:

                +-------+    +-------+
Input signal -> |  AGL  | -> +  EQ   | -> Output signal
                +-------+    +-------+

在這個拓撲中,其開頭為 (輸入信號會輸入至管道) 和結尾 管道 (輸出訊號是來自管道的輸出) 是隱含的。可以製作 對類型為 ENDPOINT 的 PE 明確定義 (請參閱下方端點)。

如果只宣傳一個拓撲,則內容僅提供參考資訊,因為客戶無法 變更一個拓撲的用法

多個拓撲

如果宣傳多個拓撲,例如 GetTopologies 會傳回包含多個元素的向量, PE 可以用於多種設定,如拓撲每個拓撲都會明確列出 一些產品專家及其順序 (在這個案例中,順序為明確的排序)。排列方式 依產品專家排序會定義管道。

只列出 PE 支援的具體安排和順序,伺服器限制了 都是有效的管道組合

舉例來說,如果 GetElements 傳回 6 個 PE:

  1. Element:id = 1,類型 = AUTOMATIC_GAIN_LIMITER (AGL)
  2. Element:id = 2,類型 = EQUALIZER (EQ)
  3. Element:ID = 3,類型 = SAMPLE_RATE_CONVERSION (SRC)
  4. Element:ID = 4,類型 = GAIN
  5. Element:id = 5,類型 = DYNAMIC_RANGE_COMPRESSION (DRC1)
  6. Element:id = 6,類型 = DYNAMIC_RANGE_COMPRESSION (DRC2) 參數與 DRC1 參數。

GetTopologies 傳回的 Topology 元素會列出 id 和 每個拓撲的 processing_elements_edge_pairs,在本例中如下:

  1. Topology:ID = 1,processing_elements_edge_pairs = *handle_element_id_from= 3 andprocessing_element_id_to= 2. *. processing_element_id_from = 2,processing_element_id_to = 4。 *Process_element_id_from= 4 andprocessing_element_id_to= 5. *. processing_element_id_from = 5,processing_element_id_to = 1。
  2. Topology:id = 2、processing_elements_edge_pairs = *handle_element_id_from= 2 andprocessing_element_id_to= 4. *. processing_element_id_from = 4,processing_element_id_to = 6。

這會公告兩個拓撲,且每個拓撲各有一個管道:

                +-------+    +-------+    +-------+    +-------+    +-------+
Input signal -> |  SRC  | -> +  EQ   | -> + GAIN  | -> +  DRC1 | -> +  AGL  | -> Output signal
                +-------+    +-------+    +-------+    +-------+    +-------+

                +-------+    +-------+    +-------+
Input signal -> |  EQ   | -> + GAIN  | -> +  DRC2 | -> Output signal
                +-------+    +-------+    +-------+

連接點

CONNECTION_POINT 類型的 PE 允許:

  1. 在單一管道中混合使用多個管道。
  2. 混合來自不同管道的多個頻道。
  3. 重複頻道。
  4. 將單一管道擴展成多個管道管道 (散佈)。

端點

ENDPOINT 類型的 PE 是選擇性的 (即使在使用 CONNECTION_POINT 的情況下), 透過明確的起始輸入和結尾輸出內容完成管道結構。不過, 提供 Composite 通訊協定的驅動程式,所有支援的環形緩衝區或 DAI 互連網路都必須 列為 ENDPOINT,類型為 RING_BUFFERDAI_INTERCONNECT,並由 GetElements 傳回。 Composite 通訊協定 API 需要端點 PE ID,才能識別環形緩衝區和 DAI 以及內插設定

如果沒有指定 ENDPOINT,表示沒有邊緣的 PE 會是輸入值,而且 PE 沒有 輸出邊緣即為輸出內容舉例來說 上述的多個拓撲包含兩個拓撲,且每個拓撲都有一個 拓撲 ID 1 中的單一管道以 PE ID 3 為開頭,結尾是 PE ID 1, 拓撲 ID 2 的單一管道以 PE id 2 開頭,結尾是 PE ID 6。