Partager via


Latence de flux pendant l’enregistrement

Alors qu’un flux d’enregistrement audio est à l’état Exécuter, le rôle du pilote de port WaveRT est minimal. Comme indiqué dans le diagramme suivant, pendant le processus d’enregistrement, l’appareil audio capture les données audio et les écrit dans la mémoire tampon cyclique. Le moteur audio lit ensuite ces données à partir de la mémoire tampon. Cette activité ne nécessite aucune intervention du pilote de port. En d’autres termes, les données audio circulent directement entre le matériel audio et l’application en mode utilisateur sans être touchées par les composants logiciels en mode noyau.

Dans le diagramme suivant, les positions d’enregistrement et de lecture progressent continuellement de gauche à droite à mesure que le flux traverse la mémoire tampon. Lorsque l’enregistrement ou la position de lecture atteint la fin de la mémoire tampon, il s’enroule au début de la mémoire tampon.

Diagramme montrant les positions d’enregistrement et de lecture dans une mémoire tampon cyclique pendant l’enregistrement audio.

Le diagramme précédent identifie la position de l’enregistrement comme emplacement de mémoire tampon de l’exemple que le périphérique audio est en train d’enregistrer (capture à partir du microphone via le convertisseur analogique-numérique ou ADC). Notez que la position de l’enregistrement est l’emplacement de mémoire tampon dans lequel le périphérique audio écrit l’exemple après son passage par le FIFO. La position de lecture est la position de mémoire tampon à partir de laquelle le moteur audio lit l’exemple suivant.

La latence entre le moment où le périphérique audio capture un exemple audio dans l’ADC jusqu’à ce que le client le lit est simplement la séparation entre les positions d’enregistrement et de lecture. Cette séparation est la somme des sources de latence suivantes (marquées comme A et B dans le diagramme) :

Latence A : après avoir capturé des données à partir de l’ADC, le périphérique audio stocke les données dans un fiFO matériel jusqu’à ce qu’il puisse écrire les données dans la mémoire tampon cyclique.

Latence B : une fois que le périphérique audio écrit des données dans la mémoire tampon cyclique, les données résident dans la mémoire tampon jusqu’à ce que le client lit les données.

Le client n’a aucun contrôle sur la latence A, qui dépend entièrement du matériel. Un FIFO classique peut stocker environ 64 échantillons de l’ADC. Toutefois, le client contrôle la latence B. Rendre la latence B trop importante entraîne des retards inutiles dans le système, mais la rendre trop petite risque de lire les données trop tôt, avant que l’appareil audio n’ait été écrit dans la mémoire tampon.

Bien que le client puisse configurer un minuteur pour activer régulièrement son thread de lecture de mémoire tampon, cette méthode n’atteint pas la plus petite latence. Pour réduire davantage la latence, le client peut configurer le périphérique audio pour générer une notification matérielle chaque fois que l’appareil termine d’écrire un nouveau bloc de données de capture dans la mémoire tampon. Dans ce cas, le thread client est activé par des notifications matérielles au lieu d’un minuteur.

En faisant en sorte que le périphérique audio avertisse régulièrement le moteur audio, le client peut réduire la latence que ce qui serait pratique.

Le client (généralement le moteur audio) peut obtenir un résumé des retards auxquels le périphérique audio contribue à la latence du flux en envoyant une demande de KSPROPERTY_RTAUDIO_HWLATENCY au pilote de port WaveRT.

Une fois que le client a déterminé la quantité de séparation à maintenir entre les positions d’enregistrement et de lecture, le client surveille les modifications apportées à la position de l’enregistrement pour déterminer le décalage de la position de lecture. Dans les systèmes d’exploitation Windows Server 2008 et versions ultérieures, le client envoie une KSPROPERTY_AUDIO_POSITION ou une demande de propriété de KSPROPERTY_RTAUDIO_POSITIONREGISTER pour déterminer la position de l’enregistrement. Cette dernière méthode de requête est plus efficace, car elle permet au client de lire directement la position de l’enregistrement sans passer à une routine en mode noyau pour les informations.