アロケーター

アロケーターとの間のインターフェイスは、 IMXFIAllocatorMXF です。 これらのインターフェイスを使用すると、メモリの割り当てと割り当て解除をすることなく、DMUS_KERNEL_EVENT 構造体を再利用できます。 IMXF::PutMessage はアロケーターに構造体を提供し、IAllocatorMXF::GetMessage は再利用のためにアロケーターから新しくゼロになった DMUS_KERNEL_EVENT 構造体を取得します。 (アロケーターは、プール内の空の DMUS_KERNEL_EVENT 構造体を使用して作成され、空の状態で開始されないようにします)。次の図に示すように、IRP (DMUS_EVENTHEADER 構造体の形式) は dmusic.dll からアンパッカーに入ります。

Diagram illustrating the flow of IRPs through port and miniport drivers in the allocator process.

アンパッカーは IAllocatorMXF::GetMessage を呼び出し、空の DMUS_KERNEL_EVENT 構造体を取得します。 アンパッカーは、IRP からDMUS_KERNEL_EVENT 構造体を取得し、これらの構造体 (MIDI イベントごとに 1 つ) を埋め、(MXF インターフェイスを使用して) シーケンサーに渡します。 シーケンサーは、タイム スタンプに基づいてそれらを並べ替え、期限が切れたら IMXF::PutMessage を呼び出してミニポート ドライバーに渡します。 ミニポート ドライバーは、ウェーブ データにレンダリングできるように、DMUS_KERNEL_EVENT 構造体から MIDI データをプルします。 使用済み DMUS_KERNEL_EVENT 構造体は、別の IMXF::PutMessage 呼び出しでアロケーターに戻されます。

キャプチャの逆の状況が発生します。 MIDI データがハードウェアからミニポート ドライバーに入り、ミニポート ドライバーが IAllocatorMXF::GetMessage を呼び出して空の DMUS_KERNEL_EVENT 構造体を取得します。 DMUS_KERNEL_EVENT 構造体にはタイム スタンプとデータが格納され、IMXF::P utMessage 経由でキャプチャ シンクに渡されます。 ミニポート ドライバーは、DMUS_KERNEL_EVENT 構造体で DMUS_KEF_EVENT_INCOMPLETE フラグを設定する場合、構造体ごとに複数のメッセージを渡すことができます。 DMus ポート ドライバーのキャプチャ シンクは、この生データ ストリームを解析し、タイムスタンプ付きの MIDI メッセージ (構造体ごとに 1 つ) を含む DMUS_KERNEL_EVENT 構造体を出力します。

ミニポート ドライバー自体がキャプチャ シンクにタイムスタンプ付きメッセージを出力することもできます。 この場合、ドライバーは DMUS_KERNEL_EVENT で DMUS_KEF_EVENT_INCOMPLETE ビットを設定しません。 キャプチャ シンクは、タイムスタンプが設定された構造体を直接パッカーに渡します。この構造体はメッセージを IRP にパッケージ化し、dmusic.dll に送信します。 DirectMusic キャプチャは MIDI のレコーディング専用です。 ウェーブ レコーディングには、DirectSound キャプチャを使用します。

パッカーが DMUS_KERNEL_EVENT 構造体からデータを取り出すと、使用済みの DMUS_KERNEL_EVENT 構造体を IMXF::PutMessage でアロケーターに破棄します。 IRP バッファーがいっぱいになると、dmusic.dll に渡されます。 パッカーは、dmusic.dll から空の IRP を受け取り、入力して完了します。 さらに多くの IRP が流れてくるため、常に IRP を入力することができます。