ACX IO 要求封包 IRP
本主題提供音訊類別 eXtensions (ACX) IO 要求封包 IRP 的摘要。
如需 ACX 的一般資訊,請參閱 ACX 音訊類別延伸模組概觀 和 ACX 物件的摘要。 如需 ACX 目標和同步處理的相關信息,請參閱 ACX 目標和驅動程式同步處理。
IRP 要求分派
ACX 用戶端會透過驅動程式要求 (IRP) 指定動作。 如需 IRP 的一般資訊, 請參閱 I/O 要求封 包和 具有可重複使用 IRP 的封包驅動 I/O。
用戶端會使用線路或數據流句柄,將此要求傳送至線路/針腳/元素/數據流。 要求標識碼是三重:
- set (guid),
- id/index (ulong)
- 選用 pin-id/node-id (ulong) 值。
在建立時,驅動程式可以選擇性地將屬性/方法/事件與下列其中一個對象產生關聯:
- pin
- 線路
- stream
- 項目
每個屬性/方法/事件都是由標識符和回呼處理程式來識別。 根據預設,ACX 會定義 KS-clients(使用者模式層)所需的所有屬性/方法/事件,因此驅動程式不需要重新定義它們。 驅動程式只需要定義其自定義屬性/方法/事件。
當 ACX 收到 ACX/KS 樣式 IoCtrl 要求時,它會驗證要求,並將呼叫端的緩衝區鎖定在記憶體中。 此驗證和緩衝區鎖定是在 ACX 在初始化時註冊的 WDM 前置進程回呼中完成。 在此階段中,ACX 會將自己的完成回呼新增至 WDM IRP,再將它轉送回 WDF 以進行一般分派。 完成回呼讓 ACX 有機會視需要新增/插入任何相容性因應措施。
接下來的 WDF 會叫用動態分派 IRP 回呼,在此回呼 ACX/驅動程式中,選擇性地將 WDF 佇列與要求產生關聯。 在此回呼中,ACX 會找出目標 ACX 物件:使用傳送此要求的句柄,以及要求內的選擇性 pin-id/node-id/circuit-element。
在音訊複合裝置中,目標物件(僅限線路)可能位於與原本傳送要求之堆疊不同的堆疊上。 此外,要求可能需要對多個堆疊採取行動,例如,這是數據流變更狀態。
識別目標之後,ACX 會檢查目標線路/stream-object 是否指定默認處理佇列的覆寫,如果不是,ACX 會使用與目前句柄相關聯的預設佇列。 ACX/驅動程序接著會指示 WDF 將要求插入指定的 或預設佇列中。
下一個 WDF 會在出現時叫用呼叫端進程回呼。 ACX 不需要/使用呼叫端進程回呼,因為它已在前置進程回呼中鎖定記憶體中的緩衝區。 因此,ACX 會通知 WDF 在指定要求的目標佇列之後,不要叫用同進程回呼。
次要佇列使用量
默認 ACX 佇列是電源管理的序列、無鎖定佇列。 驅動程式應該將任何不定時間的要求移至次要佇列。 驅動程式受控佇列可以是手動被動佇列,驅動程式可以保留這些要求,直到稍後準備好完成這些要求為止。
電源參考要求
ACX 會在將要求分派給驅動程式之前自動啟動裝置。 這會使用 WDF 電源受控佇列以隱含方式完成。 這會建立類似 portcls 的行為。 也就是說,在分派要求之前,會先取得電源參考。
叫用佇列的分派處理程式
接下來 WDF 會取得電源參考,並叫用佇列的分派處理程式。 與 ACX 處理程式相關聯的預設佇列會檢查是否有任何前置進程覆寫,如果存在,ACX 會叫用已註冊驅動程式的前置進程回呼。 ACX 可讓驅動程式根據要求類型(屬性、事件和方法)和(選擇性地)要求標識符來指定覆寫。
如果指定了前置進程回呼,在 ACX 叫用回呼之後,驅動程式就會擁有要求。 驅動程式可以完成要求,或將它轉送回 ACX 以進行一般分派。
如果未指定前置進程回呼,或驅動程式將要求傳回給 ACX,ACX 會擷取目標 ACX 物件,並找出宣告的屬性/事件/方法回呼。 然後,它會叫用回呼,以傳遞 WDF 要求和目標 ACX 物件(circuit/stream/circuit-element)。
下一個 ACX (或針對自定義屬性,驅動程式)會執行要求的動作並完成要求,或如果要求需要不確定的時間量,驅動程式可以將要求移至次要佇列。 驅動程序負責串行化和完成任何作用中的擱置要求。
此圖說明一般要求分派工作流程。
此圖表說明當驅動程式已定義 ACX 前置處理回呼時分派工作流程,不過最終要求是由 ACX 架構處理。
ACX 線路 PnP 內部介面
為了協助 ACX 連接點管理員 (EM) 與 ACX 驅動程式元件(內核模式或使用者模式元件)之間的通訊,ACX 會定義下列內部 PnP 裝置介面:
- ACXCATEGORY_CIRCUITFACTORY
- ACXCATEGORY_CIRCUIT
EM 會使用 ACXCATEGORY_CIRCUITFACTORY 介面,指示目標裝置建立或移除此類型的特定線路。 當底線裝置能夠建立線路時,此介面為作用中,否則會停用(例如:移除、意外移除、停止或手動移除)。
音訊子系統會使用ACXCATEGORY_CIRCUIT(這可以在與線路管理員堆疊不同的裝置堆疊上建立),來追蹤和與 ACX 線路通訊。 建立線路並準備好處理命令時,此介面會處於作用中狀態。
如需其他電源和 PnP 程式的相關信息,請參閱 ACX 裝置列舉 和 ACX 電源管理。