カーネル モードのソフトウェア シンセサイザーのウェーブ シンク

「シンセサイザーとウェーブ シンク」で説明したように、DMus ポート ドライバーは、カーネル モードで動作するソフトウェア シンセサイザーのウェーブ シンクを実装します。 シンセサイザーのミニポート ドライバーは、ポート ドライバーに ISynthSinkDMus インターフェイスを公開します。 ポート ドライバーのウェーブ シンクでは、このインターフェイスを使用して、シンセサイザーによって生成されるウェーブ データを読み取ります。

DMus ポート ドライバーのウェーブ シンクを利用するには、DMus ミニポート ドライバーは、次の 2 種類のピンを持つ DirectMusic フィルターを定義する必要があります。

  • DirectMusic 入力ピンまたは MIDI 入力ピン。 このピンは、MIDI メッセージを含むレンダリング ストリームのシンクです。

  • ウェーブ出力ピン。 このピンは、PCM サンプルを含むレンダリング ストリームのソースです。

次の図は、シンセサイザー ノード (KSNODETYPE_SYNTHESIZER) を含む DirectMusic フィルターを示しています。 このフィルターは、DirectMusic 入力ピンとウェーブ出力ピンを提供することで、カーネル モード ソフトウェア シンセサイザーの上記の要件を満たします。 (さらに、従来の MIDI 合成をサポートする DMus ミニポート ドライバーは、MIDI 入力ピンを提供できます)。

Diagram illustrating a DirectMusic filter for a kernel-mode software synthesizer with DirectMusic input pin and wave output pin.

図の左側では、MIDI ストリームが DirectMusic 入力ピンを介してフィルターに入ります。 このピンには、ポート ドライバーに公開する IMXF インターフェイスがあります。 ポート ドライバーは、IMiniportDMus::NewStream メソッドを呼び出すことで、このインターフェイスを取得します。 ポート ドライバーは、IMXF::PutMessage メソッドを呼び出すことで、MIDI メッセージをピンに送信します。

図の右側では、ウェーブ ストリームがウェーブ出力ピンを介してフィルターを終了し、ポート ドライバーのウェーブ シンクに流れます。 ポート ドライバーは、その ISynthSinkDMus インターフェイスを介してピンと通信します。 ポート ドライバーは、まず IMiniportDMus::NewStream を呼び出して IMXF インターフェイスを持つストリーム オブジェクトを取得し、そのオブジェクトの ISynthSinkDMus インターフェイスに対してクエリを実行することで、このインターフェイスを取得します。 ウェーブ シンクは、ISynthSinkDMus::Renderメソッドを呼び出して、ピンからウェーブ データをプルします。

ハードウェア シンセサイザーは、原則としてポート ドライバのウェーブ シンクに依存してレンダリングすることができますが、ISynthSinkDMus::Render への呼び出しは MIDI ストリームの待機時間が増えるため、多くの対話型アプリケーションにとっては魅力的ではありません。 ハードウェア シンセサイザーは、ストリームの待機時間を減らすために、ポート ドライバーのウェーブ シンクを使う代わりに、ミキシングやウェーブ レンダリング ハードウェアへの内部接続を持っている場合があります。 このタイプのシンセサイザーは、先の図の右側にあるウェーブ出力ピンを、ハードウェア ミキサーへの有線接続 (ブリッジ ピンとして表される) に置き換えます。

ISynthSinkDMus インターフェイスは、ウェーブ シンクを通してウェーブ データをレンダリングし、リファレンス タイムからサンプル タイムに変換して、マスター クロックに同期するメソッドを提供します。

ISynthSinkDMus::RefTimeToSample

ISynthSinkDMus::Render

ISynthSinkDMus::SampleToRefTime

ISynthSinkDMus::SyncToMaster

ISynthSinkDMusIMXF インターフェイスから継承します。 詳しくは、「ISynthSinkDMus」を参照してください。

前の図の DMus ミニポート ドライバーは、DirectMusic 入力ピンとウェーブ出力ピンを次のように識別します。

  • ミニポート ドライバーは、DirectMusic 入力ピンを識別するために、ピンのデータ範囲を KSDATAFORMAT_TYPE_MUSIC 型の主要な形式と KSDATAFORMAT_SUBTYPE_DIRECTMUSIC 型のサブフォーマットで定義します。 この組み合わせは、ピンがタイムスタンプ付きの MIDI ストリームを受け入れることを示します。 データ範囲記述子は、KSDATARANGE_MUSIC 型の構造体です。 (例については、「DirectMusic ストリームのデータ範囲」を参照してください)。ミニポート ドライバーは、ピンのデータ フロー方向を 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 ストリームを受け入れます。