實作 PortCls 音訊驅動程式的 PnP 重新平衡

PnP 重新平衡用於需要重新配置記憶體資源的特定 PCI 案例中。

重新平衡可在兩個主要案例中觸發:

  1. PCI hotplug:使用者插入裝置,而 PCI 匯流排沒有足夠的資源可載入新裝置的驅動程式。 屬於此類別的一些裝置範例包括「規則」、「USB-C」和「NVME 儲存體」。 在此案例中,記憶體資源必須重新排列併合並 (重新平衡) ,以支援要新增的其他裝置。
  2. PCI 可調整大小的 BAR:在裝置的驅動程式成功載入記憶體中之後,它會要求額外的資源。 裝置的一些範例包括高階圖形卡和儲存裝置。 如需視訊驅動程式支援的詳細資訊,請參閱 可調整大小的 BAR 支援。 本主題描述如何實作埠Cls 音訊驅動程式的 PnP 重新平衡。

PnP 重新平衡適用于 Windows 10 1511 版和更新版本的 Windows。

重新平衡需求

如果符合下列條件,Portcls 音訊驅動程式就能夠支援重新平衡:

為了在有作用中的音訊串流時支援重新平衡,portcls 音訊驅動程式必須符合這兩個額外需求之一。

OR

發生重新平衡時的音訊資料流程行為

如果觸發了重新平衡,當有作用中的音訊串流時,驅動程式會針對作用中的音訊串流提供支援重新平衡,則所有作用中的音訊串流都會停止,而且不會自動重新開機。

IPortClsPnp COM 介面

IPortClsPnp 是埠類別驅動程式 (PortCls) 公開給介面卡的 PnP 管理介面。

IPortClsPnp 繼承自 IUnknown ,也支援下列方法:

音訊迷你埠驅動程式可以使用 Portcls 匯出或透過在 WaveRT 埠物件上公開的 IPortClsPnp COM 介面 IPortClsPnp 註冊 PNP 通知介面。 使用 IPortClsPnp::RegisterAdapterPnpManagementIPortClsPnp::UnregisterAdapterPnpManagement 來註冊和取消註冊。

必要的 PortCls 匯出 DIS

IAdapterPnpManagement 是介面卡應該實作並註冊的介面,如果想要接收 PnP 管理訊息。 使用 PcRegisterAdapterPnpManagement向 PortCls 註冊此介面。 使用 PcUnregisterAdapterPnpManagement向 PortCls 取消註冊此介面。

必要的驅動程式 DIS

必須實作下列 IAdapterPnpManagement DIS 以支援重新平衡。

  • 處理 QueryStop 時,Portcls 會呼叫IAdapterPnpManagement::GetSupportedRebalanceType。 迷你埠會傳回支援的重新平衡類型,如 PC_REBALANCE_TYPE 列舉中所定義。

    注意 Portcls 會在進行此呼叫之前取得裝置全域鎖定,因此迷你埠必須儘快執行此呼叫。

  • IAdapterPnpManagement::P npQueryStop 會在成功 QueryStop IRP 之前,由 portcls 叫用。 這只是通知,而且呼叫不會傳回值。

    注意 Portcls 會在進行此呼叫之前取得裝置全域鎖定,因此迷你埠必須儘快執行此呼叫。 當停止擱置時,Portcls 會封鎖 (保留) 任何新的建立要求。

  • 處理 CanceStop IRP 時,portcls 會叫用IAdapterPnpManagement::P npCancelStop。 這只是通知。 即使先前未收到 PnpQueryStop 通知,迷你埠還是可以接收 PnpCancelStop。 應寫入迷你埠以容納此行為。 例如,當 QueryStop 邏輯在 Portcls 有機會將此通知轉送至迷你埠之前,IRP 會失敗的情況。 在此案例中,PnP 管理員仍會叫用 PnP 取消停止。

    注意 Portcls 會在進行此呼叫之前取得裝置全域鎖定,因此迷你埠必須儘快執行此呼叫。 當停止擱置時,Portcls 會封鎖 (保留) 任何新的建立要求。 PortCls 會在解除擱置的停止時重新開機任何手寫筆建立要求。

  • IAdapterPnpManagement::P npStop 會在停止所有 Ioctl 作業,並將作用中資料流程從 [run|pause|acquire] 狀態移至 [stop] 狀態之後叫用。 保留裝置全域鎖定時,不會進行此呼叫。 因此,迷你埠有機會等候其非同步作業, (工作專案、dpc、非同步執行緒) 並取消註冊其音訊子裝置。 從此呼叫傳回之前,迷你埠必須確定已釋放所有 h/w 資源。

    注意 迷你埠不得等候目前的迷你埠/串流物件遭到刪除,因為現有音訊用戶端何時會釋放目前的控制碼不清楚。 PnpStop 執行緒在系統損毀的情況下無法永久封鎖,也就是這是 PnP/Power 執行緒。

IMiniportPnpNotify

IMiniportPnpNotify 是選擇性介面,可讓迷你埠物件 (音訊子裝置) 接收 PnP 狀態變更通知。

迷你埠有機會接收其已註冊之每個音訊子裝置的 PnP 停止通知。 若要接收此通知,子裝置必須支援 IMiniportPnpNotify。 此介面上只會定義 IMiniportPnpNotify::P npStop 通知。

IMiniportPnpNotify 介面適用于 WaveRT 和拓撲。

注意 由於 Portcls 會在進行此呼叫之前取得裝置全域鎖定,因此迷你埠必須儘快執行此呼叫。 當其他執行緒/工作專案正在等候裝置全域鎖定時,處理此呼叫時,迷你埠不得等候其他活動,以防止死結。 如有需要,迷你埠可以在 IAdapterPnpManagement::P npStop 呼叫中等候。