Skip to main content
Un composant clé du système audio de la XBOX One est le Scalable Hardware Audio Processing Engine (SHAPE), qui effectue les opérations suivantes :
  • Il exécute efficacement les fonctions audio couramment utilisées au moyen de blocs matériels à fonction fixe : XMA, convertisseur de fréquence d’échantillonnage (SRC), égaliseur et compression, et filtre-volume
  • Il fournit un processeur de contrôle audio (ACP) intégré et programmable pour contrôler ces blocs
Les éléments suivants sont offerts pour un fonctionnement à haute vitesse et pour réduire au minimum le trafic sur le bus de mémoire principal.
  • Un processus d’accès direct à la mémoire (DMA) pour accéder à la mémoire système
  • Une mémoire interne spéciale, appelée mémoires tampons de mixage Une mémoire tampon de mixage est un bloc de mémoire qui stocke une trame audio complète de données. Le matériel SHAPE lit généralement à partir d’une ou deux mémoires tampons de mixage et écrit dans une mémoire tampon de mixage de sortie. Il existe quelques exceptions à ce processus général, comme le décodage XMA et les blocs DMA et SRC.
De nombreux titres n’implémentent pas directement les graphes de flux. XAudio2 et les intergiciels audio implémentent implicitement les composants SHAPE. Toutefois, la construction de graphes de flux offre la plus grande souplesse et l’accès aux capacités d’accélération audio de la console XBOX One. Cette rubrique présente une vue d’ensemble du matériel SHAPE et des blocs fonctionnels.

Flux de contrôle

Voici un flux de contrôle typique pour le traitement audio.
  1. Un fichier de données audio XMA compressé est chargé dans la mémoire système principale.
  2. Le bloc décodeur XMA décode une partie des données XMA en données PCM (Pulse Code Modulation). La sortie est stockée dans une mémoire tampon de décodage XMA dans la mémoire système.
  3. Le bloc SRC lit les échantillons PCM à partir de la mémoire tampon de décodage XMA et effectue la conversion de la fréquence d’échantillonnage et la transposition de hauteur nécessaires. Cela permet d’amener des données audio d’une fréquence d’échantillonnage arbitraire dans les blocs d’accélération SHAPE. Le bloc SRC envoie les données audio, à la fréquence fixe de 48 KHz, vers une mémoire tampon de mixage interne.
  4. Tout traitement SHAPE supplémentaire, ainsi que la lecture et l’écriture dans des mémoires tampons de mixage temporaires, est maintenant effectué. Le traitement est contrôlé par l’ACP, lui-même piloté par l’application au moyen de l’API ACP décrite dans cet ensemble de documentation. Le traitement comprend l’égalisation, la compression, la mise à l’échelle du filtre et la mise à l’échelle du volume.
  5. La dernière étape, appelée accumulation de la sortie des haut-parleurs, est celle où les mémoires tampons de mixage des haut-parleurs recueillent et mixent les échantillons de plusieurs sources sonores pour la lecture. Des effets audio globaux facultatifs peuvent être traités à cette étape.
Un autre processus peut être utilisé pour qu’un traitement plus arbitraire soit effectué par le processeur principal de l’application. Les trois premières étapes sont identiques à celles décrites précédemment.
  1. Un fichier de données audio XMA compressé est chargé dans la mémoire système principale.
  2. Le bloc décodeur XMA décode une partie des données XMA en données PCM et stocke la sortie dans une mémoire tampon de décodage XMA dans la mémoire système.
  3. Le bloc SRC lit les échantillons PCM à partir de la mémoire tampon de décodage XMA et effectue la conversion de la fréquence d’échantillonnage et la transposition de hauteur nécessaires. Cela permet d’amener des données audio d’une fréquence d’échantillonnage arbitraire dans les blocs d’accélération SHAPE. Le bloc SRC envoie les données audio, à la fréquence fixe de 48 KHz, vers une mémoire tampon de mixage interne.
  4. À cette étape, le flux du processus diverge. Le système DMA est utilisé pour transférer une ou plusieurs mémoires tampons de mixage vers la mémoire système principale.
  5. Le processeur de l’application effectue tout traitement du signal requis sur la mémoire tampon en mémoire principale.
  6. Le système DMA est utilisé pour transférer les données audio traitées de la mémoire tampon en mémoire principale vers une mémoire tampon de mixage temporaire. Après cette étape, le processus est identique à celui décrit précédemment.
  7. Tout traitement SHAPE supplémentaire, ainsi que la lecture et l’écriture dans des mémoires tampons de mixage temporaires, est maintenant effectué. Le traitement est contrôlé par l’ACP, lui-même piloté par l’application au moyen de l’API ACP décrite dans cet ensemble de documentation. Le traitement comprend l’égalisation, la compression, la mise à l’échelle du filtre et la mise à l’échelle du volume.
  8. La dernière étape, l’accumulation de la sortie des haut-parleurs, est celle où les mémoires tampons de mixage des haut-parleurs recueillent et mixent les échantillons de plusieurs sources sonores pour la lecture. Des effets audio globaux facultatifs peuvent être traités à cette étape.
Les blocs SHAPE individuels sont contrôlés par deux principaux éléments logiciels : les contextes et la liste d’exécution. Les contextes, stockés dans la mémoire principale, conservent l’état et assurent le contrôle des éléments de traitement au sein des blocs matériels SHAPE précis. Ils sont d’abord générés par le processeur, mais ils peuvent être mis à jour par le processeur ou par l’ACP de SHAPE. Les contextes sont lus dans le sous-système SHAPE à chaque trame audio, selon les besoins des blocs matériels individuels. Avec une taille de trame audio de 128 échantillons et une fréquence d’échantillonnage de 48 KHz, les contextes sont permutés à une fréquence de 375 Hz par canal audio. La liste d’exécution est composée de métacommandes traitées par le processeur audio SHAPE. Comme le processeur est programmable et souple, le format et la fonction de la liste d’exécution sont souples. Certaines métacommandes comportent des données implicites, et d’autres ont des arguments explicites. Les métacommandes indiquent également l’emplacement à partir duquel les blocs matériels SHAPE précis obtiennent leur entrée et celui où ils écrivent leur sortie, au moyen de mémoires tampons de mixage allouées par le matériel. La liste des commandes envoyées au matériel SHAPE pour traitement est appelée graphe de flux et est décrite dans la Vue d’ensemble de l’ACP. La figure 1 présente les quatre blocs d’accélération SHAPE et leur interaction avec les autres composants principaux. Figure 1. Les quatre blocs d’accélération SHAPE et leur interaction avec les autres composants principaux. Quatre blocs d'accélération SHAPE

DMA

Le système d’accès direct à la mémoire (DMA) prend en charge les fonctionnalités de lecture et d’écriture avec conversion automatique de virgule flottante en entier et d’entier en virgule flottante. Le système DMA utilise des mémoires tampons circulaires qui contiennent des échantillons désentrelacés en blocs de 128 échantillons. Le processeur DMA permet au moteur SHAPE d’envoyer des données des mémoires tampons de mixage vers la mémoire système principale et de récupérer des données de la mémoire système principale dans les mémoires tampons de mixage pour un traitement ultérieur. Le DMA est effectué par bloc. Une trame audio de données est transférée à la fois. Pour faciliter les données entrelacées par bloc, une valeur de saut indique le nombre de blocs de trames audio en mémoire système à sauter (à partir de l’adresse de base) lors de la lecture ou de l’écriture des échantillons. Pour cette raison, les flux multicanaux nécessitent un contexte DMA par canal. Les échantillons de données audio sont toujours lus et écrits sous forme de valeurs de 32 bits, soit en entiers, soit en virgule flottante, selon l’indicateur FloatConvert du contexte DMA. Pour aider à réduire la bande passante de données, la direction du DMA (lecture ou écriture) est indiquée dans la commande DMA plutôt que dans le contexte DMA. Le moteur DMA n’effectue aucun traitement du signal, mais peut convertir des valeurs à virgule flottante en entiers et des entiers en valeurs à virgule flottante. Cela permet au processeur de l’application de traiter les échantillons de données en format à virgule flottante. Pour calculer la taille d’une mémoire tampon DMA, utilisez la formule suivante.
Les pointeurs de lecture et d’écriture sont incrémentés comme suit.
Les adresses dans la mémoire tampon audio sont calculées comme suit.
Par exemple, si une mémoire tampon DMA contient trois trames et quatre canaux, elle sera organisée comme le montre la figure 2, chaque bloc de canal contenant 128 échantillons contigus. Figure 2. Une mémoire tampon DMA. Mémoire tampon DMA audio Comme l’horloge de SHAPE est indépendante de celle du processeur, la latence peut être un facteur. Les transitions du matériel au logiciel et du logiciel au matériel entraînent une latence de 2,66 ms. Lorsque vous synchronisez du code critique et utilisez plusieurs transitions pour certains sons, envisagez d’implémenter un délai basé sur l’horloge du processeur pour synchroniser le rendu sonore. Envisagez également de développer des sous-mixages tolérants à la latence pour aider à réduire l’utilisation du processeur.

XMA

Le format XMA prend en charge le son mono, stéréo et multicanal entrelacé, avec des débits binaires et une compression variables. Plusieurs améliorations ont été apportées par rapport à l’implémentation XMA de la XBOX 360, notamment une augmentation de la fréquence d’horloge (avec, par exemple, une amélioration de 40 % des capacités de transposition de hauteur) et une augmentation du nombre de voix de 320 à 512. Le bloc décodeur XMA décode une partie des données XMA en mémoire principale et retourne les données PCM dans une mémoire tampon de décodage XMA en mémoire principale. Le bloc décodeur XMA est identique à celui de la XBOX 360, à l’exception d’améliorations mineures liées à l’état pour l’interfaçage avec les autres composants SHAPE. Le bloc de registres du décodeur XMA a été enrichi des informations d’état liées à la sortie décodée de chaque voix. Cinq bits par contexte XMA indiquent la quantité de données audio non consommées restant dans la mémoire tampon de sortie PCM. Ces registres sont implémentés à l’intérieur du bloc décodeur XMA. Ils sont ainsi toujours disponibles pour déterminer s’il y a suffisamment d’échantillons pour verrouiller le contexte du SRC sans lire la mémoire principale.
xWMA n’est pas pris en charge par SHAPE, mais l’est au moyen de XAudio2.

PCM

La modulation par impulsions codées (PCM) linéaire prend en charge jusqu’au son ambiophonique 7.1 à 48 KHz. L’ACP effectuera un mixage réducteur si le système audio de l’utilisateur est, par exemple, en son ambiophonique 5.1 ou en stéréo. La sortie S/PDIF sera prise en charge. La prise en charge est également offerte pour les mémoires tampons PCM linéaires et circulaires qui contiennent des entiers mono ou stéréo de 16 bits, des valeurs à virgule flottante mono de 32 bits ou des entiers mono de 32 bits (24 bits justifiés à gauche, ou 32 bits avec les 8 bits inférieurs masqués).

Bloc convertisseur de fréquence d’échantillonnage (SRC)

Le bloc SRC effectue une conversion de la fréquence d’échantillonnage basée sur des entiers et écrit les données de sortie dans les mémoires tampons de mixage. Le SRC est généralement utilisé pour l’émulation d’instruments de musique, la conversion d’échantillons d’entrée à une octave plus basse ou plus haute que celle de la source, et pour l’effet Doppler et d’autres effets. À partir de la mémoire système, le bloc SRC lit soit des données PCM à virgule flottante de 32 bits, soit des données à virgule fixe de 16, 24 ou 32 bits. Comme données d’entrée, le bloc peut prendre soit la sortie du décodeur matériel XMA, soit les données gérées par le logiciel. Comme il est étroitement intégré au décodeur XMA, le bloc SRC peut déterminer si le nombre d’échantillons de données PCM décodées dans la mémoire tampon de décodage XMA est suffisant pour créer et compléter une trame audio d’échantillons sans lire la mémoire principale. Le SRC fonctionne en mode mono ou stéréo. Les données PCM sont lues à partir de la mémoire et converties dans un format commun à virgule fixe de 24 bits pour la conversion de la fréquence d’échantillonnage. La sortie est écrite dans une ou deux mémoires tampons de mixage, selon le mode. Les données stéréo sont stockées en mémoire sous forme d’un flux entrelacé de données de 16 bits. Le canal gauche se trouve dans les 16 bits les moins significatifs de chaque mot de 32 bits, et le canal droit dans les 16 bits les plus significatifs. De plus, en mode stéréo, les données PCM sont lues et désentrelacées simultanément. Les données du canal gauche (échantillons 0,2,4,6…) sont traitées et envoyées vers une mémoire tampon de mixage. Les données du canal droit (échantillons 1,3,5,7…) sont écrites dans une deuxième mémoire tampon de mixage. La figure 3 présente les modes de conversion de la fréquence d’échantillonnage. Figure 3. Modes de conversion de la fréquence d’échantillonnage. Modes de conversion de la fréquence d'échantillonnage L’entrée du bloc SRC peut être à n’importe quelle fréquence d’échantillonnage qui ne dépasse pas 384 KHz moins epsilon. Toutefois, la sortie sera à une fréquence constante de 48 KHz. Epsilon est le petit écart entre les valeurs entières demandées et les valeurs à virgule flottante utilisées par le matériel. SHAPE peut traiter jusqu’à 512 canaux (toute combinaison de mono et de stéréo) de SRC par trame audio. Le SRC prend en charge l’interpolation linéaire et polyphase, le mono et la stéréo, ainsi qu’une plage de rééchantillonnage allant de 1:16, soit quatre octaves plus bas, à 3,99:1, soit presque deux octaves plus haut.

Égalisation et compression

Le compresseur limite la plage dynamique du signal en surveillant le niveau d’entrée et en créant une valeur de gain dynamique. Le compresseur utilise ensuite la valeur de gain comme multiplicateur du signal, en le mettant à l’échelle de façon appropriée selon le niveau actuel du signal d’entrée. Autrement dit, le compresseur est un contrôle de volume automatique qui surveille constamment le signal d’entrée et s’ajuste en conséquence. Le compresseur agit uniquement sur les signaux qui dépassent un seuil précis. Les signaux sous le seuil passent sans être modifiés. Le seuil est défini par l’application dans les données de contexte EQComp. Un contrôle programmable dans le contexte sert à effectuer la compression ou l’expansion. Le compresseur modifie les données sonores selon un paramètre qui indique le rapport entre le niveau entrant et le niveau sortant. Le rapport représente l’ampleur de l’atténuation à appliquer au signal entrant s’il dépasse le seuil. Voici des exemples.
  • À 2:1, pour chaque 2 dB au-dessus du seuil, le compresseur produit 1 dB au-dessus du niveau de seuil.
  • À 1:1, le compresseur est essentiellement désactivé.
Le rapport est défini par l’application dans les données de contexte. Le diagramme suivant (figure 4) montre l’effet du compresseur sur un signal d’entrée. Sous le seuil, la sortie est égale à l’entrée. Au-dessus du seuil, le compresseur réduit la sortie d’une quantité définie par le rapport, soit environ 2:1. Figure 4. La courbe de volume entrée/sortie. Courbe de volume entrée/sortie Les paramètres attack et release indiquent la rapidité avec laquelle le compresseur est activé, c’est-à-dire le temps nécessaire pour atténuer complètement, de la quantité définie par le rapport, les sons qui dépassent le seuil. Attack et release sont exprimés en millisecondes et correspondent à la rapidité avec laquelle le compresseur doit faire varier le gain de sortie en réponse à un signal qui dépasse le seuil ou qui passe sous celui-ci. Ces ajustements peuvent être linéaires ou logarithmiques. Le diagramme suivant (figure 5) montre que le niveau de sortie souhaité n’est atteint qu’une fois que l’entrée a dépassé le seuil pendant la durée définie par attack. Le diagramme montre également que l’entrée et la sortie ne reviennent à l’unité qu’une fois que l’entrée est sous le seuil pendant la durée définie par release. Figure 5. La synchronisation attaque/relâchement. Synchronisation attaque/relâchement L’entrée est ensuite multipliée par le gain de sortie actuel. Cette première multiplication effectue la compression proprement dite, c’est-à-dire la mise à l’échelle du signal au moyen d’une fonction variant dans le temps selon l’amplitude d’entrée. Il y a une mise à l’échelle du gain supplémentaire, qui constitue l’étape finale. Le gain de compensation est une valeur fixe définie par l’application. Comme la compression, surtout à des seuils bas, peut produire un signal de gain relativement faible, le gain de compensation sert à ramener le signal dans une plage utilisable. Un autre paramètre du compresseur est RMS. En mode normal, le niveau d’entrée est instantané et calculé pour chaque échantillon. En mode RMS, une moyenne mobile (une approximation de la valeur RMS) est maintenue sur les 128 échantillons précédents. La moyenne mobile est utilisée comme niveau d’entrée plutôt que le niveau absolu de l’échantillon d’entrée actuel. Le bloc EQ/Compresseur-Expanseur contient deux unités de traitement distinctes en série : un égaliseur programmable à trois bandes et un compresseur de plage dynamique (figure 6). Le bloc sert à contrôler la fréquence et la plage dynamique des sons, et il prend son entrée à partir d’une ou deux mémoires tampons de mixage.
  • Une entrée est le signal audio à traiter.
  • La deuxième entrée, appelée sidechain, est le signal de contrôle facultatif utilisé pour déterminer la compression audio.
L’égaliseur a des coefficients entièrement programmables. Le logiciel peut contrôler entièrement la fonction de transfert de l’égaliseur. Figure 6. L’égaliseur est implémenté sous forme de trois filtres biquadratiques en série, désignés A, B et C. Trois filtres biquadratiques Chaque filtre biquadratique implémente l’équation suivante, où x est l’entrée, y est la sortie, et a1, a2, b0, b1 et b2 sont les coefficients. Les coefficients sont accessibles dans une structure SHAPE_EQCOMP_CONTEXT.
En général, lorsqu’une égalisation est appliquée à un son, des zones d’une certaine fréquence sont soit coupées, soit amplifiées. Aucun problème ne survient lorsque des fréquences sont coupées (atténuées) : le signal de sortie sera à un niveau égal ou inférieur à celui de l’entrée. Toutefois, lorsque des fréquences sont amplifiées, une augmentation correspondante se produit souvent dans la plage dynamique crête à crête du signal. Par exemple, amplifier les basses de 6 dB produit un gain de sortie supérieur à celui de l’entrée. Si le signal d’entrée était déjà à pleine échelle (-0 dBFS), la sortie dépassera certainement le maximum. Pour cette raison, la plage dynamique au sein des trois sections d’égalisation biquadratiques en cascade conserve 8 bits de précision supplémentaires à gauche de la virgule binaire, de sorte que le format d’entrée s.23 devient s8.23 pendant le traitement d’égalisation. La plage supplémentaire permet à chaque étage d’égalisation de fournir une amplification du gain sans saturer la sortie audio dans la plupart des cas. Toutefois, dans des conditions d’entrée maximales et avec un gain maximal de +18 dB appliqué sur les trois étages, il sera possible de saturer le troisième étage, auquel cas le matériel détectera cet événement de dépassement de crête. Les coefficients de filtre de chaque filtre biquadratique (b0, b1, b2, a1 et a2) sont des entiers de 24 bits. Cela permet une plage de coefficients allant jusqu’à +/- 7,998, ce qui convient pour fournir des coefficients aux types de filtres autorisés, pour une plage de fréquences de 20 Hz à 18 KHz et une plage de gain de -18 dB à 18 dB. Le Compresseur-Expanseur peut fonctionner dans l’un de trois modes sidechain.
  • En mode normal (figure 7), il y a une seule entrée audio provenant d’une mémoire tampon de mixage. L’entrée passe par l’égaliseur, puis elle est traitée par le compresseur et envoyée vers une mémoire tampon de mixage. Figure 7. Mode normal. Mode normal
  • En mode interne (figure 8), le signal d’entrée est envoyé directement à l’entrée audio du compresseur, puis il est divisé et envoyé à l’égaliseur. De l’égaliseur, il est envoyé à l’entrée sidechain du compresseur. Figure 8. Mode interne. Mode interne
  • En mode externe (figure 9), deux signaux d’entrée distincts provenant de deux mémoires tampons de mixage distinctes sont utilisés. Le signal d’entrée passe par l’égaliseur et arrive à l’entrée audio du bloc de compression. Le signal d’entrée sidechain est envoyé directement à l’entrée sidechain du compresseur. Figure 9. Mode externe. Mode externe
SHAPE peut traiter jusqu’à 512 contextes EQCOMP par trame audio.

Bloc filtre-volume (FLTVOL)

FLTVOL sert à effectuer les opérations suivantes :
  • Modéliser l’occlusion des sons qui contournent ou traversent un objet
  • Répartir l’énergie du son sur plusieurs haut-parleurs, afin de modéliser la direction d’arrivée du son.
FLTVOL prend un seul canal de données d’entrée provenant d’une mémoire tampon de mixage, le filtre et en met le volume à l’échelle, puis écrit la sortie dans une mémoire tampon de mixage. En général, plusieurs contrôles Filtre/Volume sont utilisés pour générer un panoramique à une entrée et plusieurs sorties, comme un panoramique en son ambiophonique. Le panoramique est généralement utilisé pour prendre un son et effectuer un panoramique sur n haut-parleurs ainsi qu’un ou plusieurs effets de réverbération. À l’aide du filtre à variables d’état, un titre peut facilement créer des effets de distance améliorés ainsi que des effets d’occlusion et d’obstruction de style I3DL2. De par sa nature, le filtre à variables d’état peut créer des résonances qui feraient dépasser aux valeurs intermédiaires 1,0 ou -1,0. Pour atténuer les problèmes causés par la saturation des valeurs intermédiaires, FLTVOL applique au signal entrant une mise à l’échelle de marge programmable, qui est ensuite compensée à la sortie. La mise à l’échelle s’effectue en décalant arithmétiquement les données vers la droite d’un certain nombre de bits. Le champ de marge du contexte indique le nombre de bits (0, 1, 2 ou 3) du décalage vers la droite appliqué au signal entrant avant le traitement FLTVOL. Par exemple, si une valeur de marge de 3 est indiquée, le filtre à variables d’état peut conserver trois bits supplémentaires (18 dB) de marge pour les résonances créées en interne et les dépassements. Le décalage vers la droite des données entrantes réduit nécessairement la précision dans le bas de la plage. Les bits de marge inférieurs du signal audio entrant sont perdus définitivement. Par conséquent, ne spécifiez des bits de marge non nuls que si une saturation interne s’est produite dans le filtre à variables d’état. Pour ce faire, vérifiez la valeur du bit de dépassement interne dans le contexte FLTVOL. Si les données source d’origine sont sur 16 bits (par exemple, si les données source d’origine sont en XMA), les bits de marge peuvent habituellement être définis à leur maximum de 3 sans changement notable du son, car les bits de poids faible sont de toute façon complétés par des zéros. L’implémentation du filtre à variables d’état souple permet également d’appliquer un filtrage résonant à une voix afin de créer des effets et des variations audio intéressants. Pour assurer une transition fluide entre les points de consigne d’entrée et de sortie, les paramètres du filtre et les attributs de volume sont ajustés progressivement à chaque échantillon. Le bloc FLTVOL est implémenté sous forme de filtre de Chamberlin, qui offre trois modes : passe-haut, passe-bas et passe-bande, avec un contrôle Q (largeur de bande) variable. Les paramètres du filtre de Chamberlin sont calculés comme suit.
Les paramètres f et q sont calculés par le logiciel à l’extérieur du bloc SHAPE. Lorsqu’un coefficient est mis à jour, il évolue progressivement vers la nouvelle valeur au cours d’une trame audio. Des bits de contrôle déterminent quelle sortie (coupe-bande, passe-haut, passe-bande ou passe-bas) doit être utilisée comme sortie finale du bloc FLTVOL. Les données de contexte de chaque canal ou flux sont stockées dans la mémoire système. Bien que les performances soient limitées à 2560 flux simultanés à 48 KHz (ce qui signifie que SHAPE peut traiter jusqu’à 2560 contextes FLTVOL par trame audio), le nombre de contextes adressables en mémoire est plus élevé, afin de simplifier les scénarios de réutilisation de flux. Le comportement du filtrage est conçu pour être identique à celui de XAudio2.

Mémoires tampons de mixage

Les mémoires tampons de mixage ont trois fonctions principales.
  • Les mémoires tampons de mixage servent de destination de mixage finale pour chaque sortie de haut-parleur du système (ou d’un joueur individuel). Lorsque chaque son est traité, sa sortie est ensuite mixée dans ces mémoires tampons.
  • Les mémoires tampons de mixage servent d’emplacements de stockage temporaires lorsque des mémoires tampons de données audio sont transmises entre les blocs matériels.
  • Conjointement avec le moteur DMA, les mémoires tampons de mixage servent de mécanisme pour transmettre des données du matériel SHAPE et du sous-système audio vers le système principal ainsi que pour transmettre des données de la mémoire système principale vers le matériel SHAPE et le sous-système audio.
Le système SHAPE fait un usage intensif des mémoires tampons de mixage. Il peut y avoir jusqu’à 8192 mémoires tampons de mixage virtuelles simultanées (avec des ID de 0 à 8191) effectuant le rendu vers 128 canaux physiques. Le mixage peut être effectué à l’aide d’accumulateurs matériels, sans nécessiter de DMA vers la mémoire et à partir de celle-ci. Les mémoires tampons de mixage prennent en charge la mesure et l’écrêtage.

Dépassement, magnitude et saturation

Dans le moteur audio d’un titre, la gestion de la marge peut être très difficile. Pour cette raison, chaque bloc SHAPE conserve l’état associé à la marge du signal et au gain. Chaque bloc autre que le SRC conserve un indicateur qui signale si une saturation interne s’est produite pendant le traitement. En plus de l’indicateur de saturation interne, chaque bloc matériel conserve également deux nombres de quatre bits qui représentent la magnitude de la sortie du bloc matériel. La magnitude est calculée en déterminant la sortie de crête pendant la trame audio et en comptant les zéros de tête de la valeur absolue de la crête. Un nombre de quatre bits conserve la magnitude de crête persistante, et l’autre est réinitialisé par le matériel à chaque trame audio. En plus de la surveillance de la magnitude de crête de chaque bloc matériel individuel, la magnitude de crête des mémoires tampons de mixage est également conservée. Lorsque la sortie d’un bloc matériel est ajoutée à une mémoire tampon de mixage, la magnitude de crête est calculée de la même manière, en comptant les zéros de tête. L’état de chaque bloc matériel conserve une paire supplémentaire de valeurs de magnitude de crête de quatre bits. Ces valeurs représentent la magnitude de crête de la mémoire tampon de mixage après l’accumulation de la sortie du bloc matériel dans celle-ci. Un nombre de quatre bits représente la magnitude de crête continue et persistante. L’autre est mis à jour à chaque trame audio. Les valeurs de magnitude de crête sont enregistrées dans le contexte des blocs SHAPE, même si ce qu’elles représentent est l’état de la mémoire tampon de mixage. La magnitude de crête est encodée selon le tableau suivant (codé dans le fichier ShapeHardwareContexts.h). Pour aider à gérer la marge et à éviter le dépassement et la saturation, en plus des réglages de gain précis, un décalage vers la droite de 0 à 7 bits peut être appliqué à la sortie d’un bloc matériel avant l’accumulation dans la mémoire tampon de mixage de sortie. Ce décalage est indiqué dans le contexte de chaque bloc matériel SHAPE.

Files d’attente SHAPE

Le processeur audio SHAPE gère deux files d’attente qui aident à réduire les verrouillages entre le matériel du système et le matériel de l’application.
  1. La file d’attente de commande et de contrôle (CCQ) sert à donner au processeur audio SHAPE une série de commandes à exécuter dès qu’il le peut, généralement lorsqu’il termine le traitement de la trame audio actuelle. La liste d’exécution SHAPE est lue une fois pour chaque sortie de trame audio. Toutefois, la CCQ ne sera lue et exécutée qu’une seule fois. La CCQ est le mécanisme qui permet au processeur de mettre à jour les données de contexte de n’importe quel bloc à la limite d’une trame audio, sans nécessiter de verrouillage matériel avec le matériel SHAPE. Il peut s’agir, par exemple, de fournir davantage de données de flux binaire pour le bloc XMA, de mettre à jour les paramètres de contexte de divers blocs ou de pointer vers une nouvelle liste d’exécution. Cela se fait habituellement pendant que le graphe de flux de traitement audio est modifié.
  2. La file d’attente d’état et de rapport (SRQ) est utilisée par le processeur audio SHAPE pour signaler au processeur divers événements qui ne nécessitent pas de réponse en temps réel. Par exemple, la mise à jour de la consommation de la mémoire tampon de flux binaire, les erreurs, les avertissements et indicateurs, les données de débogage, les données de performance et les informations d’état.

Considérations relatives à la programmation

La programmation directe du matériel SHAPE est possible au moyen de l’interface IACPHAL. Toutefois, le processus de préparation des données audio pour le matériel SHAPE est complexe. De nombreuses méthodes, structures et énumérations utilitaires sont fournies. Ces utilitaires fournissent toutes les méthodes nécessaires, ou la plupart d’entre elles, pour contrôler le matériel SHAPE. Le Microsoft Game Development Kit (GDK) inclut le code source de ces utilitaires pour les rares cas où il est nécessaire de modifier le code afin de traiter certains types de données. Le seul fichier d’en-tête à inclure explicitement dans votre projet est acphal.h, qui fait référence à tous les fichiers d’en-tête utilitaires. Toutes les fonctions utilitaires font référence à la macro NO_SHAPE_CONTEXT_VALIDATION. Si cette macro est définie, toutes les validations seront omises. Cela sera utile pour les versions finales destinées à la vente. Pour plus de détails sur le partage des ressources SHAPE et XMA avec des instances de XAudio2, consultez la section Remarques de la fonction XAudio2Create. Pour plus de détails sur toutes les méthodes utilitaires, consultez la Vue d’ensemble de l’ACP.

Graphes de flux persistants et non persistants

Vous pouvez soumettre des graphes de flux à traiter en mode persistant ou non persistant. Les graphes de flux persistants sont traités et demeurent résidents, de sorte que leur traitement est répété à la trame suivante, une fois que les pointeurs de lecture et d’écriture ont avancé et que les autres informations de contexte ont été mises à jour. Utilisez des graphes de flux persistants dans l’un ou l’autre des scénarios suivants.
  • Graphes de flux très complexes, qui nécessitent beaucoup de traitement par le processeur pour être réassemblés à chaque trame
  • Graphes de flux très statiques, qui ont le même nombre et la même configuration de voix pendant une période prolongée
Utilisez des graphes de flux non persistants dans l’un ou l’autre des scénarios suivants.
  • Les topologies de voix changent fréquemment.
  • La cadence de traitement du moteur logiciel audio de votre titre est dissociée du matériel SHAPE; autrement dit, elle n’est pas un multiple de 2,667 ms.
  • Vous souhaitez exécuter le traitement audio plus rapidement qu’en temps réel, en soumettant des graphes à consommer dès qu’ils sont disponibles.

Problèmes de débogage

Lorsque vous développez des graphes de flux, l’inscription aux messages vous aidera à déboguer les problèmes qui pourraient survenir. Plus précisément, utilisez le paramètre NumMessages de Connect. Le système de messagerie fournit une rétroaction détaillée sur divers problèmes, notamment les graphes de flux non valides (ACP_FLOWGRAPH_TERMINATED_REASON_INVALID_GRAPH), les commandes bloquées et les dépassements de trame causés lorsque vous tentez d’effectuer plus de traitement que ne le permet la taille de trame matérielle de 2,667 ms. Avant de livrer un titre, vérifiez que le traitement des graphes de flux réussit de façon constante en observant les messages ACP_MESSAGE_TYPE_FLOWGRAPH_COMPLETED pour chaque graphe de flux soumis.

Messages manqués

Si vous utilisez les messages ACP pour piloter l’état du moteur et que vous traitez de nombreux messages, vous devriez examiner le champ droppedMessageCount de ACP_MESSAGE pendant le développement. Une valeur non nulle de ce champ indique que la file d’attente des messages était pleine et que des messages ont dû être abandonnés. Dans ce scénario, envisagez de traiter la file d’attente plus rapidement et de l’agrandir.

Dépassements de trame

Il existe de nombreuses raisons pour lesquelles un graphe de flux pourrait ne pas être terminé avant la fin d’une trame audio (2,667 ms), par exemple le traitement d’un trop grand nombre de graphes de flux ou le traitement d’un graphe de flux mal structuré. Ce graphe de flux incomplet entraînera un message ACP_FLOWGRAPH_TERMINATED_TIME_EXCEEDED pour les graphes de flux persistants, et ces graphes de flux persistants seront incomplets. En revanche, un graphe de flux non persistant n’est pas soumis à cette contrainte et s’exécutera jusqu’à ce qu’il soit terminé, même sur plusieurs trames.

Commandes bloquées

Les commandes SRC et DMA peuvent être signalées comme bloquées (ACP_MESSAGE_TYPE_SRC_BLOCKED, ACP_MESSAGE_TYPE_DMA_BLOCKED) dans plusieurs scénarios, comme le montre le tableau suivant. | Type de commande| Scénario de blocage| | --- | --- | --- | --- | | XMA SRC| Le contexte XMA associé présente une erreur d’analyse ou n’a aucune donnée source. L’erreur est SHAPE_XMA_ERROR_STATUS_READ_BUFFER_INVALID_VALIDBUFFER_CURRBUF_IS_0 | SHAPE_XMA_ERROR_STATUS_FRAME_CROSSES_BOUNDARY_INTO_INVALID_READ_BUFFER_VALIDBUFFER_CURRBUF_IS_0 | SHAPE_XMA_ERROR_STATUS_FRAME_CROSSES_BOTH_READ_BUFFER_BOUNDARIES. XMA SRC ne bloquera pas en raison d’un manque de données décodées.| | PCM SRC| Le contexte PCM associé est SHAPE_PCM_MODE_CIRCULAR, et il n’y a aucune donnée source.| | Lecture (DMA à partir d’une mémoire tampon de mixage)| La mémoire tampon DMA est pleine.| | Écriture (DMA vers une mémoire tampon de mixage)| La mémoire tampon DMA est vide.| Une fois que des commandes sont déterminées comme bloquées (ce qui se produit à la fois avant leur ajout à une file d’attente SHAPE pour traitement et au moment de l’exécution), elles sont retirées du graphe, ce qui peut entraîner une perte audio. Pendant le développement, examinez d’abord les commandes bloquées pour trouver des améliorations dans la gestion des graphes de flux. De plus, avant la livraison, assurez-vous que votre titre empêche complètement le blocage des commandes. Vous pouvez empêcher le blocage des commandes DMA en vous assurant que votre mémoire tampon audio est suffisamment grande et que les données sont diffusées à intervalles réguliers par rapport à la taille de la mémoire tampon. Par exemple, si vous diffusez quatre trames matérielles à la fois, assurez-vous qu’un multiple de ces trames (au moins en double mémoire tampon, soit huit) se trouve dans la mémoire tampon afin que le matériel puisse écrire en avance sur le pointeur de lecture du titre. Vous pouvez aussi imposer le vidage de la mémoire tampon avant de soumettre le graphe de flux suivant : consommer, mettre à jour le pointeur de lecture DMA, puis soumettre le graphe de flux. Les commandes SRC ont trois modes.
  • SHAPE_SRC_COMMAND_TYPE_START est utilisé pour presque toutes les commandes SRC d’un graphe de flux. Effectuez un traitement normal et attendez-vous à ce que d’autres données audio suivent le graphe de flux actuel.
  • SHAPE_SRC_COMMAND_TYPE_STOP_IMMEDIATE sert à arrêter immédiatement le traitement des données XMA ou PCM source. Le SRC produira une mémoire tampon remplie de zéros pour cette trame.
  • SHAPE_SRC_COMMAND_TYPE_STOP_END sert à indiquer le dernier paquet d’une voix.
Si le dernier paquet d’une voix n’est pas soumis avec STOP_END ou STOP_IMMEDIATE, la commande SRC ne sera pas terminée, ce qui bloquera le graphe de flux actif. Un graphe de flux persistant se terminera à la fin de la trame audio, et un graphe de flux non persistant ne sera jamais terminé.

Problèmes de synchronisation

Des problèmes de synchronisation peuvent survenir si vous ne respectez pas les pratiques de consommation des contextes et des commandes du matériel SHAPE. Bien que vos titres conservent un accès complet à la mémoire allouée par l’ACP, veillez à ne pas modifier une structure de contexte pendant qu’elle est utilisée. Vous pouvez utiliser SubmitCommand pour soumettre des commandes à exécuter à une trame précise, au début de la trame suivante ou dès que possible.
Le scénario « dès que possible » demeure asynchrone par rapport à tout traitement du processeur par le titre. Certaines commandes peuvent ne pas être terminées immédiatement, par exemple si un contexte est au milieu d’une opération non interruptible. Attendez un message ACP_MESSAGE_TYPE_COMMAND_COMPLETED pour vérifier qu’une commande a bien été traitée.
Pour plus d’information, consultez Getting into SHAPE : meilleures pratiques pour la construction de graphes de flux audio.
Last modified on October 6, 2026