共用方式為


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 管理員註冊這些範本時,在驅動程式 init 時間剖析線路範本。 ACX 驅動程式會使用 ACXCIRCUTTEMPLATES (#1) 註冊複合範本/系結。

當 ACX 管理員收到線路範本時,它會檢查這是實例範本或泛型類別範本。

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

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

ACXCOMPOSITE 會針對屬於複合的每個線路建立 ACXCIRCUITMANAGER (#6)。 ACXCIRCUITMANAGER 負責建立、監視和控制單一線路 (#7)。

在這種情況下,ACXCIRCUITMANAGER 可能會將線路標記為「隨選」,並要求復合線路的新線路(#8)。 ACXCIRCUITFACTORY 會建立 ACXCIRCUIT 作為要求 (#9)。

當偵測到所有 ACXCIRCUIT 且作用中時,ACXCOMPOSITE 也會變成作用中,並指示 ACXCIRCUITMANAGERS 開啟其線路的「音訊」介面。

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

圖中標示為 Driver A、Driver B、ACX Interface B、Circuit Manager A 和 B、ACX Composite 和 ACX Manager 的數據行,說明呼叫順序與數據行之間的流程箭號。

多重線路格式交涉

本節描述當音訊端點是由兩個或多個線路所組成時所發生的格式交涉。 如需 ACX 線路的一般資訊,請參閱 ACX 多堆棧交叉驅動程序通訊

下層網橋接腳

下層網橋接是直接或間接傳送數據到實體音訊裝置(擷取)或接收數據的針腳。 這種類型的針腳可能或可能沒有與其相關聯的 ACXMODEFORMATLIST。 這些網橋針有 'AcxPinQualifierBridgeB' 或 'AcxPinQualifierBridgeDevice' 類型。 如需 ACXMODEFORMATLIST 的詳細資訊,請參閱 acxdataformat.h 標頭

此圖顯示串流針腳、兩個線路和裝置之間的轉譯和擷取數據流。

在此圖表和文章中,上層和下層是用來描述流程方向,因為如果針腳將數據傳送至(轉譯)或接收數據(擷取),則向上或向下數據流流程的方向相依。

沒有 ACXMODEFORMATLIST 的下層網橋針腳(s)

驅動程式可以選擇不要在其下層釘選上公開模式格式清單。 如果模式格式清單無法在下層網橋接點上使用,則使用者(透過聲音控制面板)或其他軟體實體無法直接控制/指定此釘選的音訊格式和相關聯的數據流。 以下是一些不需要這些清單的案例:

  • 僅串流線路可以連線到 DSP 線路、CODEC 線路,或直接連線到音訊裝置。 這些線路只會將數據從 A 點移至點 B,而不需修改。 這些線路不會變更傳入/傳出數據流的數據取樣率。 在此情況下,模式格式清單會與上層釘選相關聯。

  • 沒有修改傳入/傳出取樣率之元素的單一數據流線路。 其中一個範例是USB音訊裝置線路。 在此案例中,模式格式清單會與上層釘選相關聯。

數據格式清單的不存在表示數據流的數據格式源自此針腳,與附加線路上層針腳的其中一個數據格式相容。

使用 ACXMODEFORMATLIST 的下層網橋接腳(s)

驅動程式可以選擇在其下層針腳上公開模式格式清單。 如果模式格式清單位於下層網橋釘上,則使用者(透過聲音控制面板)或其他軟體實體可以直接控制/指定此釘選的音訊格式和相關聯的數據流。

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

  • DSP 線路 - 通常這種線路支援以不同取樣率執行的多個數據流,這些數據流會在內部轉換成一般取樣率,並在數據移至下一個線路之前混合。 數據格式清單會控制/指定最終(針對此線路)取樣率。

當數據格式清單存在時,這些數據格式必須符合下一個線路針腳上層針腳中的數據格式範例。 請注意,模式不需要相符,請參閱下列各節中的模式討論。

下層格式清單提供使用者/上層控制所產生數據流格式的機會,在此案例中,清單的預設值是使用取樣率,直到採取明確的動作來變更此釘選上的格式為止。

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

上層網橋接腳

上層網橋接腳是接收來自(轉譯)或將數據直接或間接傳送至軟體模組的針腳。 這種類型的針腳應該有與其相關聯的 ACXMODEFORMATLIST。 這些網橋針有 'AcxPinQualifierBridgeA' 類型。

這裡再次顯示的上圖也可以用來顯示串流針腳、兩個線路和裝置之間的轉譯和擷取數據流。

此圖顯示串流針腳、兩個線路和裝置之間的轉譯和擷取數據流。箭號會顯示向右的轉譯數據流,並擷取到右側。

上層 [Bridge] 針腳沒有 ACXMODEFORMATLIST(s)

沒有模式格式清單的上層針腳不是有效的組合,這會導致設定錯誤的端點。 從用戶的觀點看不見端點。

具有 ACXMODEFORMQATLIST 的上層 [Bridge] 針腳(s)

上層針腳必須一律有一或多個 ACXMODEFORMATLIST。 mode-format-lists 會指定模式及其預設取樣率的所有可能取樣率。 不同的模式可能會有不同的取樣率集合。 默認取樣率是該模式的慣用取樣率。

模式和線路

單一數據流線路或多數據流線路的上層針腳可以支援一或多個模式格式清單。 單一串流線路一次有一個作用中的模式,而多數據流線路可以使用不同的模式同時執行兩個或多個數據流。

模式對應

本節簡要介紹標準模式,並說明為何使用「模式」對應。

RAW 模式: 數據流/線路不會對數據流套用任何影響(除了可能音量、靜音和安全限制,例如喇叭保護)。

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

<mode_name> mode:數據流/線路會套用所選 <mode_name> 模式特有的效果。

串流釘選必須支援原始和/或預設模式。 串流釘選是選擇性的,可支援任何其他 <mode_name> modes

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

雙線路端點中的範例:

  • 上層線路的下層針腳支援模式和相關聯的格式 m1{f1,f2} 和 m2{f3,f4},亦即,這表示針腳的數據流在使用 m1 時具有 f1 或 f2 的格式,或是使用 m2 時的 f3 或 f4 格式。 這假設上層線路是單一數據流線路。

  • 下層線路的上層針腳支持預設模式{f1,f2,f3}。

在此情況下,數據流的模式會從 <mode_name> 模式轉換成預設模式,同時保留相同的取樣率。

m1/f1 設為 > default/f1

m1/f2 至 > default/f2

m2/f3 設為 > default/f3

無效的專案: m2/f4 至 > None

模式對應是由驅動程式透過 ACX 的協助來完成。 在上表中,最後一個項目無效,上層線路的下層針腳應移除 m2/f4 作為其支援格式的選項。 請注意,這可能是在反向發生,也就是下層線路的上層針腳可能也支援 f4 和 f5。 在此情況下,支援 default-f4,但 default-f5 則不支援。 在這種情況下,下層線路的上層針腳負責不將其清單列出 m?/f5 作為選項。 下列進一步章節將說明此程式。

格式交涉

在ACX啟用構成複合裝置之線路的音訊介面之前,它會確保線路可以交涉音訊數據的模式/格式。 ACX 會在複合的所有線路上叫用複合初始化回呼,以執行此線路通知。 序列是從下層(裝置端)到上層(系統端)。 線路有機會在此階段更新其格式。

裝置格式控制面板顯示

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

  • 如果音訊裝置支援音訊引擎元素,則控制面板中顯示的數據格式清單是裝置數據格式清單,也就是附加至下層圖釘的數據格式清單(其已連接到音訊引擎元素輸出釘選)。
  • 如果音訊裝置不支援音訊引擎元素,則控制面板中顯示的數據格式清單是串流釘選數據格式清單,也就是數據格式清單會攻擊至上層針腳。

多重線路自動下層串流建立

ACX 使用與下層網橋針相關聯的 ACXSTREAMBRIDGE 對象,自動將 create-stream(s) 要求傳播至遠端線路。

當用戶端應用程式建立數據流時,該要求會先由串流釘選接收。 ACX 會透過在線路建立時間指定的回呼,通知驅動程式有關建立數據流要求的串流針腳。 在回呼中,驅動程式會建立代表數據流的 ACXSTREAM 對象,然後將控件傳回 ACX。 當 ACX 收到控制項時,它會檢查它是否需要將此建立要求轉送至下一個 (下層) 線路。 選擇性地,驅動程式可以在從其 create-stream 回呼傳回之前,將 create-request 轉送至下一個 (下層) 線路。 後者選項可讓驅動程式在下層線路之後執行任何後續作業,並有機會處理其建立要求。

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

  • 如果沒有下層網橋接腳,則全部完成。
  • 如果驅動程式已經手動將數據流與 ACXSTREAMBRIDGE 相關聯,則全部完成。
  • 如果下層網橋接腳沒有指定MODE的ACXSTREAMBRIDGE,則要求會失敗。
  • ACX 會新增使用擷取的 ACXSTREAMBRIDGE 所建立驅動程式的新數據流。

ACXSTREAMBRIDGE 可作為多進/單一輸出。只要有串流內,ACXSTREAMBRIDGE 就會保留流外串流存在。 只有在移除最後一個數據流時,才會刪除 out-stream。 ACXSTREAMBRIDGE 會在決定要用於遠端線路的模式和格式時,使用與下層網橋針相關聯的 ACXDATAFORMATLIST。

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

  • 如果未指定 Out-stream 的 MODE,請檢查是否有 'default' 格式清單。

  • 如果未指定 Out-stream 的 MODE,且 'default' 格式清單不存在,請檢查是否有 'raw' 格式清單。

  • 如果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 物件,並在處理 create-stream 回呼時手動將傳入 ACXSTREAM 物件新增至數據流網橋。

如需串流網橋建立的詳細資訊,請參閱:

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

ACXSTREAMBRIDGE 會自動將串流狀態要求向下傳播至遠端線路。 當數據流的狀態變更時,ACXSTREAMBRIDGE 會計算輸出數據流的混合狀態,並使用 ACXTARGETSTREAM 將新的『stream-state』 要求傳送至遠端數據流。

ACXSTREAM 與 ACXSTREAMBRIDGE 會使用下列邏輯:

  • 在這些案例中,請先變更上層數據流的狀態:

    • 轉譯和從停止>執行
    • 擷取和從執行>停止
    • 其他 - 從運行>停止
  • 在這些案例中,變更上層數據流的狀態:

    • 轉譯和從 Run-Stop> 進行
    • 擷取和停止>執行
    • 其他 - 從停止>執行

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

注意

驅動程式/線路/數據流必須一律成功從執行轉換到停止的數據流。 另一方面,允許驅動程式讓反向失敗,也就是停止執行。

另請參閱

ACX 線路

ACX 音訊類別擴充功能概觀

ACX 多堆疊跨驅動程序通訊

ACX 對象的摘要