Partager via


Blocs de données audio

[La fonctionnalité associée à cette page, Waveform Audio, est une fonctionnalité héritée. Il a été remplacé par WASAPI et Audio Graphs. Les graphiques WASAPI et Audio ont été optimisés pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise WASAPI et Audio Graphs au lieu de Waveform Audio, lorsque cela est possible. 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 exigent que les applications allouent des blocs de données à 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 de forme d’onde.
waveInUnprepareHeader Nettoie la préparation sur un bloc de données d’entrée audio de forme d’onde.
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 de forme d’onde.

 

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 a terminé le bloc de données et qu’il le retourne, vous devez propre cette préparation en passant le bloc de données à waveInUnprepareHeader ou waveOutUnprepareHeader avant de libérer toute mémoire allouée.

À moins que les données d’entrée et de sortie audio de forme d’onde soient suffisamment petites pour être contenues dans un seul bloc de données, 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 seul bloc de données est utilisé, une application doit être en mesure de déterminer quand un pilote de périphérique a terminé 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 a terminé un bloc de données :

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

Si une application n’obtient pas de bloc de données sur le pilote de périphérique en cas de besoin, 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 double mise en mémoire tampon, en restant au moins un bloc de données devant le pilote de périphérique.

Les rubriques suivantes décrivent comment déterminer quand un pilote de périphérique a terminé un bloc de données :

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