Latence de flux pendant la lecture
Lorsqu’un flux de lecture audio est à l’état Exécuter, le rôle du pilote de port WaveRT est minimal. Comme indiqué dans le diagramme suivant, lors de la lecture, le client du pilote de port WaveRT écrit ses données dans la mémoire tampon cyclique et le périphérique 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 l’application en mode utilisateur et le matériel audio sans être touchées par les composants logiciels en mode noyau.
Dans le diagramme, les positions d’écriture et de lecture progressent continuellement de gauche à droite à mesure que le flux de données audio circule dans la mémoire tampon cyclique. La mémoire tampon est décrite comme cyclique, car lorsque la position de lecture ou la position d’écriture atteint la fin de la mémoire tampon, elle s’enroule automatiquement au début de la mémoire tampon.
La latence du flux pendant la lecture a deux sources main, désignées dans le diagramme suivant comme A et B.
Dans le diagramme précédent, la position d’écriture correspond à l’emplacement juste après le dernier exemple que le client a écrit dans la mémoire tampon. La position de lecture est l’exemple que l’appareil audio lit actuellement via le haut-parleur.
La latence entre le moment où le client écrit un exemple audio dans la mémoire tampon jusqu’à ce que le périphérique audio le lit est simplement la séparation entre les positions d’écriture et de lecture. Cette séparation est la somme des deux sources de latence suivantes (marquées comme A et B dans le diagramme) :
Latence A : une fois que l’appareil audio a lu les données de la mémoire tampon, les données résident dans une mémoire tampon FIFO (first in, first out) matérielle jusqu’à ce que l’appareil audio enregistre les données via le convertisseur numérique-vers-analogique (DAC).
Latence B : une fois que le client écrit des données dans la mémoire tampon cyclique, les données résident dans la mémoire tampon jusqu’à ce que le périphérique audio 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 suffisamment d’échantillons pour alimenter la DAC pendant environ 64 fois de l’horloge de l’échantillon. Toutefois, le client contrôle la latence B. Rendre la latence B trop importante entraîne des retards inutiles dans le système ; cependant, le rendre trop petit risque d’épuiser l’appareil audio.
Bien que le client puisse configurer un minuteur pour activer régulièrement son thread d’écriture de mémoire tampon, cette méthode n’atteint pas la plus petite latence. Pour réduire davantage la latence, le client peut configurer l’appareil pour générer une notification matérielle chaque fois que l’appareil termine la lecture d’un nouveau bloc de données de lecture à partir de 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 le client chaque fois qu’il termine la lecture d’un bloc de données à partir de la mémoire tampon, le client peut réduire la latence de ce qui serait autrement pratique.
Le client peut obtenir un résumé des retards qui contribuent à la latence du flux en envoyant une demande 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’écriture et de lecture, le client surveille les modifications de la position de lecture pour déterminer jusqu’où avancer la position d’écriture. Dans les systèmes d’exploitation Windows Server 2008 et ultérieurs, le client envoie une demande de propriété KSPROPERTY_RTAUDIO_POSITIONREGISTER pour déterminer la position de lecture. La prise en charge de cette fonctionnalité est assurée par les améliorations apportées au pilote système PortCls.
Si le périphérique audio a un registre de position comme indiqué dans le diagramme précédent, la demande de propriété mappe le registre à une adresse de mémoire virtuelle accessible au client en mode utilisateur. Une fois le registre de positions mappé, le client peut lire le contenu de l’adresse mémoire pour déterminer la position de lecture actuelle.