Delen via


Toewijzer

De interfaces van en naar de allocator zijn IMXF en IAllocatorMXF. Met deze interfaces kunt u DMUS_KERNEL_EVENT-structuren hergebruiken zonder het geheugen toe te wijzen en vrij te geven. IMXF::PutMessage geeft een structuur aan de allocator en IAllocatorMXF::GetMessage haalt een nieuw genulde DMUS_KERNEL_EVENT-structuur op van de allocator voor hergebruik. (De allocator wordt gemaakt met lege DMUS_KERNEL_EVENT structuren in de pool, zodat deze nooit leeg begint.) Zoals wordt weergegeven in de volgende afbeelding van het diagram, komen IRP's (in de vorm van DMUS_EVENTHEADER structuren) van dmusic.dll tot de uitpaker.

Diagram waarin de stroom van IRP's via poort- en minipoortstuurprogramma's in het allocatorproces wordt geïllustreerd.

De uitpaker roept IAllocatorMXF::GetMessage aan om een lege DMUS_KERNEL_EVENT structuur op te halen. De uitpaker haalt de DMUS_KERNEL_EVENT structuren op uit de IRP, vult deze structuren (één per MIDI-gebeurtenis) in en geeft ze door aan de sequencer (met behulp van de MXF-interface). De sequencer herschikt ze op basis van hun tijdstempels en, wanneer ze op dat moment zijn, geeft ze door aan het minipoortstuurprogramma door IMXF::PutMessage aan te roepen. De miniportdriver haalt de MIDI-gegevens uit de structuren van DMUS_KERNEL_EVENT, zodat deze kunnen worden omgezet naar wav-gegevens. Het geeft de gebruikte DMUS_KERNEL_EVENT structuren terug aan de allocator via een andere IMXF::PutMessage oproep.

** Treedt de omgekeerde situatie op bij vastleggen. MIDI-gegevens komen van de hardware naar het minipoortstuurprogramma en het minipoortstuurprogramma roept IAllocatorMXF::GetMessage aan om een lege DMUS_KERNEL_EVENT structuur op te halen. DMUS_KERNEL_EVENT structuren worden gevuld met tijdstempels en gegevens en doorgegeven aan de capture-sink via IMXF::PutMessage. Het minipoortstuurprogramma kan meer dan één bericht per structuur doorgeven als de DMUS_KEF_EVENT_INCOMPLETE vlag in de DMUS_KERNEL_EVENT structuur wordt ingesteld. De capture sink in het DMus-poortstuurprogramma verwerkt deze onbewerkte gegevensstroom en verzendt DMUS_KERNEL_EVENT-structuren die tijdgestempelde MIDI-berichten bevatten (één per structuur).

Het is ook mogelijk dat het minipoortstuurprogramma zelf tijdstempelberichten verzendt naar de opnamesink. In dit geval stelt het stuurprogramma de bit DMUS_KEF_EVENT_INCOMPLETE niet in DMUS_KERNEL_EVENT. De capture-sink geeft de tijdstempelstructuren rechtstreeks door aan de packer, die de berichten in IRP's verpakt en naar dmusic.dllverzendt. DirectMusic-opname is alleen bedoeld voor het opnemen van MIDI. Voor golfopname gebruikt u DirectSound capture.

Wanneer de pakker de gegevens uit een DMUS_KERNEL_EVENT-structuur haalt, wordt de gebruikte DMUS_KERNEL_EVENT-structuur naar de allocator afgevoerd met IMXF::PutMessage. Wanneer de IRP-buffer vol is, wordt deze doorgegeven aan dmusic.dll. De packer ontvangt lege IRP's van dmusic.dll, vult ze in en voltooit ze. Meer IRP's blijven binnenkomen zodat er altijd één klaar is om in te vullen.