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