Kernel-Mode 軟體合成器的波浪接收
如 合成器和波接收中所述,DMus 埠驅動程式會實作在核心模式中運作的軟體合成器波浪接收。 合成器的迷你埠驅動程式會將 ISynthSinkDMus 介面公開給埠驅動程式。 埠驅動程式的波接收會使用此介面來讀取合成器所產生的波資料。
若要使用 DMus 埠驅動程式的波浪接收,DMus 迷你埠驅動程式應該定義具有兩種針腳類型的 DirectMusic 篩選器:
DirectMusic 輸入針腳或 MIDI 輸入針腳。 此針腳是包含 MIDI 訊息之轉譯資料流程的接收。
波浪輸出針腳。 此針腳是轉譯資料流程的來源,其中包含 PCM 範例。
下圖顯示 DirectMusic 篩選準則,其中包含合成器節點 (KSNODETYPE_SYNTHESIZER) 。 此篩選準則會提供 DirectMusic 輸入針腳和波浪輸出針腳,以符合核心模式軟體合成器的上述需求。 (此外,支援舊版 MIDI 合成的 DMus 迷你埠驅動程式可以提供 MIDI 輸入針腳。)
在圖形左側,MIDI 資料流程會透過 DirectMusic 輸入針腳輸入篩選。 此針腳具有 IMXF 介面,它會向埠驅動程式公開。 埠驅動程式會藉由呼叫 IMiniportDMus::NewStream 方法來取得此介面。 埠驅動程式會藉由呼叫 IMXF::P utMessage 方法,將 MIDI 訊息饋送至針腳。
在圖形右側,波浪資料流程會透過波浪輸出針腳結束篩選,並流向埠驅動程式的波浪接收。 埠驅動程式會透過其 ISynthSinkDMus 介面與針腳通訊。 埠驅動程式會先呼叫 IMiniportDMus::NewStream 以取得具有 IMXF 介面的資料流程物件,然後查詢其 ISynthSinkDMus 介面的物件,以取得此介面。 波浪接收會藉由呼叫 ISynthSinkDMus::Render 方法,從針腳提取波浪資料。
雖然硬體合成器基本上可以依賴埠驅動程式的波浪接收進行轉譯, 但 ISynthSinkDMus::Render 的呼叫會對 MIDI 資料流程增加足夠的延遲,讓許多互動式應用程式無法連線。 為了減少串流延遲,硬體合成器可能會有混合和波浪轉譯硬體的內部連線,而不是使用埠驅動程式的波浪接收。 這種類型的合成器會將上圖右側的波浪輸出針腳取代為硬式連接 (表示為硬體混音器) 的 橋接器接腳 。
ISynthSinkDMus介面提供方法,可透過波接收轉譯波資料、從參考時間轉換為取樣時間和返回,以及同步處理至主要時鐘:
ISynthSinkDMus::RefTimeToSample
ISynthSinkDMus::SampleToRefTime
ISynthSinkDMus 繼承自 IMXF 介面。 如需詳細資訊,請參閱 ISynthSinkDMus。
上圖中的 DMus 迷你埠驅動程式會識別其 DirectMusic 輸入針腳和波浪輸出針腳,如下所示:
為了識別其 DirectMusic 輸入針腳,迷你埠驅動程式會定義針腳的資料範圍,使其具有類型KSDATAFORMAT_TYPE_MUSIC的主要格式,以及類型為 KSDATAFORMAT_SUBTYPE_DIRECTMUSIC 的子格式。 這個組合表示針腳接受時間戳記的 MIDI 資料流程。 資料範圍描述項是類型 為 KSDATARANGE_MUSIC的結構。 (如需範例,請參閱 DirectMusic Stream Data Range.) 迷你埠驅動程式會定義要KSPIN_DATAFLOW_IN的針腳資料流程方向。 (PCPIN_DESCRIPTOR 結構的 KsPinDescriptor。DataFlow 成員指出資料流程方向。) 呼叫 IMiniportDMus::NewStream 以建立此針腳的資料流程物件時,埠驅動程式會將 StreamType 參數設定為 DMUS_STREAM_MIDI_RENDER。
為了識別其波浪輸出針腳,迷你埠驅動程式會定義針腳的資料範圍,使其具有類型KSDATAFORMAT_TYPE_AUDIO的主要格式,以及類型為 KSDATAFORMAT_SUBTYPE_PCM 的子格式。 這個組合表示針腳會發出包含 PCM 樣本的波浪音訊資料流程。 資料範圍描述項是類型 為 KSDATARANGE_AUDIO的結構。 (請參閱 PCM 資料流程資料範圍中的範例。) 迷你埠驅動程式會定義要KSPIN_DATAFLOW_OUT的針腳資料流程方向。 呼叫 IMiniportDMus::NewStream 以建立此針腳的資料流程物件時,埠驅動程式會將 StreamType 參數設定為 DMUS_STREAM_WAVE_SINK。
此外,如果驅動程式支援合成器的 MIDI 輸入針腳,其定義會類似于 DirectMusic 輸入針腳,但針腳定義會指定類型為 KSDATAFORMAT_SUBTYPE_MIDI 的子格式,而針腳會接受原始 MIDI 資料流程,而不是時間戳記 MIDI 資料流程。