實作 PortCls 音訊驅動程式的 PnP 重新平衡
PnP 重新平衡用於需要重新配置記憶體資源的特定PCI案例中。
在兩個主要案例中可以觸發重新平衡:
- PCI 熱插機:使用者插入裝置,而PCI總線沒有足夠的資源可載入新裝置的驅動程式。 屬於此類別的一些裝置範例包括雷電、USB-C 和 NVME 儲存體。 在此案例中,記憶體資源必須重新排列和合併(重新平衡),以支援要新增的其他裝置。
- PCI 可重設大小的 BAR:在裝置的驅動程式成功載入記憶體後,它會要求其他資源。 裝置的一些範例包括高端圖形卡和存儲設備。 如需影片驅動程式支援的詳細資訊, 請參閱 Resizable BAR 支援。 本主題描述實作 PortCls 音訊驅動程式的 PnP 重新平衡所需執行的工作。
PnP 重新平衡適用於 Windows 10 版本 1511 和更新版本的 Windows。
重新平衡需求
如果符合下列條件,Portcls 音訊驅動程式就能夠支援重新平衡:
- Miniport 必須向 Portcls 註冊 IAdapterPnpManagement 介面。
- Miniport 必須從 IAdapterPnpManagement::GetSupportedRebalanceType 傳回 PcRebalanceRemoveSubdevices。
- 拓撲和 WaveRT 是支援的兩種埠類型。
為了在有作用中的音訊串流時支援重新平衡,portcls 音訊驅動程序必須符合這兩個額外需求的其中一個。
- 驅動程式支援音訊數據流的 IMiniportWaveRTInputStream::GetReadPacket 和 IMiniportWaveRTOutputStream 封包介面。 這是建議選項。
OR
- 如果驅動程式不支持數據流的取得/寫入 IMiniportWaveRT,驅動程式不得支援KSPROPERTY_RTAUDIO_POSITIONREGISTER和KSPROPERTY_RTAUDIO_CLOCKREGISTER。 在此案例中,音訊引擎將使用 IMiniportWaveRTStream::GetPosition 。
發生重新平衡時的音訊串流行為
如果觸發重新平衡,當有作用中的音訊串流,且驅動程式提供支援重新平衡作用中的音訊串流時,所有作用中的音訊串流都會停止,而且不會自動重新啟動。
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 呼叫中等候。