Allocateur

Les interfaces vers et depuis l’allocateur sont IMXF et IAllocatorMXF. Ces interfaces vous permettent de réutiliser DMUS_KERNEL_EVENT structures sans allouer et désaffecter de la mémoire. IMXF ::P utMessage donne une structure à l’allocateur et IAllocatorMXF ::GetMessage récupère une structure de DMUS_KERNEL_EVENT fraîchement zéro de l’allocateur pour réutilisation. (L’allocateur est créé avec des structures DMUS_KERNEL_EVENT vides dans le pool afin qu’il ne démarre jamais vide.) Comme le montre le diagramme suivant, les IRP (sous la forme de structures DMUS_EVENTHEADER) proviennent de dmusic.dll au déballeur.

Diagramme illustrant le flux des IRP via les pilotes de port et de miniport dans le processus d’allocation.

Le déballeur appelle IAllocatorMXF ::GetMessage pour récupérer une structure de DMUS_KERNEL_EVENT vide. Le déballeur récupère les structures DMUS_KERNEL_EVENT à partir de l’IRP, remplit ces structures (une par événement MIDI) et les transmet au séquenceur (à l’aide de son interface MXF). Le séquenceur les réorganise en fonction de leurs horodatages et, à leur échéance, les transmet au pilote miniport en appelant IMXF ::P utMessage. Le pilote miniport extrait les données MIDI des structures DMUS_KERNEL_EVENT afin de pouvoir les restituer en données d’onde. Il transmet les structures DMUS_KERNEL_EVENT utilisées à l’allocateur avec un autre appel IMXF ::P utMessage .

La situation inverse se produit pour la capture. Les données MIDI proviennent du matériel vers le pilote miniport et le pilote miniport appelle IAllocatorMXF ::GetMessage pour obtenir une structure de DMUS_KERNEL_EVENT vide. DMUS_KERNEL_EVENT structures sont remplies d’horodatages et de données, puis transmises au récepteur de capture via IMXF ::P utMessage. Le pilote miniport peut transmettre plusieurs messages par structure s’il définit l’indicateur DMUS_KEF_EVENT_INCOMPLETE dans la structure DMUS_KERNEL_EVENT. Le récepteur de capture dans le pilote de port DMus analyse ce flux de données brutes et émet des structures DMUS_KERNEL_EVENT qui contiennent des messages MIDI horodatés (un par structure).

Il est également possible pour le pilote miniport lui-même d’émettre des messages horodatés vers le récepteur de capture. Dans ce cas, le pilote ne définit pas le bit DMUS_KEF_EVENT_INCOMPLETE dans DMUS_KERNEL_EVENT. Le récepteur de capture transmet les structures horodatées directement au packer, qui empaquete les messages dans les IRP et les envoie à dmusic.dll. La capture DirectMusic est uniquement destinée à l’enregistrement MIDI. Pour l’enregistrement d’ondes, utilisez la capture DirectSound.

Lorsque le packer extrait les données d’une structure de DMUS_KERNEL_EVENT, il abandonne la structure de DMUS_KERNEL_EVENT utilisée dans l’allocateur avec IMXF ::P utMessage. Lorsque la mémoire tampon IRP est pleine, elle est passée à dmusic.dll. L’empaqueteur reçoit des IRP vides de dmusic.dll, les remplit et les termine. Plus d’IRPs continuent de ruisseler vers le bas afin qu’il en ait toujours un à remplir.