ACX 裝置列舉
本主題討論 ACX 裝置列舉、啟動和關機,以及裝置重新平衡。 如需 ACX 的一般概觀,請參閱
靜態音訊裝置的 ACX 裝置枚舉和啟動
若要瞭解 ACX 的啟動運作方式,將會說明以下情境。
- 音訊裝置是由單一線路表示。
- 音訊/線路存留期會系結至 PnP 裝置存留期。
- 單一裝置可以針對不同的音訊裝置建立多個線路。
- KMDF 核心模式環境。
啟動順序為:
WDM DriverEntry。 驅動程式限定範圍。 適用於 WDF 驅動程式的 DriverEntry 例程
- 初始化追蹤。
- 可選註冊卸載。
- 建立 WDFDRIVER。
- 呼叫 ACX 來執行任何驅動程式初始化。
- 選擇性地執行驅動程式初始化後的操作。
WDF DeviceAdd。 裝置限定範圍。 EVT_WDF_DRIVER_DEVICE_ADD 回呼函式
- 呼叫 ACX 以啟動裝置初始化上下文 -
ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)
ACX_DEVICEINIT_CONFIG_INIT 函式 - 註冊 WDF PnP 電源回呼函式 -
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
- 使用 acxDeviceInitialize 建立裝置
- 呼叫 ACX 以在裝置初始化後執行任何操作。
- 可以選擇執行裝置初始化後的任何操作。
- 呼叫 ACX 以啟動裝置初始化上下文 -
WDF PrepareHardware。 裝置範圍。 EVT_WDF_DEVICE_PREPARE_HARDWARE 回呼函數。
建立和初始化硬體資源(針對中斷和線程,向 ACX 註冊它們)。
建立一或多個線路(一次建立)。
- 建立 AcxCircuitInit 上下文。
- 新增回呼函數。
- 建立 AcxCircuit。
- 選擇性地執行任何電路後的初始化。
- 使用 AcxDeviceAddCircuitDevice註冊線路。
WDF 裝置 D0 進入回呼。 裝置範圍。 EVT_WDF_DEVICE_D0_ENTRY 回呼函式。
ACX 會在所有線路上叫用 EvtAcxCircuitPowerUp 回呼。 電路範疇。
ACX 在裝置電源關閉之前,將串流(如果有的話)移至其先前的狀態。 以實例為範圍的串流
WDF 佇列已重新啟動。
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART 回呼函式。 針對裝置的範圍。 - 每次從 Dx 啟動電源後初始化。
ACX 數據流新增
- 在 ACX 電路上新增 ACX 串流(實例) (ACX 電路上的 ACX 回呼)– 可以在叫用 WDF 自我管理 I/O 初始化或重新啟動後隨時進行,且裝置處於 D0 電源狀態時。 電路範疇。
- 輸入:AcxStreamInit 內容、ACXCIRCUIT。
- 新增 callback。
- 建立 AcxStream (實例)。
- 可選地進行任何數據流實例的初始化。
- 在返回時,ACX 會啟動此串流實例,而在此案例中,因其是音訊路徑中唯一的實例,因此允許串流訊息通過。
動態音訊裝置的 ACX 裝置列舉和啟動
在此案例中,假設有下列情況。
- 動態音訊支援(在運行時間建立/刪除音訊裝置)。
- 裝置存留期不會系結至線路存留期。
- 單一裝置可以針對不同的音訊裝置建立多個線路。
- 在上述簡單靜態模式的基礎上,只新增了動態模式特有的元素。
- 使用子級原始 PDOs。
- KMDF 核心模式環境。
此案例的啟動順序如下:
WDM DriverEntry。 驅動程式限定。
- 初始化追蹤。
- 選擇性地註冊卸除。
- 建立 WDFDRIVER。
- 呼叫 ACX 以執行任何後置驅動程式的初始化。
- 可選擇性地執行任何後置驅動程式的初始化。
WDF DeviceAdd。 裝置範圍。
- 呼叫 ACX 以初始化裝置 init 內容。
- 建立裝置。
- 呼叫 ACX 以執行任何裝置初始化後的操作。
- 選擇性地執行任何後續裝置初始化操作。
WDF PrepareHardware。 裝置限定範圍。
- 建立和初始化硬體資源(針對中斷和線程,向 ACX 註冊它們)。
WDF 裝置進入 D0 狀態的回呼函式。 裝置範圍。
WDF 佇列重新啟動。
WDF DeviceSelfManagedIoInit。 裝置範圍。
WDF DeviceSelfManagedIoRestart。 裝置範圍。
- 每次從 Dx 開機後進行初始化。
電路動態創建(隨時)
- 驅動程式透過呼叫 WdfPdoInitAllocate 來分配 WDFDEVICE_INIT 結構。 驅動程式負責在成功建立裝置之前遇到任何失敗時叫用 WdfDeviceInitFree。
- 驅動程式會指定它想要接收的任何 PnP/電源回呼。
- 驅動程式會建立裝置。
- 驅動程式藉由呼叫 AcxDeviceAddCircuitDevice來具現化新的裝置/線路。
- WDF/PnP 接管控制,並執行前一節所述的簡單列舉/啟動模式。
AcxFactoryCircuit
ACX 驅動程式也可以使用 acxFactoryCircuitCreate 函式 和 acxDeviceAddFactoryCircuit 函式,在啟動序列期間建立 AcxFactoryCircuit 物件(線路提供者)。
由於 ACX 驅動程式已向 ACX 註冊為線路處理站,因此 ACX 架構會使用已註冊的處理站來要求驅動程式建立新的線路。
AcxFactoryCircuitCreate(Device, &attributes, &factoryInit, &factory);
AcxDeviceAddFactoryCircuit(Device, factory);
ACX 裝置重新平衡
當系統資源使用量需要操作系統在裝置之間重新平衡資源時,就會進行重新平衡。 如需關於重新平衡的一般資訊,請參閱 實作 PortCls 音訊驅動程式的 PnP 重新平衡。
ACX 支援裝置重新平衡,如下所示:
在關閉電源 WDF/ACX 序列中,驅動程式會釋放所有串流資源(EvtAcxStreamPowerDown、EvtAcxStreamReleaseHardware)、線路資源 (EvtAcxCircuitPowerDown、EvtAcxCircuitReleaseHardware) 和裝置資源 (EvtDeviceReleaseHardware)。
所有請求都會暫緩處理,且控制代碼會保持開啟狀態。
在啟動 WDF/ACX 序列中,驅動程式可確保新的資源與目前的資源相容,而且會對其設定進行任何允許的調整。 如果資源與目前的裝置/線路初始化不相容,驅動程式必須刪除目前的線路並建立新的線路。 請參閱下方的詳細資訊。
在電源啟動序列中,WDF 會叫用其 EvtDevicePrepareHardware 和 EvtDeviceD0 專案,而 ACX 會叫用對應的 EvtAcxCircuitPrepareHardware 和 EvtAcxCircuitPowerUp,並將所有數據流移至其既有狀態。
一旦佇列移至啟動/運行狀態,I/O 流程就會再次開始流動。
如果有處於作用中(RUN)狀態的數據流,ACX 不允許進行移除操作(移除查詢失敗)或重新平衡操作(停止查詢失敗)。
驅動程式開發者也可以選擇在重新平衡時始終銷毀並重新建立音訊裝置。 當裝置偵測到新設定與舊設定不相容時,這與上述案例相同。 刪除線路必須在 EvtDevicePrepareHardware/EvtDeviceReleaseHardware 回呼中完成,而且新的線路會在 EvtDevicePrepareHardware 中重新建立。 驅動程式會取消註冊線路來刪除線路(使用 AcxDeviceRemoveCircuit)。 工廠線路通常不應該在重新平衡期間移除。
使用者模式檔案句柄
ACX 不會等待使用者模式檔案句柄關閉,再重新建立新的線路。 文件系統句柄的存留期不會繫結至裝置/線路所使用的硬體資源存留期。 客戶端必須負責接聽介面抵達/移除,並關閉並重新開啟檔句柄。
舊文件句柄被標記為過時,而 ACX 會使與它們相關的所有 I/O 請求失敗。