Compartilhar via


Allocator

As interfaces de e para o alocador são IMXF e IAllocatorMXF. Essas interfaces permitem reutilizar DMUS_KERNEL_EVENT estruturas sem alocar e desalocar memória. IMXF::P utMessage fornece uma estrutura para o alocador e IAllocatorMXF::GetMessage recupera uma estrutura de DMUS_KERNEL_EVENT recém-zerado do alocador para reutilização. (O alocador é criado com estruturas de DMUS_KERNEL_EVENT vazias no pool para que ele nunca comece vazio.) Conforme mostrado na figura de diagrama a seguir, os IRPs (na forma de estruturas de DMUS_EVENTHEADER) vêm de dmusic.dll para o desempacotar.

Diagrama ilustrando o fluxo de IRPs por meio de drivers de porta e miniport no processo do alocador.

O desempacotar chama IAllocatorMXF::GetMessage para recuperar uma estrutura de DMUS_KERNEL_EVENT vazia. O desempacotar 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 os reordena com base em seus carimbos de data/hora e, quando eles são devidos, os passa para o driver de miniporto chamando IMXF::P utMessage. O driver de miniporto extrai os dados MIDI das estruturas de DMUS_KERNEL_EVENT para que ele possa renderizá-los em dados de onda. Ele passa as estruturas de DMUS_KERNEL_EVENT usadas de volta para o alocador com outra chamada IMXF::P utMessage .

A situação inversa ocorre para captura. Os dados MIDI vêm do hardware para o driver de miniporto e o driver de miniporto chama IAllocatorMXF::GetMessage para obter uma estrutura de DMUS_KERNEL_EVENT vazia. DMUS_KERNEL_EVENT estruturas são preenchidas com carimbos de data/hora e passadas para o coletor de captura por meio de IMXF::P utMessage. O driver de miniporte poderá passar mais de uma mensagem por estrutura se definir o sinalizador DMUS_KEF_EVENT_INCOMPLETE na estrutura DMUS_KERNEL_EVENT. O coletor de captura no driver de porta DMus analisa esse fluxo de dados bruto e emite DMUS_KERNEL_EVENT estruturas que contêm mensagens MIDI com carimbo de data/hora (uma por estrutura).

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

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