ACX 裝置列舉
本主題討論 ACX 裝置列舉、啟動和關機,以及裝置重新平衡。 如需 ACX 的一般概觀,請參閱 ACX 音訊類別延伸模組概觀。 如需 ACX 電源管理和 PnP 的相關信息,請參閱 ACX 電源管理。
靜態音訊裝置的 ACX 裝置列舉和啟動
若要瞭解 ACX 啟動的運作方式,將會說明下列案例。
- 音訊裝置是由單一線路表示。
- 音訊/線路存留期會系結至 PnP 裝置存留期。
- 單一裝置可以針對不同的音訊裝置建立多個線路。
- KMDF 核心模式環境。
啟動順序為:
WDM DriverEntry。 驅動程式範圍。 適用於 WDF 驅動程式的 DriverEntry 例程
- Init 追蹤。
- 選擇性地註冊卸除。
- 建立 WDFDRIVER。
- 呼叫 ACX 以執行任何後置驅動程式 init。
- 選擇性地執行任何後置驅動程式 init。
WDF DeviceAdd。 裝置範圍。 EVT_WDF_DRIVER_DEVICE_ADD回呼函式
- 呼叫 ACX 以初始化裝置 init 內容 -
ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)
ACX_DEVICEINIT_CONFIG_INIT函式 - 註冊 WDF PnP 電源回呼 -
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
- 使用 AcxDeviceInitialize 建立裝置
- 呼叫 ACX 以執行任何張貼裝置 init。
- 選擇性地執行任何張貼裝置 init。
- 呼叫 ACX 以初始化裝置 init 內容 -
WDF PrepareHardware。 裝置範圍。 EVT_WDF_DEVICE_PREPARE_HARDWARE回呼函式。
建立和初始化硬體資源(針對中斷和線程,向 ACX 註冊它們)。
建立一或多個線路(一次建立)。
- 建立 AcxCircuitInit 內容。
- 新增回呼。
- 建立 AcxCircuit。
- 選擇性地執行任何後電路 init。
- 使用 AcxDeviceAddCircuitDevice 註冊線路。
WDF 裝置 D0 專案回呼。 裝置範圍。 EVT_WDF_DEVICE_D0_ENTRY回呼函式。
ACX 會在 所有線路上叫用 EvtAcxCircuitPowerUp 回呼 。 線路範圍。
ACX 在裝置電源關閉之前,將串流(如果有的話)移至其先前的狀態。 串流實例範圍。
WDF 佇列會重新啟動。
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART回呼函式。 裝置範圍。 - 在每次從 Dx 啟動電源之後的 Init。
ACX 數據流新增
- ACX 線路上的 ACX 串流新增 (實例) (ACX 線路上的 ACX 回呼) – 在叫用 WDF 自我管理 I/O Init 或重新啟動之後,隨時叫用,且裝置位於 D0 中。 線路範圍。
- 輸入:AcxStreamInit 內容、ACXCIRCUIT。
- 新增回呼。
- 建立 AcxStream (實例)。
- 選擇性地執行任何後置數據流實例 init。
- 在傳回時,ACX 會啟動此串流實例,而且在此案例中是唯一的音訊路徑,因此它允許串流訊息通過。
動態音訊裝置的 ACX 裝置列舉和啟動
在此案例中,假設有下列情況。
- 動態音訊支援(在運行時間建立/刪除音訊裝置)。
- 裝置存留期不會系結至線路存留期。
- 單一裝置可以針對不同的音訊裝置建立多個線路。
- 上述簡單靜態模式上的 Piggyback 只會新增動態模式特有的元素。
- 使用子原始 PDO。
- KMDF 核心模式環境。
此案例的啟動順序如下:
WDM DriverEntry。 驅動程式範圍。
- Init 追蹤。
- 選擇性地註冊卸除。
- 建立 WDFDRIVER。
- 呼叫 ACX 以執行任何後置驅動程式 init。
- 選擇性地執行任何後置驅動程式 init。
WDF DeviceAdd。 裝置範圍。
- 呼叫 ACX 以初始化裝置 init 內容。
- 建立裝置。
- 呼叫 ACX 以執行任何張貼裝置 init。
- 選擇性地執行任何張貼裝置 init。
WDF PrepareHardware。 裝置範圍。
- 建立和初始化硬體資源(針對中斷和線程,向 ACX 註冊它們)。
WDF 裝置 D0 專案回呼。 裝置範圍。
WDF 佇列會重新啟動。
WDF DeviceSelfManagedIoInit。 裝置範圍。
WDF DeviceSelfManagedIoRestart。 裝置範圍。
- 每次從 Dx 開機後 Init。
線路動態建立 (隨時)
- 驅動程式會呼叫 WdfPdoInitAllocate 來配置WDFDEVICE_INIT結構。 驅動程式負責 在成功建立裝置之前遇到任何失敗時叫用 WdfDeviceInitFree 。
- 驅動程式會指定它想要接收的任何 PnP/電源回呼。
- 驅動程式會建立裝置。
- 驅動程式藉由呼叫 AcxDeviceAddCircuitDevice 來具現化新的裝置/線路。
- WDF/PnP 接管,且上一節所述的簡單列舉/啟動模式會進行。
AcxFactoryCircuit
ACX 驅動程式也可以使用 AcxFactoryCircuit 函式和 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 要求。