Débogage des problèmes audio dans XAudio2

Des problèmes peuvent se produire dans XAudio2. Cette rubrique décrit la façon dont ils sont signalés et certaines approches pour les résoudre.

Cette vue d’ensemble couvre les rubriques suivantes :

Causes de problèmes ou de problèmes de sortie audio

Des problèmes peuvent se produire dans la sortie XAudio2 pour plusieurs raisons.

  • Une voix source XAudio2 est affamée. Le client n’envoie pas suffisamment rapidement un nouvel audio. Vous obtenez le silence parce qu’il n’a pas de données à lire.
  • XAudio2 dans son ensemble est surchargé. Il faut plus de temps que X ms pour produire X ms de l’audio. Vous obtenez des abandons, car XAudio2 ne peut pas produire des données aussi rapidement que l’appareil audio en a besoin. Vous exécutez peut-être trop de voix ou d’effets à la fois, effectuez trop de travail dans les rappels XAudio2 ou effectuez des appels d’API XAudio2 trop fréquemment.
  • Le thread de traitement audio bloque, car l’implémentation par le client d’un rappel XAudio2 effectue des actions qui peuvent bloquer le thread. Par exemple, il peut s’agir d’accéder au disque, de synchroniser avec d’autres threads ou d’appeler d’autres fonctions qui peuvent bloquer. Utilisez un thread d’arrière-plan de priorité inférieure que le rappel peut signaler pour effectuer de telles tâches.
  • Le système dans son ensemble est surchargé. D’autres threads s’exécutant à la même priorité ou plus élevée que XAudio2 font trop de travail. Ils sont en concurrence avec le thread audio pour le temps processeur.

Comment XAudio2 signale les problèmes

XAudio2 peut communiquer des problèmes dans la build de débogage de plusieurs façons.

  • Si une voix est affamée, XAudio2 affiche un message sous cette forme.

    XAudio2: WARNING: Voice at 0xNNNNNNNN starved: no more source buffers are available, but no end-of-stream marker was received
    
  • Si le thread audio s’exécute trop longtemps, XAudio2 affiche un message sous cette forme.

    XAudio2: WARNING: Spent Xms in audio thread; XAudio2 possibly overloaded
    

    En règle générale, ce message se produit avec le message suivant.

  • Si le pilote audio ne peut pas être alimenté en temps et en heure, XAudio2 affiche un message sous cette forme.

    XAudio2: WARNING: Glitch at output sample X
    
  • L’appel de IXAudio2::GetPerformanceData fournit des données de performances XAudio2, y compris le nombre total de problèmes depuis le démarrage du moteur XAudio2.

Approches pour résoudre les problèmes

Les méthodes possibles pour réduire les problèmes audio sont les suivantes.

  • Dans le cas de la privation de voix : augmentez la quantité de données audio mises en file d’attente sur une voix. Vous pouvez utiliser IXAudio2SourceVoice::GetState pour découvrir le nombre de mémoires tampons mises en file d’attente à tout moment. Si vous voyez toujours des erreurs de manque de voix, mais que vous ne pouvez pas entendre de problème, vérifiez que vous définissez XAUDIO2_BUFFER. Indicateurs de XAUDIO2_END_OF_STREAM sur la mémoire tampon finale d’un son. Cela indique à XAudio2 de ne pas s’attendre à ce que d’autres mémoires tampons soient nécessairement disponibles dès que celle-ci est terminée.

    Dans les autres cas :

    • Réduisez le nombre de voix actives et d’effets dans le graphique, notamment les effets coûteux comme la réverbération.
    • Désactivez les voix et les effets que vous n’utilisez pas.
    • Utilisez les indicateurs XAUDIO2_VOICE_NOSRC et XAUDIO2_VOICE_NOPITCH dans IXAudio2::CreateSourceVoice, chaque fois que cela est possible. La conversion du taux d’échantillonnage est coûteuse.
    • Réduisez le taux d’échantillonnage des voix individuelles. Par exemple, un sous-mix vocal hébergeant un effet de réverbération peut avoir un taux d’échantillonnage inférieur à celui de la voix source qui lui est envoyée. Les sons tels que les explosions et les coups de feu qui n’ont pas besoin d’une haute fidélité peuvent également être enregistrés à des taux d’échantillonnage inférieurs.
    • Assurez-vous que les implémentations de rappel font le moins de travail possible et ne bloquent jamais.
    • Effectuez moins d’appels à XAudio2. Les paramètres audio n’ont généralement pas besoin d’être mis à jour pour chaque image vidéo. Toutes les 30 ms environ suffisent. Vous devez éliminer les appels redondants, tels que la définition du volume plusieurs fois par succession rapide.
    • Réduisez l’utilisation globale du processeur du jeu.

Fonctionnalités de débogage

Référence de programmation XAudio2