Partilhar via


Alocador

As interfaces de e para o alocador são IMXF e IAllocatorMXF. Essas interfaces permitem que você reutilize DMUS_KERNEL_EVENT estruturas sem alocar e deslocalizar memória. IMXF::PutMessage fornece uma estrutura para o alocador e IAllocatorMXF::GetMessage recupera uma estrutura recém-zerada de DMUS_KERNEL_EVENT do alocador para reutilização. (O alocador é criado com estruturas de DMUS_KERNEL_EVENT vazias no pool para que nunca esteja vazio.) Como mostrado no diagrama a seguir, os IRPs (na forma de estruturas DMUS_EVENTHEADER) vêm de dmusic.dll para o descompactador.

Diagrama ilustrando o fluxo de IRPs através de drivers de porta e miniporta no processo de alocador.

O unpacker chama IAllocatorMXF::GetMessage para recuperar uma estrutura vazia DMUS_KERNEL_EVENT. O unpacker recupera as estruturas DMUS_KERNEL_EVENT do IRP, preenche essas estruturas (uma por evento MIDI) e as passa para o sequenciador (usando sua interface MXF). O sequenciador reordena-os com base nos seus carimbos temporais e, quando são devidos, passa-os para o driver de miniport chamando IMXF::PutMessage. O driver de miniporta extrai os dados MIDI das estruturas de DMUS_KERNEL_EVENT para renderizá-los em dados de onda. Ele passa as estruturas de DMUS_KERNEL_EVENT usadas de volta para o alocador com outra chamada IMXF::PutMessage.

A situação inversa acontece na captura. Os dados MIDI vêm do hardware para o driver de miniport e o driver de miniport chama IAllocatorMXF::GetMessage para obter uma estrutura DMUS_KERNEL_EVENT vazia. As estruturas DMUS_KERNEL_EVENT são preenchidas com carimbos de data/hora e dados, e passadas para o coletor de captura via IMXF::PutMessage. O driver de miniportas pode passar mais de uma mensagem por estrutura se definir o flag DMUS_KEF_EVENT_INCOMPLETE na estrutura DMUS_KERNEL_EVENT. O coletor de captura no driver de porta DMus analisa esse fluxo de dados brutos e emite estruturas DMUS_KERNEL_EVENT que contêm mensagens MIDI carimbadas com data/hora (uma por estrutura).

Também é possível que o próprio driver da miniporta emita mensagens com carimbo de data/hora para o coletor de captura. Nesse caso, o driver não define o bit de DMUS_KEF_EVENT_INCOMPLETE no DMUS_KERNEL_EVENT. O coletor de captura passa as estruturas com carimbo de data/hora diretamente para o empacotador, que empacota as mensagens em IRPs e as envia para dmusic.dll. A captura DirectMusic é apenas para gravação MIDI. Para gravação de ondas, use a captura DirectSound.

Quando o empacotador extrai os dados de uma estrutura DMUS_KERNEL_EVENT, ele descarta a estrutura DMUS_KERNEL_EVENT usada no alocador através de IMXF::PutMessage. Quando o buffer de IRP está cheio, ele é passado para dmusic.dll. O empacotador recebe IRPs vazios de dmusic.dll, preenche-os e finaliza-os. Mais IRPs continuam escorrendo para baixo para que sempre tenha um para preencher.