Skip to main content
Cette rubrique présente une vue d’ensemble des API XAPU pour le décodage de fichiers Opus accéléré par le matériel et la conversion de la fréquence d’échantillonnage de haute qualité.

Fonctionnalités de la version du décodage matériel Opus

Historiquement, XMA était la seule option offrant le décodage déchargé sur le matériel dans la famille de consoles XBOX One. Maintenant, sur la génération de consoles XBOX Series X|S, nous introduisons le décodage Opus déchargé sur le matériel au moyen de l’API XAPU (XBOX Audio Processing Unit). Opus est un codec de compression audio libre de redevances, conçu pour coder efficacement la parole et l’audio général dans un format unique. Opus offre une faible latence. Selon des évaluations internes, Opus surpasse XMA en qualité et en taux de compression de la taille des fichiers. De plus, un convertisseur de fréquence d’échantillonnage de haute qualité (HSRC) a été ajouté pour fonctionner conjointement avec la fonctionnalité de décodage matériel (Opus). En combinant le décodage Opus déchargé sur le matériel avec la fonctionnalité HSRC pour modifier la hauteur tonale, les développeurs remarqueront une meilleure qualité de sortie par rapport à l’offre SHAPE de la génération précédente. (Celle-ci est toujours prise en charge sur les consoles XBOX Series X|S à des fins de rétrocompatibilité.)

Nouveautés de cette version

  • Nouveau avec June FAL QFE3 : pour les scénarios Quick Resume, les titres n’ont plus besoin de rétablir leur connexion au matériel après une reprise.
  • Nouveau avec June FAL QFE4 : les paquets Opus d’une durée de 2,5 et 5 ms sont maintenant pris en charge pour CELT.
  • Version de récupération August 2020 Preview 10.0.19041.4124 (rs_xbox_release_2008- 19041.4124.200814-0000) / 10.0.19041.3562 (rs_xbox_release_sirius- 19041.3562.200814-2300) ou ultérieure : changement cassant dans l’implémentation de XApuDecodeConvertCommand : les données résiduelles ne sont plus incluses lors de l’utilisation de firstFrameIndex, alors qu’elles l’étaient auparavant. Consultez la section Meilleures pratiques ou la page de référence de l’API XApuDecodeConvertCommand pour plus de détails.
  • Si la mémoire tampon de traitement de sortie du HSRC contenait des données et que la commande de vidage était utilisée, il y avait auparavant une perte de données (vous pouviez perdre certaines données audio converties et la sortie n’était pas celle attendue)
  • Si des paquets Opus non pris en charge sont envoyés pour traitement, une erreur est maintenant levée au lieu d’un blocage. (p. ex., envoi d’un paquet Opus de 2,5 ms là où seuls les paquets de 10 ms ou de 20 ms sont pris en charge)
  • FIFO est activé par défaut
  • Améliorations générales des performances et correctifs de stabilisation

Spécifications de la version du décodage matériel Opus

Le tableau suivant présente les commandes et les fonctionnalités offertes :

Remarque importante sur l’utilisation du HSRC

Le convertisseur de fréquence d’échantillonnage de haute qualité (HSRC) présente un délai de groupe dépendant de la fréquence d’environ 5 trames pour les fréquences inférieures à 10 kHz. Le délai attendu à la sortie est de 5 trames lorsque le convertisseur de fréquence d’échantillonnage est engagé, et l’appelant peut s’ajuster en conséquence. Si vous utilisez une solution d’intergiciel pour l’audio, ce délai est peut-être déjà géré pour votre titre.

Meilleures pratiques

  • Concernant l’implémentation de XApuDecodeConvertCommand : le paramètre firstFrameIndex passé à XApuDecodeConvertCommand indique la première trame qui sera copiée dans la mémoire tampon de sortie PCM. firstFrameIndex, combiné à frameCount, indique ce qui est copié dans la mémoire tampon de sortie. Notre implémentation n’inclut pas les données résiduelles lors de l’utilisation de firstFrameIndex. S’il y a 100 trames résiduelles, que firstFrameIndex est défini à 50 et que frameCount est défini à 200, 200 trames seront ajoutées à l’ensemble des données résiduelles à partir de la 50e trame des données décodées. Cela signifie que la mémoire tampon envoyée au HSRC contiendra les 100 trames résiduelles d’origine, suivies de 200 trames à partir de la 50e trame du paquet décodé actuel.
  • Nous vous recommandons de créer les clients XAPU avec soin. Il est préférable de créer les clients XAPU dès le départ (lors de l’activation des ressources du moteur audio) et de continuer à les utiliser pendant toute la durée de vie du jeu. Les appels à XApuConnect et à XAapuDisconnect sont coûteux en calcul. Vous risquez de manquer de ressources si des clients ayant des besoins en mémoire variables sont créés et supprimés fréquemment.
  • Pour le bouclage, il revient à l’appelant d’utiliser ou non XApuCommandType::Reset, car cela peut causer un effet transitoire dans la sortie. Toutefois, lorsque XApuCommandType::Reset est utilisé, des paquets de préchargement doivent être soumis pour éviter l’effet transitoire.
  • Pour obtenir les meilleures performances, utilisez des flux Opus encodés avec une taille de paquet de 20 ms
  • Sur le plan des performances, il peut être préférable d’utiliser moins de clients avec plus de flux plutôt que moins de flux avec plus de clients. Par exemple, 5 clients avec 20 flux par client, pour un total de 100 flux, offrent de meilleures performances que 50 clients avec 2 flux chacun. Les deux configurations permettent de décoder 100 flux, mais la première sera plus performante
  • OPUS_SET_PREDICTION_DISABLED désactive la prédiction entre paquets et est pris en charge. L’encodage avec cet indicateur réduit les performances de compression et dégrade ainsi la qualité de la sortie décodée.
  • XAPU retourne l’erreur XAPU_E_DEVICE_FATAL lorsque le périphérique matériel est dans un état incorrect. Tous les clients XAPU doivent alors être déconnectés avant la création de nouveaux clients afin de récupérer de cette erreur.
  • Le mécanisme de signalisation des achèvements de commandes fonctionne avec une minuterie de 3 ms et signale une seule fois pour toutes les commandes achevées jusqu’à ce moment pour chaque client XAPU, peu importe le nombre de commandes ayant utilisé l’indicateur XApuCommandOptions::SignalOnCompletion.
  • Si le titre ne peut pas tolérer le mécanisme de signalisation de 3 ms, il peut rechercher les réponses dans une boucle ou utiliser Sleep(0) et vérifier les réponses.
  • Il est important d’attendre toutes les réponses avant de déconnecter le client. XApuDisconnect retourne maintenant l’erreur XAPU_E_PENDING_RESULTS s’il reste des demandes en attente qui n’ont pas été récupérées. Cette erreur ne nécessite aucune action et ne doit servir que pendant le développement. XApuDisconnect libère toutes les ressources allouées au client et, s’il est appelé pendant que le matériel traite encore des commandes pour ce client, une corruption de la mémoire peut survenir, car le matériel écrit dans de la mémoire qui a été libérée.
  • Tous les pointeurs de mémoire passés au matériel (p. ex., inputData, outPutData et processingBuffer) doivent être alignés sur 16 octets.
  • Lors de l’utilisation des modes ConvertOnly ou DecodeConvert, des nombres de trames de sortie plus élevés donnent de meilleures performances. La taille de trame de sortie maximale prise en charge avec decode convert et convert est de 1024.
  • Seul l’encodage à débit binaire variable (VBR) est pris en charge. L’encodage à débit binaire constant (CBR) n’est pas pris en charge, car il ajoute des paquets de transition, moins efficaces et de moins bonne qualité que les paquets de redondance utilisés dans l’encodage VBR. Par conséquent, ce type de paquet et, par extension, le CBR ne sont pas pris en charge.
  • Pour HYBRID et SILK : seuls les flux Opus mono et stéréo sont pris en charge, avec des paquets de 10 ou 20 ms et une fréquence d’échantillonnage de 48 000 Hz.
  • Pour CELT : seuls les flux Opus mono et stéréo sont pris en charge, avec des paquets de 2,5, 5, 10 ou 20 ms et une fréquence d’échantillonnage de 48 000 Hz.

Mise en pause et reprise d’un titre

Un titre doit pouvoir être mis en pause et repris, par exemple lorsque l’utilisateur le place en mode limité. Lorsque le gestionnaire de suspension est appelé, cessez simplement de soumettre des commandes XAPU au matériel. Les commandes déjà soumises se termineront normalement et seront placées dans leurs files d’attente de réponses correspondantes.

Exemples (code source offert dans un fichier .zip externe, à demander par courriel à AnaAud@microsoft.com)

  • Décoder un flux Opus. (Une vue d’ensemble de cet exemple est disponible ici.)
  • Décoder plusieurs flux Opus.
  • Lire un flux Opus. (Le modèle de threads diffère de celui de « Décoder un flux Opus ».)
  • Lire plusieurs flux Opus.
  • Décoder et convertir un flux Opus, avec une option de bouclage et de recherche précise à l’échantillon près.
  • Décoder et convertir plusieurs flux Opus.
  • Lire, décoder et convertir un flux Opus.
  • SimpleXAPU (exemple de décodage d’un flux Opus dans un titre GDK doté d’une interface utilisateur.)

Contact

Si vous avez des questions ou des préoccupations au sujet de cette fonctionnalité, veuillez envoyer un courriel à AnaAud@microsoft.com ou utiliser les forums en ligne.

Documentation de référence de l’API

Last modified on October 6, 2026