Partager via


Blocs de données audio

[La fonctionnalité associée à cette page, Waveform Audio, est une fonctionnalité héritée. Elle a été remplacée par WASAPI et graphiques audio. WASAPI et graphiques audio ont été optimisés pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise WASAPI et graphiques audio au lieu de Waveform Audio, le cas échéant. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Les fonctions waveInAddBuffer et waveOutWrite nécessitent que les applications allouent des blocs de données pour passer aux pilotes de périphérique à des fins d’enregistrement ou de lecture. Ces deux fonctions utilisent la structure WAVEHDR pour décrire son bloc de données.

Avant d’utiliser l’une de ces fonctions pour passer un bloc de données à un pilote de périphérique, vous devez allouer de la mémoire pour le bloc de données et la structure d’en-tête qui décrit le bloc de données. Les en-têtes peuvent être préparés et non préparés à l’aide des fonctions suivantes.

Fonction Description
waveInPrepareHeader Prépare un bloc de données d’entrée audio waveform.
waveInUnprepareHeader Nettoie la préparation sur un bloc de données d’entrée audio waveform.
waveOutPrepareHeader Prépare un bloc de données de sortie audio de forme d’onde.
waveOutUnprepareHeader Nettoie la préparation sur un bloc de données de sortie audio waveform.

 

Avant de passer un bloc de données audio à un pilote de périphérique, vous devez préparer le bloc de données en le transmettant à waveInPrepareHeader ou waveOutPrepareHeader. Lorsque le pilote de périphérique est terminé avec le bloc de données et le retourne, vous devez nettoyer cette préparation en passant le bloc de données à waveInUnprepareHeader ou waveOutUnprepareHeader avant que toute mémoire allouée ne puisse être libérée.

À moins que les données d’entrée et de sortie de forme d’onde ne soient suffisamment petites pour être contenues dans un bloc de données unique, les applications doivent continuellement fournir 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 bloc de données unique 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 que l’application puisse libérer la mémoire associée au bloc de données et à la structure d’en-tête. Il existe plusieurs façons de déterminer quand un pilote de périphérique est terminé avec un bloc de données :

  • En spécifiant une fonction de rappel pour recevoir un message envoyé par le pilote lorsqu’il est terminé avec un bloc de données
  • À l’aide d’un rappel d’événement
  • En spécifiant une fenêtre ou un thread pour recevoir un message envoyé par le pilote lorsqu’il est terminé avec un bloc de données
  • En interrogeant le bit WHDR_DONE dans le dwFlags membre de la structure WAVEHDR envoyée avec chaque bloc de données

Si une application n’obtient pas de bloc de données sur le pilote de périphérique si nécessaire, il peut y avoir un écart audible dans la lecture ou une perte d’informations enregistrées entrantes. Cela nécessite au moins un schéma de mise en mémoire tampon double , en restant au moins un bloc de données devant le pilote de périphérique.

Les rubriques suivantes décrivent les façons de déterminer quand un pilote de périphérique est terminé avec un bloc de données :

Utilisation d’une fonction de rappel pour traiter les messages du pilote