Gestion des blocs de données MIDI
Les applications qui utilisent des blocs de données pour passer des messages exclusifs système (à l’aide des fonctions midiOutLongMsg et midiInAddBuffer ) et des mémoires tampons de flux (à l’aide de la fonction midiStreamOut ) doivent fournir en permanence au pilote de périphérique des blocs de données jusqu’à ce que la lecture ou l’enregistrement soit terminé.
Même si un seul bloc de données est utilisé, une application doit être en mesure de déterminer quand un pilote de périphérique est terminé avec le bloc de données afin de libérer la mémoire associée au bloc de données et à la structure d’en-tête. Trois méthodes peuvent être utilisées pour déterminer quand un pilote de périphérique est terminé avec un bloc de données :
- Spécifiez une fonction de rappel pour recevoir un message envoyé par le pilote quand il a terminé avec un bloc de données. Pour obtenir des données d’entrée MIDI horodatées, vous devez utiliser une fonction de rappel.
- Utilisez un rappel d’événement (pour la sortie uniquement).
- Utilisez un rappel de fenêtre ou de thread pour recevoir un message envoyé par le pilote quand il a terminé avec un bloc de données.
Si une application n’obtient pas de bloc de données sur le pilote de périphérique lorsque cela est nécessaire, un écart sonore dans la lecture ou une perte d’informations enregistrées entrantes peuvent se produire. Au minimum, une application doit utiliser un schéma de double mise en mémoire tampon pour conserver au moins un bloc de données avant le pilote de périphérique.
Utilisation d’une fonction de rappel pour traiter les messages du pilote
Vous pouvez écrire votre propre fonction de rappel pour traiter les messages envoyés par le pilote de périphérique. Pour utiliser une fonction de rappel, spécifiez l’indicateur CALLBACK_FUNCTION dans le paramètre dwFlags et l’adresse de la fonction de rappel dans le paramètre dwCallback de la fonction midiInOpen ou midiOutOpen .
Les messages envoyés à une fonction de rappel sont similaires aux messages envoyés à une fenêtre, sauf qu’ils ont deux paramètres doubleword au lieu d’un paramètre entier non signé et d’un paramètre doubleword. Pour plus d’informations sur ces messages, consultez Envoi de messages System-Exclusive et Gestion de l’enregistrement MIDI.
Utilisez l’une des techniques suivantes pour passer instance données d’une application à une fonction de rappel :
- Utilisez le paramètre dwCallbackInstance de la fonction qui ouvre le pilote de périphérique.
- Utilisez le membre dwUser de la structure MIDIHDR qui identifie un bloc de données envoyé à un pilote de périphérique MIDI.
Si vous avez besoin de plus de 32 bits de données instance, transmettez l’adresse d’une structure contenant les informations supplémentaires.
Utilisation d’un rappel d’événement pour traiter les messages de pilote
Pour utiliser un rappel d’événement, utilisez la fonction CreateEvent pour récupérer le handle d’un événement et spécifier CALLBACK_EVENT dans l’appel à la fonction midiOutOpen .
Un rappel d’événement est défini par tout ce qui peut provoquer un rappel de fonction. Contrairement aux fonctions de rappel et aux rappels de fenêtres ou de threads, les rappels d’événements ne reçoivent pas de notifications de fermeture, de fin ou d’ouverture spécifiques. Par conséquent, une application peut avoir à case activée la status du processus qu’elle attend après l’événement.
Pour plus d’informations sur les rappels d’événements, consultez Utilisation d’un rappel d’événement pour gérer la lecture en mémoire tampon.
Utilisation d’un rappel de fenêtre ou de thread pour traiter les messages de pilote
Pour utiliser un rappel de fenêtre, spécifiez l’indicateur CALLBACK_WINDOW dans le paramètre dwFlags et un handle de fenêtre dans le mot de bas ordre du paramètre dwCallback de la fonction midiInOpen ou midiOutOpen . Les messages du pilote sont envoyés à la fonction de procédure de fenêtre pour la fenêtre identifiée par le handle dans dwCallback.
De même, pour utiliser un rappel de thread, spécifiez l’indicateur CALLBACK_THREAD et un identificateur de thread dans l’appel à midiInOpen ou midiOutOpen. Dans ce cas, les messages sont publiés dans le thread spécifié plutôt que dans une fenêtre.
Les messages envoyés à une fenêtre ou à un rappel de thread sont spécifiques à l’appareil MIDI utilisé. Pour plus d’informations sur ces messages, consultez Envoi de messages System-Exclusive et Gestion de l’enregistrement MIDI.
Rubriques connexes