Administración de bloques de datos MIDI
Las aplicaciones que usan bloques de datos para pasar mensajes exclusivos del sistema (mediante las funciones midiOutLongMsg y midiInAddBuffer ) y los búferes de flujo (mediante la función midiStreamOut ) deben proporcionar continuamente el controlador de dispositivo con bloques de datos hasta que se complete la reproducción o grabación.
Incluso si se usa un único bloque de datos, una aplicación debe ser capaz de determinar cuándo finaliza un controlador de dispositivo con el bloque de datos para que pueda liberar la memoria asociada con el bloque de datos y la estructura del encabezado. Se pueden usar tres métodos para determinar cuándo finaliza un controlador de dispositivo con un bloque de datos:
- Especifique una función de devolución de llamada para recibir un mensaje enviado por el controlador cuando termine con un bloque de datos. Para obtener datos de entrada MIDI con marca de tiempo, debe usar una función de devolución de llamada.
- Use una devolución de llamada de evento (solo para la salida).
- Use una devolución de llamada de ventana o subproceso para recibir un mensaje enviado por el controlador cuando haya terminado con un bloque de datos.
Si una aplicación no obtiene un bloque de datos al controlador del dispositivo cuando es necesario, puede producirse una brecha audible en la reproducción o una pérdida de información grabada entrante. Como mínimo, una aplicación debe usar un esquema de almacenamiento en búfer doble para mantener al menos un bloque de datos delante del controlador del dispositivo.
Uso de una función de devolución de llamada para procesar mensajes del controlador
Puede escribir su propia función de devolución de llamada para procesar los mensajes enviados por el controlador del dispositivo. Para usar una función de devolución de llamada, especifique la marca CALLBACK_FUNCTION en el parámetro dwFlags y la dirección de la función de devolución de llamada en el parámetro dwCallback de la función midiInOpen o midiOutOpen .
Los mensajes enviados a una función de devolución de llamada son similares a los mensajes enviados a una ventana, excepto que tienen dos parámetros de doble palabra en lugar de un parámetro entero sin signo y un parámetro doubleword. Para obtener más información sobre estos mensajes, vea Envío de mensajes System-Exclusive y Administración de grabaciones MIDI.
Use una de las técnicas siguientes para pasar datos de instancia de una aplicación a una función de devolución de llamada:
- Use el parámetro dwCallbackInstance de la función que abre el controlador de dispositivo.
- Utilice el miembro dwUser de la estructura MIDIHDR que identifica un bloque de datos que se envía a un controlador de dispositivo MIDI.
Si necesita más de 32 bits de datos de instancia, pase una dirección de una estructura que contenga la información adicional.
Uso de una devolución de llamada de eventos para procesar mensajes del controlador
Para usar una devolución de llamada de evento, use la función CreateEvent para recuperar el identificador de un evento y especificar CALLBACK_EVENT en la llamada a la función midiOutOpen .
Cualquier cosa que pueda provocar una devolución de llamada de función establece una devolución de llamada de evento. A diferencia de las funciones de devolución de llamada y las devoluciones de llamada de ventana o subproceso, las devoluciones de llamada de eventos no reciben notificaciones de cierre, finalización o apertura específicas. Por lo tanto, es posible que una aplicación tenga que comprobar el estado del proceso que está esperando después de que se produzca el evento.
Para obtener más información sobre las devoluciones de llamada de eventos, consulte Uso de una devolución de llamada de eventos para administrar la reproducción almacenada en búfer.
Uso de una devolución de llamada de ventana o subproceso para procesar mensajes del controlador
Para usar una devolución de llamada de ventana, especifique la marca CALLBACK_WINDOW en el parámetro dwFlags y un identificador de ventana en la palabra de orden bajo del parámetro dwCallback de la función midiInOpen o midiOutOpen . Los mensajes del controlador se enviarán a la función de procedimiento de ventana para la ventana identificada por el identificador en dwCallback.
Del mismo modo, para usar una devolución de llamada de subproceso, especifique la marca CALLBACK_THREAD y un identificador de subproceso en la llamada a midiInOpen o midiOutOpen. En este caso, los mensajes se publicarán en el subproceso especificado en lugar de en una ventana.
Los mensajes enviados a una devolución de llamada de ventana o subproceso son específicos del dispositivo MIDI usado. Para obtener más información sobre estos mensajes, vea Envío de mensajes System-Exclusive y Administración de grabaciones MIDI.
Temas relacionados