Compartir a través de


Asignador

Las interfaces hacia y desde el asignador son IMXF e IAllocatorMXF. Estas interfaces permiten reutilizar DMUS_KERNEL_EVENT estructuras sin asignar y desasignar memoria. IMXF::P utMessage proporciona una estructura al asignador e IAllocatorMXF::GetMessage recupera una estructura de DMUS_KERNEL_EVENT recién cero del asignador para su reutilización. (El asignador se crea con estructuras de DMUS_KERNEL_EVENT vacías en el grupo para que nunca comience vacía). Como se muestra en la ilustración de diagrama siguiente, los IRP (en forma de estructuras de DMUS_EVENTHEADER) proceden de dmusic.dll al desempaquetador.

Diagrama que ilustra el flujo de IRP a través de controladores de puerto y minipuerto en el proceso de asignador.

El desempaquetador llama a IAllocatorMXF::GetMessage para recuperar una estructura de DMUS_KERNEL_EVENT vacía. El desempaquetador recupera las estructuras de DMUS_KERNEL_EVENT del IRP, rellena estas estructuras (una por evento MIDI) y las pasa al secuenciador (mediante su interfaz MXF). El secuenciador los reordena en función de sus marcas de tiempo y, cuando venciendo, los pasa al controlador de miniporte llamando a IMXF::P utMessage. El controlador de minipuerto extrae los datos MIDI de las estructuras DMUS_KERNEL_EVENT para que pueda representarlos en datos de onda. Pasa las estructuras de DMUS_KERNEL_EVENT usadas al asignador con otra llamada IMXF::P utMessage .

La situación inversa se produce para la captura. Los datos MIDI proceden del hardware al controlador de minipuerto y el controlador de minipuerto llama a IAllocatorMXF::GetMessage para obtener una estructura de DMUS_KERNEL_EVENT vacía. DMUS_KERNEL_EVENT estructuras se rellenan con marcas de tiempo y datos y se pasan al receptor de captura a través de IMXF::P utMessage. El controlador de minipuerto puede pasar más de un mensaje por estructura si establece la marca de DMUS_KEF_EVENT_INCOMPLETE en la estructura DMUS_KERNEL_EVENT. El receptor de captura del controlador de puerto DMus analiza este flujo de datos sin procesar y emite estructuras DMUS_KERNEL_EVENT que contienen mensajes MIDI con marca de tiempo (uno por estructura).

También es posible que el propio controlador de miniporte emita mensajes con marca de tiempo al receptor de captura. En este caso, el controlador no establece el bit de DMUS_KEF_EVENT_INCOMPLETE en DMUS_KERNEL_EVENT. El receptor de captura pasa las estructuras con marca de tiempo directamente al empaquetador, que empaqueta los mensajes en IRP y los envía a dmusic.dll. La captura de DirectMusic solo es para grabar MIDI. Para la grabación de onda, use la captura de DirectSound.

Cuando el empaquetador extrae los datos de una estructura de DMUS_KERNEL_EVENT, descarta la estructura de DMUS_KERNEL_EVENT usada en el asignador con IMXF::P utMessage. Cuando el búfer IRP está lleno, se pasa hasta dmusic.dll. El empaquetador recibe IRP vacíos de dmusic.dll, los rellena y los completa. Más IRP siguen engañando para que siempre tenga uno que rellenar.