Zuweisung

Die Schnittstellen zum und vom Allocator sind IMXF und IAllocatorMXF. Mit diesen Schnittstellen können Sie DMUS_KERNEL_EVENT Strukturen wiederverwenden, ohne Arbeitsspeicher zuzuweisen und die Zuordnung aufzugeben. IMXF::P utMessage gibt dem Allocator eine Struktur, und IAllocatorMXF::GetMessage ruft eine neu null markierte DMUS_KERNEL_EVENT Struktur aus dem Allocator zur Wiederverwendung ab. (Die Zuweisung wird mit leeren DMUS_KERNEL_EVENT Strukturen im Pool erstellt, sodass er nie leer beginnt.) Wie in der folgenden Abbildung dargestellt, kommen IRPs (in Form von DMUS_EVENTHEADER Strukturen) von dmusic.dll zum Entpacker.

Diagramm, das den Fluss von IRPs über Port- und Miniporttreiber im Zuweisungsprozess veranschaulicht.

Das Entpacker ruft IAllocatorMXF::GetMessage auf, um eine leere DMUS_KERNEL_EVENT-Struktur abzurufen. Das Entpacker ruft die DMUS_KERNEL_EVENT Strukturen aus dem IRP ab, füllt diese Strukturen (eine pro MIDI-Ereignis) aus und übergibt sie an den Sequenzer (mithilfe seiner MXF-Schnittstelle). Der Sequencer sortiert sie basierend auf ihren Zeitstempeln neu und übergibt sie an den Miniporttreiber, wenn sie fällig sind, indem IMXF::P utMessage aufgerufen wird. Der Miniporttreiber zieht die MIDI-Daten aus den DMUS_KERNEL_EVENT Strukturen, damit er sie in Wellendaten rendern kann. Die verwendeten DMUS_KERNEL_EVENT Strukturen werden mit einem anderen IMXF::P utMessage-Aufruf an den Allocator zurückgegeben.

Die umgekehrte Situation tritt bei der Erfassung auf. MIDI-Daten werden von der Hardware an den Miniporttreiber übergeben, und der Miniporttreiber ruft IAllocatorMXF::GetMessage auf, um eine leere DMUS_KERNEL_EVENT-Struktur zu erhalten. DMUS_KERNEL_EVENT Strukturen werden mit Zeitstempeln und Daten gefüllt und über IMXF::P utMessage an die Erfassungssenke übergeben. Der Miniporttreiber kann mehr als eine Nachricht pro Struktur übergeben, wenn er das flag DMUS_KEF_EVENT_INCOMPLETE in der DMUS_KERNEL_EVENT-Struktur festlegt. Die Aufnahmesenke im DMus-Porttreiber analysiert diesen Rohdatenstrom und gibt DMUS_KERNEL_EVENT Strukturen aus, die zeitstempelte MIDI-Nachrichten (eine pro Struktur) enthalten.

Es ist auch möglich, dass der Miniporttreiber selbst Zeitstempelnachrichten an die Erfassungssenke ausgibt. In diesem Fall legt der Treiber das DMUS_KEF_EVENT_INCOMPLETE Bit in DMUS_KERNEL_EVENT nicht fest. Die Erfassungssenke übergibt die Zeitstempelstrukturen direkt an den Packer, der die Nachrichten in IRPs verpackt und an dmusic.dll sendet. DirectMusic-Aufnahme ist nur für die Aufnahme von MIDI vorgesehen. Verwenden Sie für die Wellenaufzeichnung DirectSound-Aufnahme.

Wenn der Packer die Daten aus einer DMUS_KERNEL_EVENT-Struktur abruft, verwirft er die verwendete DMUS_KERNEL_EVENT-Struktur in der Zuweisung mit IMXF::P utMessage. Wenn der IRP-Puffer voll ist, wird er an dmusic.dll übergeben. Der Packer empfängt leere IRPs von dmusic.dll, füllt sie aus und schließt sie ab. Weitere IRPs rieseln immer wieder nach unten, sodass sie immer eine zu füllen haben.