Allocator

Le interfacce da e verso l'allocatore sono IMXF e IAllocatorMXF. Queste interfacce consentono di riutilizzare DMUS_KERNEL_EVENT strutture senza allocare e deallocare la memoria. IMXF::P utMessage fornisce una struttura all'allocatore e IAllocatorMXF::GetMessage recupera una struttura DMUS_KERNEL_EVENT appena zero dall'allocatore per il riutilizzo. L'allocatore viene creato con strutture DMUS_KERNEL_EVENT vuote nel pool in modo che non inizi mai vuoto. Come illustrato nella figura del diagramma seguente, gli IRP (sotto forma di strutture DMUS_EVENTHEADER) provengono da dmusic.dll al decompressore.

Diagramma che illustra il flusso dei runtime di integrazione attraverso i driver porta e miniport nel processo di allocatore.

Il decompressore chiama IAllocatorMXF::GetMessage per recuperare una struttura DMUS_KERNEL_EVENT vuota. Il decompressore recupera le strutture DMUS_KERNEL_EVENT dall'IRP, riempie queste strutture (una per ogni evento MIDI) e le passa al sequencer (usando l'interfaccia MXF). Sequencer li riordina in base ai timestamp e, quando sono scaduti, li passa al driver miniport chiamando IMXF::P utMessage. Il driver miniport estrae i dati MIDI dalle strutture DMUS_KERNEL_EVENT in modo che possano eseguirne il rendering in dati d'onda. Passa le strutture di DMUS_KERNEL_EVENT usate all'allocatore con un'altra chiamata IMXF::P utMessage .

La situazione inversa si verifica per l'acquisizione. I dati MIDI provengono dall'hardware al driver miniport e il driver miniport chiama IAllocatorMXF::GetMessage per ottenere una struttura DMUS_KERNEL_EVENT vuota. DMUS_KERNEL_EVENT strutture vengono riempite con timestamp e dati e passati al sink di acquisizione tramite IMXF::P utMessage. Il driver miniport può passare più di un messaggio per struttura se imposta il flag DMUS_KEF_EVENT_INCOMPLETE nella struttura DMUS_KERNEL_EVENT. Il sink di acquisizione nel driver di porta DMus analizza questo flusso di dati non elaborato e genera DMUS_KERNEL_EVENT strutture che contengono messaggi MIDI con timestamp (uno per ogni struttura).

È anche possibile che il driver miniport stesso emetta messaggi con timestamp al sink di acquisizione. In questo caso, il driver non imposta il bit DMUS_KEF_EVENT_INCOMPLETE in DMUS_KERNEL_EVENT. Il sink di acquisizione passa le strutture con timestamp direttamente al packer, che inserisce i messaggi in irP e li invia a dmusic.dll. L'acquisizione DirectMusic è solo per la registrazione midi. Per la registrazione delle onde, usare l'acquisizione DirectSound.

Quando il packer estrae i dati da una struttura DMUS_KERNEL_EVENT, rimuove la struttura DMUS_KERNEL_EVENT utilizzata nell'allocatore con IMXF::P utMessage. Quando il buffer IRP è pieno, viene passato fino a dmusic.dll. Il packer riceve i runtime di integrazione vuoti da dmusic.dll, li riempie e li completa. Più IRP continuano a scorrere verso il basso in modo che ne abbia sempre uno da riempire.