共用方式為


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

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

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

  1. PCI 熱插機:使用者插入裝置,而PCI總線沒有足夠的資源可載入新裝置的驅動程式。 屬於此類別的一些裝置範例包括雷電、USB-C 和 NVME 儲存體。 在此案例中,記憶體資源必須重新排列和合併(重新平衡),以支援要新增的其他裝置。
  2. PCI 可重設大小的 BAR:在裝置的驅動程式成功載入記憶體後,它會要求其他資源。 裝置的一些範例包括高端圖形卡和存儲設備。 如需影片驅動程式支援的詳細資訊, 請參閱 Resizable BAR 支援。 本主題描述實作 PortCls 音訊驅動程式的 PnP 重新平衡所需執行的工作。

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

重新平衡需求

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

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

OR

發生重新平衡時的音訊串流行為

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

IPortClsPnp COM 介面

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

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

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

必要的 PortCls 匯出 DIS

IAdapterPnpManagement 是配接器在想要接收 PnP 管理訊息時應該實作並註冊的介面。 使用 PcRegisterAdapterPnpManagement 向 PortCls 註冊此介面。 使用 PcUnregisterAdapterPnpManagement 取消註冊此介面與 PortCls。

必要的驅動程式 DIS

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

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

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

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

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

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

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

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

    注意 迷你埠不得等待目前的迷你埠/串流物件刪除,因為目前目前音訊用戶端何時會釋放目前的句柄。 PnpStop 線程無法在系統當機的情況下永遠封鎖,亦即這是 PnP/Power 線程。

IMiniportPnpNotify

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

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

IMiniportPnpNotify 介面可在 WaveRT 和 Topology 上使用。

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