共用方式為


ACX 多重線路組合

本主題討論 ACX 多電路組成。 如需 ACX 的一般概觀和 ACX 術語清單,請參閱 ACX 音訊類別延伸模組概觀

ACX 物件摘要中所述,AcxCircuit 代表使用者感知音訊裝置 (喇叭、麥克風等) 的部分或完整音訊路徑。 AcxCircuit 至少有一個輸入針腳和一個輸出針腳 (ACXPIN) ,而且可能會聚集一或多個類似 AcxElements 的物件。 如需一般資訊,請參閱 ACX 線路

ACX電路組成

ACX 會將線路繫結在一起,直到它們形成完整的音訊路徑。 ACX 會使用音訊系結將音訊線路連接在一起。 同時,每個 ACX 線路都會轉換成 KS 篩選,然後由作為使用者模式服務執行的音訊端點產生器 (AEB) 偵測這些 KS 篩選。 AEB 會掃描偵測到的 KS 篩選圖形,並在偵測到完整的音訊路徑時建立軟體音訊端點,代表底線音訊基礎結構。

下圖顯示 ACX 用來偵測、建置和監視組成複合音訊端點的線路的 ACX 物件。

圖表說明使用 ACXCIRCUITTEMPLATE、ACXCOMPOSITEMANAGER、ACXMANAGER、ACXCIRCUITFACTORY 和 ACXCIRCUIT 的 ACX 目標架構。

這很重要

請注意,只有藍色顯示的類型是公用的:ACXCIRCUITTEMPLATE、ACXCOMPOSITETEMPLATE(未顯示)、ACXMANAGER、ACXCIRCUITFACTORY 和 ACXCIRCUIT。 以紫色顯示的所有類型都是內部的,此處列出它們僅供說明之用。 內部類型不保證保持不變,或在不同的 ACX 版本中可用,而且不得直接呼叫或使用。

ACX 管理員會在驅動程式初始化時解析線路範本,當 ACX 驅動程式將其註冊到 ACX 管理員時。 ACX 驅動程式會使用 ACXCIRCUTTEMPLATES (#1) 註冊複合範本/繫結。

當ACX管理器收到電路模板時,它會檢查這是實例模板還是泛型類模板。

針對實例範本,ACX 會建立 ACXCOMPOSITEMANAGER (#4),針對泛型類別範本,ACX 會建立 ACXCOMPOSITEFACTORY (#2),當偵測到複合的「核心」線路時,負責建立 ACXCOMPOSITEMANAGER 專案(#3)。 核心電路是將身分識別提供給複合音訊端點的電路。

ACXCOMPOSITEMANAGER 會依序建立 ACXCOMPOSITE (#5) 來代表底線複合音訊端點。 複合管理程式負責監視在建立/初始化複合之後可能出現的任何選擇性電路區段。

ACXCOMPOSITE 接著為合成元件中的每個電路建立 ACXCIRCUITMANAGER(#6)。 ACXCIRCUITMANAGER 負責建立、監視及控制單一電路(#7)。

一個電路可能會被標示為「隨需」,在這種情況下,ACXCIRCUITMANAGER 會尋找其電路工廠,並要求一個新的組合電路(#8)。 ACXCIRCUITFACTORY 會根據要求(#9)建立 ACXCIRCUIT。

當所有 ACXCIRCUIT 被偵測到並處於活躍狀態時,ACXCOMPOSITE 也會變得活躍,並指示 ACXCIRCUITMANAGERS 開啟其線路的「音訊」介面。

下列序列圖顯示兩個 ACX 線路 (線路 A 和 B) 如何系結在一起,以建立完整的音訊路徑,由具有軟體音訊裝置的音訊端點產生器 (AEB) 表示。

圖表中的欄標示為驅動程式 A、驅動程式 B、ACX 介面 B、線路管理員 A 和 B、ACX 複合,以及 ACX 管理員,圖示出欄之間具有流程箭頭的呼叫順序。

多電路格式協商

本節說明當音訊端點由兩個或多個電路組成時發生的格式交涉。 如需 ACX 線路的一般資訊,請參閱 ACX 多堆疊跨驅動程式通訊

下層橋接針

下層橋接器針腳是直接或間接將資料傳送至 (轉譯) 或從實體音訊裝置接收 (擷取) 資料的針腳。 這種類型的針腳可能會有或沒有相關聯的 ACXMODEFORMATLIST。 這些橋接針腳的類型為 'AcxPinQualifierBridgeB' 或 'AcxPinQualifierBridgeDevice'。 如需 ACXMODEFORMATLIST 的詳細資訊,請參閱 acxdataformat.h 標頭

顯示串流引腳、兩個線路和裝置之間的渲染和擷取資料流程的圖表。

在此圖和文章中,上游和下游用於描述流動方向,因為上下游流的方向取決於針腳是將數據傳送以進行呈現,還是接收數據以進行擷取。

下層橋接針腳(無ACXMODEFORMATLIST)

驅動程式可以選擇不在其下層針腳上公開模式格式清單。 如果在向下兼容的橋接埠上無法使用模式格式列表,則使用者(透過音效控制面板)或其他軟體實體無法直接控制或指定此埠及相關資料流的音訊格式。 以下是不需要這些清單的一些案例:

  • 可連接到 DSP 電路、編解碼器電路或直接連接到音頻設備的僅流電路。 這些電路只是將數據從 A 點移動到 B 點,而無需修改它。 這些線路不會變更傳入/傳出數據流的數據取樣率。 在此情況下,模式格式列表會與升級釘選相關聯。

  • 沒有修改傳入/傳出取樣率的元件的單流電路。 這方面的一個例子是 USB 音頻設備電路。 在此案例中,模式格式清單會與上層針腳相關聯。

缺少數據格式清單表示來自此針腳的資料流格式與所連接電路的上層針腳中的某個資料格式相容。

具有 ACXMODEFORMATLIST () 的下層橋接器針腳

驅動程式可能會選擇在其較低層級的接腳上顯示模式格式清單。 如果模式格式清單可在下層橋接針腳上使用,使用者可以透過聲音控制面板或其他軟體實體直接控制或指定此針腳和相關聯資料流的音訊格式。

以下是使用這些模式格式清單的一些有效案例:

  • DSP電路 — 通常,這種類型的電路支援以不同取樣率運行的多個流,這些流在內部轉換為公共取樣率,並在資料移動到下一個電路之前進行混合。 數據格式列表控制/指定最終(對於此電路)採樣率。

當資料格式清單存在時,這些資料格式必須與下一個電路的針腳中上級針腳的資料格式範例匹配。 請注意,模式不需要匹配,請參閱以下各節中模式的討論。

下層格式列表讓使用者/上層程序能夠控制產生資料流的格式。在此情形中,列表的預設值為取樣率,並持續使用該取樣率,直到採取明確的動作來變更此針腳上的格式為止。

如需格式清單的詳細資訊,請參閱 acxdataformat.h 標頭

上層橋接針

上層橋接引腳是直接或間接從軟體模組接收(渲染)資料或傳送資料(擷取)的引腳。 這種類型的針腳應該具有相關聯的 ACXMODEFORMATLIST 列表。 這些橋接器針腳具有 'AcxPinQualifierBridgeA' 類型。

此處再次顯示的上圖也可用於顯示串流針腳、兩個電路和裝置之間的轉譯和擷取資料流程。

顯示串流針腳、兩個電路和裝置之間的渲染和擷取資料流程的圖表。箭號顯示渲染的資料流程向右流動,而擷取的資料流程也是向右。

升階 [Bridge] 針腳,無需 ACXMODEFORMATLIST

沒有模式格式清單的上層引腳不是有效的組合,這會導致端點配置錯誤。 從使用者的觀點來看,端點不可見。

使用 ACXMODEFORMQATLIST 來升級 [橋接] 接點

升級引腳必須一律具有一或多個 ACXMODEFORMATLIST。 mode-format-lists 指定了該模式的所有可能取樣率及其預設取樣率。 不同的模式可能有不同的取樣率集。 預設取樣率是該模式的慣用取樣率。

模式和電路

單一資料流程電路或多資料流程電路的上層針腳可以支援一或多個模式格式清單。 單流電路在任何給定時間僅有一個模式處於運行狀態,而多流電路可能同時使用不同模式運行兩個或多個流。

模式映射

本節簡要介紹標準模式,並解釋為什麼使用「模式」映射。

RAW 模式: 串流/電路不會對串流套用任何效果(音量、靜音和安全限制,例如揚聲器保護除外)。

DEFAULT模式: 流/電路會執行一些預設效果。

<mode_name> mode:串流/電路會套用特定於選擇之 <mode_name> 模式的效果。

串流針腳必須支援 raw 模式和/或預設模式。 串流針腳具有選擇性,可支援其他任何 <mode_name> modes

在複合端點中,上層電路可能支援多種模式,而下層電路可能僅支援RAW和/或DEFAULT。

雙電路端點中的範例:

  • 上層電路的下層引腳支援模式和相關格式 m1{f1,f2} 和 m2{f3,f4},也就是說,這意味著當使用 m1 時,引腳的流具有 f1 或 f2 的格式,或者當使用 m2 時,引腳的流格式為 f3 或 f4。 這假設上層電路是單一串流電路。

  • 下層電路的上層引腳支援預設模式{f1,f2,f3}。

在此情況下,串流的模式會從mode_name>模式轉換為<預設模式,同時保持相同的取樣率。

將 m1/f1 設為 > 預設值/f1

m1/f2 轉 > 為預設值/f2

m2/f3 轉 > 為預設值/f3

無效輸入: m2/f4 至 > 無

驅動程式在 ACX 的協助下完成模式對應。 在上表中,最後一個項目無效,上層電路的下層引腳應在其支持格式選項中刪除 m2/f4。 請注意,這可能發生在相反的情況,即下層電路的上層引腳也可能支持 f4 和 f5。 在這種情況下,支援default-f4,但不支援default-f5。 在這種情況下,下層電路的上層引腳負責不將 m?/f5 列為其清單中的選項。 以下其他章節將說明此過程。

格式協商

在 ACX 啟用組成複合裝置之線路的音訊介面之前,它會確定線路可以交涉音訊資料的模式/格式。 ACX 會在複合體的所有線路上執行初始化回呼來進行此線路通知。 順序是從下層(設備端)到上層(系統端)。 在此階段,電路有機會更新其格式。

裝置格式控制面板顯示

目前的聲音控制面板邏輯會顯示裝置格式清單,如下所示:

  • 如果音頻裝置支援音頻引擎元件,則控制面板中顯示的數據格式列表是裝置的數據格式列表,也就是附加至下層針腳的格式列表,該針腳連接到音頻引擎元件的輸出針腳。
  • 如果音訊裝置不支援音訊引擎元素,則控制面板中顯示的資料格式清單是串流針腳資料格式清單,也就是攻擊上層針腳的資料格式清單。

多迴路自動下游流生成

ACX 會使用與低階橋接針腳相關聯的 ACXSTREAMBRIDGE 物件,自動將建立資料流請求傳播至遠端電路。

當用戶端應用程式建立資料流時,串流接腳會先接收該要求。 ACX 會透過在電路建立時指定的回呼,通知擁有串流針腳的驅動程式有關建立串流的請求。 在回呼中,驅動程式會建立一個代表串流的 ACXSTREAM 物件,然後將控制權傳回 ACX。 當 ACX 收到控制項時,它會檢查是否需要將此建立要求轉送至下一個 (下層) 線路。 或者,驅動程式可以在從其建立串流回呼返回前,先將建立請求轉送到下一個(下層)電路。 後一個選項允許驅動程式在下層電路有機會處理其建立請求後執行任何後置操作。

ACX 會使用下列預設邏輯來建立資料串流:

  • 如果沒有向下兼容的橋樑針腳,則全部完成。
  • 如果驅動程式已經手動將資料流與 ACXSTREAMBRIDGE 關聯,那麼就全部完成了。
  • 如果下層橋接針腳沒有指定的 MODE 的 ACXSTREAMBRIDGE,則導致請求失敗。
  • ACX 會將驅動程式利用擷取的 ACXSTREAMBRIDGE 所建立的新資料流加入。

ACXSTREAMBRIDGE 可作為多進/單出設備。只要有輸入流,ACXSTREAMBRIDGE 就會保持輸出流的存在。 只有在刪除最後一個輸入流時,才會刪除輸出流。 ACXSTREAMBRIDGE 在決定遠端線路要使用的模式和格式時,會使用與較低層橋接針腳相關聯的 ACXDATAFORMATLIST。

ACXSTREAMBRIDGE 會使用下列邏輯來選取輸出串流的模式和資料格式:

  • 如果未指定輸出串流的 MODE,請檢查是否有「預設」格式清單。

  • 如果未指定輸出串流的 MODE ,且不存在「預設」格式清單,請檢查是否有「原始」格式清單。

  • 如果 MODE 是 NULL_GUID,請檢查是否存在與第一個串流中的 MODE 相關聯的格式清單。

  • 如果指定 MODE,請檢查是否有此 MODE 的格式清單。

  • 如果找到格式清單,請從格式清單中取得預設格式。

  • 如果找不到格式,ACXSTREAMBRIDGE 會使用第一個資料流內的格式。

  • ACXSTREAMBRIDGE 使用擷取的 MODE 和資料格式,使用 ACXTARGETSTREAM 建置資料流程建立要求,如下所示:

    • 如果指定 MODE ,則會使用該 MODE。
    • 如果 MODE 為 NULL_GUID,則使用第一個串流中的 MODE。
    • 否則,不會使用任何模式。

ACX 會在移除最後一個資料流程時,小心刪除/關閉目標資料流程。

ACXSTREAMCIRCUIT 的另一個工作是沿著串流鏈結自動傳播串流狀態。

驅動程式可以選擇呼叫 AcxCircuitInitDisableDefaultStreamBridgeHandling 或手動將 ACXSTREAM 物件與 ACXSTREAMBRIDGE 關聯,以關閉預設電路的遠端串流橋建立,然後將控制權交回給 ACX。 在後一種情況下,會在驅動程式從 'create-stream' EVT_ACX_CIRCUIT_CREATE_STREAM 回呼函式傳回之前建立遠端串流。

對於使用多個擷取/轉譯針腳的電路,例如主機/卸載/回送/kws,也就是說,當音訊引擎元素受到支持時,驅動程式必須建立一個資料流程橋接器,無需指定任何進入模式,並在處理建立資料流程的回呼時,手動將傳入的 ACXSTREAM 物件新增至資料流程橋接器。

如需有關建立河流橋接器的詳細資訊,請參閱:

多重線路自動串流狀態傳播至下層數據流

ACXSTREAMBRIDGE 會自動將串流狀態要求向下傳播至遠端線路。 當資料流程的狀態變更時,ACXSTREAMBRIDGE 會計算輸出資料流程的混合狀態,並使用 ACXTARGETSTREAM 將新的「資料流程狀態」要求傳送至遠端資料流程。

ACXSTREAM 與 ACXSTREAMBRIDGE 會使用下列邏輯:

  • 在下列案例中,請先變更上層串流的狀態:

    • 渲染從停止狀態轉換到運行狀態>
    • 擷取和從執行>停止
    • 其他 && 從運行狀態轉為停止
  • 在以下情境中,最後才變更上層串流的狀態:

    • 渲染和從 Run-Stop> 開始
    • 捕獲 && 從 Stop-Run 狀態轉換
    • 其他與從 Stop-Run> 轉換

驅動程式可以選擇透過組態設定來反轉此順序。

備註

驅動程式/電路/流程在從執行轉換到停止時,必須一律成功完成轉換。 另一方面,允許駕駛員在從停止狀態切換到運行狀態的過程中失敗。

另請參閱

ACX 電路

ACX 音訊類別擴充功能概觀

ACX 多堆疊跨驅動程式通訊

ACX 物件摘要