Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
As interfaces de e para o alocador são IMXF e IAllocatorMXF. Essas interfaces permitem reutilizar estruturas DMUS_KERNEL_EVENT sem alocar e desalocar memória. IMXF::PutMessage fornece uma estrutura para o alocador e IAllocatorMXF::GetMessage obtém uma estrutura de DMUS_KERNEL_EVENT zerada do alocador para reuso. (O alocador é criado com estruturas DMUS_KERNEL_EVENT vazias no pool para que ele nunca comece vazio.) Conforme mostrado na figura do diagrama a seguir, os IRPs (na forma de estruturas DMUS_EVENTHEADER) chegam de dmusic.dll ao desempacotador.
O desempacotador chama IAllocatorMXF::GetMessage para recuperar uma vazia estrutura DMUS_KERNEL_EVENT. O extrator 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 timestamps e, quando eles são devidos, passa-os para o driver de miniporto chamando IMXF::PutMessage. O driver de miniporto extrai os dados MIDI das estruturas de DMUS_KERNEL_EVENT para poder renderizá-los em dados em forma 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 ocorre para 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. Estruturas DMUS_KERNEL_EVENT são preenchidas com carimbos de tempo e dados e passadas para o coletor de captura por meio de IMXF::PutMessage. O driver miniport pode 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 estruturas DMUS_KERNEL_EVENT que contêm as mensagens MIDI com carimbo de tempo (uma por estrutura).
Também é possível que o próprio miniport driver emita mensagens com carimbo de tempo para o destino 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 do DirectSound.
Quando o empacotador extrai os dados de uma estrutura de DMUS_KERNEL_EVENT, ele descarta a estrutura de DMUS_KERNEL_EVENT usada no alocador com IMXF::PutMessage. 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.