實作 PortCls 音訊驅動程式的 PnP 重新平衡
PnP 重新平衡用於需要重新配置記憶體資源的特定 PCI 案例中。
重新平衡可在兩個主要案例中觸發:
- PCI hotplug:使用者插入裝置,而 PCI 匯流排沒有足夠的資源可載入新裝置的驅動程式。 屬於此類別的一些裝置範例包括「規則」、「USB-C」和「NVME 儲存體」。 在此案例中,記憶體資源必須重新排列併合並 (重新平衡) ,以支援要新增的其他裝置。
- PCI 可調整大小的 BAR:在裝置的驅動程式成功載入記憶體中之後,它會要求額外的資源。 裝置的一些範例包括高階圖形卡和儲存裝置。 如需視訊驅動程式支援的詳細資訊,請參閱 可調整大小的 BAR 支援。 本主題描述如何實作埠Cls 音訊驅動程式的 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 以支援重新平衡。
處理 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 呼叫中等候。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應