本主題討論 ACX 線路。 如需 ACX 的一般概觀和 ACX 術語清單,請參閱 ACX 音訊類別延伸模組概觀。
如 ACX 物件摘要中所述,AcxCircuit 物件代表使用者感知音訊裝置 (喇叭、麥克風等) 的部分或完整音訊路徑。 AcxCircuit 至少有一個輸入引腳和一個輸出引腳(ACXPIN),而且可能會聚合一個或多個像物件的 AcxElement。 電路代表現有端點及其功能。
ACX Stream 是一個驅動元件,用來代表由電路建立的音訊流。 串流由根據父電路的元素創建的元素列表組成。 串流線路是多堆疊架構 (部分音訊路徑) 中的線路,可直接與上層使用者模式串流服務介面。 核心電路是多堆疊架構(部分音訊路徑)中的電路,可提供音訊端點裝置的身分。
ACX 電路識別
每個ACX線路都有一個線路識別碼。 ACX 會定義下列:
名稱 (str) ,唯一標識此電路音訊裝置類型。 它可用來尋找 INF 的設定,而且是用來從遠端裝置存取此線路的符號連結的一部分。 範例:「Render0」、「Render1」或「Capture0」。
符號連結。 符號鏈結會與所有公開的電路相關聯。 客戶端使用此符號鏈接來打開與設備/電路的通信路徑。
線路的元件識別碼 (guid)。 唯一識別電路實例(由廠商特定)。 如果已指定線路 URI,則無法在 AcxCircuitTemplate 系結中使用。
電路元件的 URI (str)。 唯一識別電路實例(廠商特定)。 如果已指定線路標識碼,則無法在 AcxCircuitTemplate 系結中使用。
Circuit Factory 的元件識別碼 (guid)。 唯一識別電路工廠實例(廠商特定)。 如果已指定線路處理站 URI,則無法在 AcxCircuitTemplate 系結中使用。
Circuit Factory 的元件 URI (str)。 唯一識別電路工廠實例(特定廠商)。 如果已指定線路處理站識別碼,則無法在 AcxCircuitTemplate 系結中使用。
AcxCircuitCreate
AcxCircuitCreate 函式可用來建立 ACXCIRCUIT。 AcxCircuitCreate 函式所使用的不透明ACXCIRCUIT_INIT結構。 AcxCircuitInitAllocate 可用來初始化ACXCIRCUIT_INIT結構。
AcxFactoryCircuit
ACX 驅動程式也可以使用 acxFactoryCircuitCreate 函式 和 acxDeviceAddFactoryCircuit 函式,在啟動序列期間建立 AcxFactoryCircuit 物件(線路提供者)。
ACX電路組成
ACX 會將線路繫結在一起,直到它們形成完整的音訊路徑。 ACX 會使用音訊系結將音訊線路連接在一起。 如需詳細資訊,請參閱 ACX 多線路組合。
ACX 電路動態創建(可隨時進行)
ACX 可以按需創建動態電路。 若要這樣做,驅動程式會呼叫 WdfPdoInitAllocate 來配置WDFDEVICE_INIT結構。 驅動程式接著會設定所需的 PnP/電源回呼函式,並建立裝置。 驅動程式會呼叫 AcxDeviceAddCircuitDevice 來具現化新的裝置/線路。 如需詳細資訊,請參閱 ACX 裝置列舉。
ACX 電路動態移除
驅動程式會叫用 AcxDeviceRemoveCircuitDevice ,以從裝置清單中移除音訊裝置。 這會觸發ACX電路裝置/實體的關機程序。 電路裝置/電路會以非同步方式刪除。 如需詳細資訊,請參閱 ACX 裝置列舉。
AcxDeviceRemoveCircuit 和 AcxDeviceDetachCircuit
有兩種常見的方法可以管理電路終止。 AcxDeviceDetachCircuit 或 AcxDeviceRemoveCircuit。
如果呼叫端叫用 AcxDeviceDetachCircuit ,則不得呼叫 AcxDeviceRemoveCircuit。 如果呼叫驅動程式想要在 AcxDeviceDetachCircuit 之後刪除線路,它應該使用 WdfObjectDelete。
藉由呼叫 AcxDeviceRemoveCircuit ,呼叫驅動程式會告知 ACX 移除此線路,並將其從裝置中移除/刪除。 在此情況下,不需要在回路上呼叫 WdfObjectDelete。
總而言之, AcxDeviceDetachCircuit 表示驅動程式擁有線路物件存留期的管理, AcxDeviceRemoveCircuit 表示將會移除並刪除線路。
如需 WDF 物件存留期管理的一般資訊,請參閱 架構物件生命週期。
AcxDeviceRemoveCircuitDevice
與上述所討論的線路終止不同,音訊驅動程式會使用 AcxDeviceRemoveCircuitDevice 來移除現有的音訊端點,而且可以在驅動程式生命週期期間隨時呼叫。
驅動程式開發者也可以選擇在重新平衡時始終銷毀並重新建立音訊裝置。 當裝置偵測到新設定與舊設定不相容時,這與上述案例相同。
刪除線路必須在 EvtDevicePrepareHardware/EvtDeviceReleaseHardware 回呼中完成,而且新的線路會在 EvtDevicePrepareHardware 中重新建立。 驅動程式會取消註冊線路來刪除線路(使用 AcxDeviceRemoveCircuit)。
EvtAcxCircuitReleaseHardware (EVT_ACX_CIRCUIT_RELEASE_HARDWARE) 回呼函式
如果驅動程式已註冊 EvtAcxCircuitReleaseHardware 回呼函式 ,架構會在下列轉換期間呼叫它:
- 資源重新平衡
- 有序移除
- 意外移除
ACX 架構會在 WDF 架構停止將 I/O 要求傳送至裝置之後,呼叫 EvtAcxCircuitReleaseHardware 回呼函式,指派給裝置的任何中斷都已停用並中斷連線,且裝置已關閉。
ACX 架構會在 WDF 架構呼叫驅動程式的 EvtDeviceReleaseHardware 回呼函式之前,先呼叫 EvtAcxCircuitReleaseHardware 回呼函式。
當架構呼叫 EvtAcxCircuitReleaseHardware 時,裝置的 PDO 仍然存在,而且可以查詢裝置資訊,以取得處於關閉電源狀態的裝置資訊,例如 PCI 組態狀態。
此外,架構提供給 EvtDeviceReleaseHardware 的已轉譯硬體資源仍會指派給裝置。 此回呼函式的主要目的是釋放這些資源,特別是取消對應驅動程式 EvtAcxCircuitPrepareHardware 回呼函式所對應的任何記憶體資源。 驅動程式也可以使用此回呼來執行任何其他可能處於電源關閉狀態的 ACXCIRCUIT 管理活動。 通常會在驅動程式的 EvtDeviceD0Exit 回呼函式中執行所有其他硬體關機作業。
如果驅動程式的 EvtAcxCircuitPrepareHardware 回呼函式已呼叫驅動程式的 EvtAcxCircuitPrepareHardware 回呼函式,除非 EvtAcxCircuitPrepareHardware 傳回失敗碼,否則 ACX 架構一律會呼叫驅動程式的 EvtAcxCircuitReleaseHardware 回呼函式。
如需硬體資源的詳細資訊,請參閱 硬體資源簡介。
EvtAcxFactoryCircuitReleaseHardware (EVT_ACX_FACTORY_CIRCUIT_RELEASE_HARDWARE) 回呼函式
當架構呼叫 EvtAcxFactoryCircuitReleaseHardware 時,裝置的 PDO 仍然存在,而且可以查詢在已關閉電源狀態下可用的裝置資訊,例如 PCI 設定狀態。
此外,架構提供給 EvtDeviceReleaseHardware 的已轉譯硬體資源仍會指派給裝置。 此回呼函式的主要目的是釋放這些資源,特別是取消對應驅動程式 EvtAcxCircuitPrepareHardware 回呼函式所對應的任何記憶體資源。 驅動程式也可以使用此回呼來執行任何其他可能處於電源關閉狀態的 ACXCIRCUIT 管理活動。 通常會在驅動程式的 EvtDeviceD0Exit 回呼函式中執行所有其他硬體關機作業。
如果驅動程式的 EvtAcxFactoryCircuitReleaseHardware 回呼函式已呼叫驅動程式的 EvtAcxFactoryCircuitPrepareHardware 回呼函式,除非 EvtAcxFactoryCircuitPrepareHardware 傳回失敗碼。
如需管理 WDF 和線路物件的詳細資訊,請參閱 ACX WDF 驅動程式存留期管理。