服務接收和服務群組物件
PortCls 系統驅動程式會實作 IServiceSink 和 IServiceGroup 介面,以利埠和迷你埠驅動程式。 埠驅動程式會使用這些介面將中斷通知散發至自己的服務常式,而迷你埠驅動程式可以選擇將這些介面用於類似用途。 IServiceSink 物件會封裝服務常式,而 IServiceGroup 物件代表 IServiceSink 物件的群組。 當服務群組收到服務要求時,會將要求散發給其每個服務接收。
IServiceGroup 繼承自 IServiceSink。 因為服務群組也是服務接收,所以服務群組能夠包含其他服務群組,雖然音訊驅動程式通常不會使用這項功能。 埠驅動程式目前使用服務群組來解構中斷服務的要求,雖然服務群組的功能一般足以使其可用於其他用途。
迷你埠驅動程式的插斷服務常式 (ISR) 在埠驅動程式中呼叫下列其中一個通知方法:
通知方法會採用服務群組的指標作為呼叫參數。 在此呼叫期間,埠驅動程式會呼叫服務群組的 IServiceSink::RequestService 方法,將延遲程序呼叫排入佇列 (DPC) 。 當 DPC 執行時,會將服務要求轉送至服務群組中的所有成員物件。
miniport-driver 程式碼通常不需要呼叫任何 IServiceGroup 介面方法。 不過,埠驅動程式會呼叫這些方法,將自己的 IServiceSink 物件新增至它從迷你埠驅動程式取得的服務群組。 迷你埠驅動程式會視需要建立服務群組物件,並將這些服務群組與需要定期維護的迷你埠和串流物件產生關聯。 例如,WaveCyclic 迷你埠驅動程式會將資料流程物件與它指定為 IMiniportWaveCyclic::NewStream 方法的輸出參數的服務群組產生關聯。
在 WaveCyclic 迷你埠驅動程式的內容中,將所有資料流程與一個服務群組產生關聯,會導致埠驅動程式根據單一通知來服務所有資料流程。 將每個資料流程與它自己的服務群組產生關聯,可讓插斷服務常式選取在 DPC 執行期間由埠驅動程式提供服務的資料流程。
當埠驅動程式呼叫下列其中一個初始化方法時,迷你埠驅動程式會輸出其服務群組的參考:
埠驅動程式會將自己的 IServiceSink 物件新增至它從 Init 呼叫取得的服務群組。 當迷你埠驅動程式的 ISR 稍後呼叫 Notify 以傳送通知給該服務群組時,服務群組會將通知轉送到埠驅動程式 IServiceSink 物件的 DPC 佇列,然後藉由呼叫下列其中一個服務方法,將通知轉送至迷你埠驅動程式:
當埠驅動程式呼叫下列其中一個串流建立方法時,迷你埠驅動程式也會輸出其服務群組的參考:
IMiniportWaveCyclic::NewStream
如先前所述,迷你埠驅動程式可以選擇為每個資料流程建立不同的服務群組,或在所有資料流程之間共用單一服務群組。
下列方法可協助 MIDI 和 DMus 埠驅動程式避免中斷硬體:
IPortMidi::RegisterServiceGroup
IPortDMus::RegisterServiceGroup
在其 Init 方法執行期間,MIDI 或 DMus 迷你埠驅動程式通常會在啟動合成器之前呼叫埠驅動程式的 RegisterServiceGroup 方法。 此呼叫的目的是允許埠驅動程式在硬體開始產生中斷之前,將其服務接收物件插入 (包含其中斷處理常式) 至服務群組。 雖然 Init 方法會輸出埠驅動程式的服務群組指標,但埠驅動程式只能在 從 Init傳回之後使用此指標。
在 WavePci 埠驅動程式的情況下,埠物件會將自己的 IServiceSink 物件新增至它從 IMiniportWavePci::NewStream 呼叫取得的服務群組。 當迷你埠驅動程式的 ISR 稍後呼叫 Notify 以傳送通知給該服務群組時,服務群組會將通知轉送至埠驅動程式的 IServiceSink 物件排入 DPC 佇列,接著會執行下列動作:
藉由呼叫服務方法 IMiniportWavePciStream::Service,將通知轉送至迷你埠資料流程。
觸發針腳上已準備好引發的任何位置和/或時鐘事件。
IServiceSink介面支援單一方法:
IServiceGroup介面支援下列方法:
IServiceGroup::CancelDelayedService
IServiceGroup::RequestDelayedService
IServiceGroup::SupportDelayedService
此外,PortCls 系統驅動程式會提供 PcNewServiceGroup 函式來建立新的服務群組物件。 不過,建立服務接收物件沒有任何類似的函式存在。 埠驅動程式只會將 IServiceSink 介面新增至其主要端口物件的實作,也就是建立物件時,服務接收也是。 埠驅動程式可以將埠物件的 IServiceSink 介面新增至它從迷你埠驅動程式 的 Init 或 NewStream 方法收到的服務群組。 為了方便起見,標頭檔 Portcls.h 會定義 IMP_IServiceSink 和 IMP_IServiceGroup 常數,以將 IServiceSink 和 IServiceGroup 介面新增至驅動程式物件。