Passer au contenu principal
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 à l’aide 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 disponibles pour un fonctionnement à haute vitesse et pour réduire le trafic sur le bus de la mémoire principale.
  • 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 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. Cependant, la construction de graphes de flux offre la plus grande flexibilité et l’accès aux capacités d’accélération audio de la console XBOX One. Cette rubrique fournit 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 en mémoire système.
  3. Le bloc SRC lit les échantillons PCM dans la mémoire tampon de décodage XMA et effectue la conversion de fréquence d’échantillonnage et le décalage de hauteur tonale nécessaires. Cela permet d’introduire dans les blocs d’accélération SHAPE des données audio ayant une fréquence d’échantillonnage arbitraire. Le bloc SRC envoie des 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 via 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 collectent et mixent les échantillons de plusieurs sources sonores pour la lecture. Des effets audio globaux facultatifs peuvent être traités à cette étape.
Un processus alternatif 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, en stockant la sortie dans une mémoire tampon de décodage XMA en mémoire système.
  3. Le bloc SRC lit les échantillons PCM dans la mémoire tampon de décodage XMA et effectue la conversion de fréquence d’échantillonnage et le décalage de hauteur tonale nécessaires. Cela permet d’introduire dans les blocs d’accélération SHAPE des données audio ayant une fréquence d’échantillonnage arbitraire. Le bloc SRC envoie des 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 via 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 collectent 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 éléments logiciels principaux : les contextes et la liste d’exécution. Les contextes, stockés en mémoire principale, conservent l’état et assurent le contrôle des éléments de traitement au sein des blocs matériels SHAPE spécifiques. Ils sont initialement générés par le processeur, mais 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 différents blocs matériels. 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 se compose de méta-commandes traitées par le processeur audio SHAPE. Comme le processeur est programmable et flexible, le format et la fonction de la liste d’exécution sont flexibles. Certaines méta-commandes ont des données implicites, d’autres des arguments explicites. Les méta-commandes spécifient également l’emplacement à partir duquel les blocs matériels SHAPE spécifiques obtiennent leur entrée et celui où ils écrivent leur sortie, à l’aide 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 montre 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 la lecture/écriture avec conversion automatique des valeurs flottantes en entiers et des entiers en valeurs flottantes. Le système DMA utilise des mémoires tampons circulaires qui contiennent des échantillons désentrelacés par 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. La DMA s’effectue par bloc. Une trame audio de données est transférée à la fois. Pour faciliter l’utilisation de données entrelacées par blocs, une valeur de saut spécifie le nombre de blocs de trames audio en mémoire système à ignorer (à partir de l’adresse de base) lors de la lecture ou de l’écriture des échantillons. C’est pourquoi 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 32 bits, entières ou flottantes, comme spécifié dans l’indicateur FloatConvert du contexte DMA. Pour aider à réduire la bande passante des données, la direction de la DMA (lecture ou écriture) est spécifiée dans la commande DMA plutôt que dans le contexte DMA. Le moteur DMA n’effectue aucun traitement du signal, mais peut convertir les valeurs flottantes en entiers et les entiers en valeurs flottantes. Cela permet au processeur de l’application de traiter les échantillons de données au 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 au sein de 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 illustré à 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 SHAPE est indépendante de l’horloge du processeur, la latence peut être un facteur. Les transitions du matériel vers le logiciel et du logiciel vers le 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. En outre, envisagez 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 décalage de hauteur tonale) 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 renvoie les données PCM vers 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 de quelques 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 spécifient 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 pour le SRC sans lire la mémoire principale.
xWMA n’est pas pris en charge par SHAPE, mais il est pris en charge via XAudio2.

PCM

Le PCM (Pulse Code Modulation) linéaire prend en charge jusqu’au son surround 7.1 à 48 KHz. L’ACP effectue un mixage réducteur si le système audio de l’utilisateur est, par exemple, en son surround 5.1 ou en stéréo. La sortie S/PDIF sera prise en charge. Les mémoires tampons PCM linéaires et circulaires contenant des entiers 16 bits mono ou stéréo, des valeurs flottantes 32 bits mono ou des entiers 32 bits mono (24 bits justifiés à gauche, ou 32 bits avec les 8 bits de poids faible masqués) sont également prises en charge.

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

Le bloc SRC effectue une conversion de 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 bas ou plus haut que la source, ainsi que 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 32 bits, soit des données à virgule fixe 16, 24 ou 32 bits. Comme données d’entrée, le bloc peut utiliser la sortie du décodeur matériel XMA ou 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 en mémoire et converties dans un format commun à virgule fixe 24 bits pour la conversion de 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 de flux entrelacé de données 16 bits. Le canal gauche se trouve dans les 16 bits de poids faible de chaque mot de 32 bits, et le canal droit dans les 16 bits de poids fort. En mode stéréo, les données PCM sont également 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 seconde mémoire tampon de mixage. La figure 3 présente les modes de conversion de fréquence d’échantillonnage. Figure 3. Modes de conversion de fréquence d’échantillonnage. Modes de conversion de fréquence d'échantillonnage L’entrée du bloc SRC peut avoir n’importe quelle fréquence d’échantillonnage ne dépassant pas 384 KHz moins epsilon. Toutefois, la sortie aura 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 près de 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 cette valeur de gain comme multiplicateur du signal, en le mettant à l’échelle de manière appropriée en fonction du niveau actuel du signal d’entrée. En d’autres termes, le compresseur est un contrôle automatique du volume qui surveille en permanence le signal d’entrée et s’ajuste en conséquence. Le compresseur n’agit que sur les signaux qui dépassent un seuil spécifique. Les signaux inférieurs au seuil passent sans modification. Le seuil est défini par l’application dans les données de contexte EQComp. Un contrôle programmable dans le contexte permet d’effectuer une compression ou une expansion. Le compresseur modifie les données sonores en fonction d’un paramètre qui spécifie le rapport entre le niveau entrant et le niveau sortant. Ce 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 tranche de 2 dB au-dessus du seuil, le compresseur produit 1 dB au-dessus du niveau du seuil.
  • À 1:1, le compresseur est pratiquement 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. En dessous du seuil, la sortie est égale à l’entrée. Au-dessus du seuil, le compresseur réduit la sortie d’une quantité spécifiée 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 spécifient la rapidité d’activation du compresseur, c’est-à-dire le temps nécessaire pour atténuer complètement, de la quantité spécifiée par le rapport, les sons qui dépassent le seuil. Attack et release sont spécifié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 repasse en dessous. 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 spécifiée 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 restée sous le seuil pendant la durée spécifiée par release. Figure 5. Le minutage attack/release. Minutage attack/release L’entrée est ensuite multipliée par le gain de sortie actuel. Cette première multiplication effectue la compression proprement dite, à savoir la mise à l’échelle du signal par une fonction variant dans le temps selon l’amplitude d’entrée. Il existe une mise à l’échelle de gain supplémentaire, qui constitue l’étape finale. Le gain de compensation est une valeur fixe définie par l’application. Comme la compression, en particulier avec des seuils bas, peut produire un signal de gain relativement faible, le gain de compensation sert à ramener le signal dans une plage exploitable. Le compresseur comporte un paramètre supplémentaire, RMS. En mode normal, le niveau d’entrée est instantané et calculé pour chaque échantillon. En mode RMS, une moyenne glissante (une approximation de la valeur RMS) est calculée sur les 128 échantillons précédents. Cette moyenne glissante est utilisée comme niveau d’entrée au lieu du 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 reçoit son entrée d’une ou deux mémoires tampons de mixage.
  • Une entrée est le signal audio à traiter.
  • La seconde entrée, appelée sidechain, est le signal de contrôle facultatif utilisé pour déterminer la compression audio.
L’égaliseur dispose de 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 la sortie, et a1, a2, b0, b1 et b2 les coefficients. Les coefficients sont accessibles dans une structure SHAPE_EQCOMP_CONTEXT.
En général, lorsqu’une égalisation est appliquée à un son, certaines zones de fréquences sont soit atténuées, soit amplifiées. L’atténuation des fréquences ne pose aucun problème : le signal de sortie aura un niveau égal ou inférieur à celui de l’entrée. En revanche, lorsque des fréquences sont amplifiées, une augmentation correspondante de la plage dynamique crête à crête du signal se produit souvent. 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 à coup sûr 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. Cette plage supplémentaire permet à chaque étage d’égalisation de fournir une amplification de 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 biquad (b0, b1, b2, a1 et a2) sont des entiers 24 bits. Cela permet une plage de coefficients allant jusqu’à +/- 7,998, ce qui convient pour fournir des coefficients pour les types de filtres autorisés, 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 des trois modes de sidechain suivants.
  • En mode Normal (figure 7), il existe une seule entrée audio provenant d’une mémoire tampon de mixage. L’entrée passe par l’égaliseur, puis 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, puis entre dans 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 permet d’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 met son 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 surround. Le panoramique sert généralement à 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 1,0 ou -1,0 aux valeurs intermédiaires. 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, compensée ensuite en sortie. La mise à l’échelle s’obtient par un décalage arithmétique à droite des données d’un certain nombre de bits. Le champ de marge du contexte spécifie le nombre de bits (0, 1, 2 ou 3) du décalage à droite appliqué au signal entrant avant le traitement FLTVOL. Par exemple, si une valeur de marge de 3 est spécifié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 à droite des données entrantes réduit nécessairement la précision dans les faibles valeurs. Les bits de marge inférieurs du signal audio entrant sont définitivement perdus. 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 cela, vérifiez la valeur du bit Internal Overflow dans le contexte FLTVOL. Si les données sources d’origine sont sur 16 bits (par exemple, si les données sources d’origine sont au format XMA), les bits de marge peuvent généralement être définis sur 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 flexible permet également d’appliquer un filtrage résonant à une voix pour aider à créer des effets audio et des variations 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 la forme d’un filtre de Chamberlin, qui offre trois modes : passe-haut, passe-bas et passe-bande, avec un contrôle Q (bande passante) 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 en dehors 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 permettent de déterminer 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 en 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 remplissent 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 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 depuis et vers la mémoire. 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. C’est pourquoi chaque bloc SHAPE conserve l’état associé à la marge du signal et au gain. Chaque bloc autre que SRC gère 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 gère é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 crête de sortie pendant la trame audio et en comptant les zéros de tête de la valeur absolue de cette crête. L’un des nombres de quatre bits contient 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, 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 cette mémoire tampon. L’un des nombres de quatre bits représente la magnitude de crête persistante en cours. 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 elles représentent 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 les dépassements et la saturation, en plus des réglages de gain précis, un décalage à droite de 0 à 7 bits peut être appliqué à la sortie d’un bloc matériel avant son 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 contribuent à réduire les verrouillages entre le matériel système et le matériel de l’application.
  1. La file d’attente de commandes et de contrôle (CCQ) sert à fournir 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 trame audio produite. En revanche, la CCQ n’est 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 s’agit par exemple de fournir davantage de données de flux binaire au bloc XMA, de mettre à jour les paramètres de contexte de différents blocs et de pointer vers une nouvelle liste d’exécution. Cela se fait généralement pendant la modification du graphe de flux de traitement audio.
  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. Il s’agit par exemple de la mise à jour de la consommation de la mémoire tampon de flux binaire, des erreurs, avertissements et indicateurs, des données de débogage, des données de performances et des informations d’état.

Considérations relatives à la programmation

La programmation directe du matériel SHAPE est possible via l’interface IACPHAL. Cependant, 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 la totalité ou la plupart des méthodes nécessaires 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 gérer certains types de données. Le seul fichier d’en-tête à inclure explicitement dans votre projet est acphal.h, qui référence tous les fichiers d’en-tête utilitaires. Toutes les fonctions utilitaires référencent la macro NO_SHAPE_CONTEXT_VALIDATION. Si cette macro est définie, toutes les validations sont omises. Cela est utile pour les builds commerciales finales. 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 restent 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 pour l’un des scénarios suivants.
  • Graphes de flux très complexes, qui nécessitent un traitement processeur important pour être réassemblés à chaque trame
  • Graphes de flux très statiques, qui conservent le même nombre et la même configuration de voix pendant une période prolongée
Utilisez des graphes de flux non persistants pour l’un des scénarios suivants.
  • Les topologies de voix changent fréquemment.
  • La cadence de traitement du moteur logiciel audio de votre titre est indépendante du matériel SHAPE, c’est-à-dire qu’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 destinés à être consommés 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 éventuels. Plus précisément, utilisez le paramètre NumMessages de Connect. Le système de messagerie fournit des retours détaillés 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 qui se produisent lorsque vous tentez d’effectuer plus de traitement que la taille de trame matérielle de 2,667 MS ne le permet. Avant de publier un titre, vérifiez que le traitement des graphes de flux réussit systématiquement 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 devez examiner le champ droppedMessageCount de ACP_MESSAGE pendant le développement. Une valeur non nulle de ce champ indique que la file d’attente de messages était pleine et que des messages ont dû être abandonnés. Dans ce cas, envisagez de traiter la file d’attente plus rapidement et de l’agrandir.

Dépassements de trame

Un graphe de flux peut ne pas être terminé avant la fin d’une trame audio (2,667 MS) pour de nombreuses raisons, 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îne un message ACP_FLOWGRAPH_TERMINATED_TIME_EXCEEDED pour les graphes de flux persistants, et ces graphes de flux persistants restent incomplets. En revanche, un graphe de flux non persistant n’est pas soumis à cette contrainte et s’exécute jusqu’à son achèvement, 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 indiqué dans le tableau suivant. | Type de commande| Scénario de blocage| | --- | --- | --- | --- | | XMA SRC| Le contexte XMA associé présente une erreur d’analyse ou ne contient 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 se bloque 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.| | Read (DMA depuis la mémoire tampon de mixage)| La mémoire tampon DMA est pleine.| | Write (DMA vers la mémoire tampon de mixage)| La mémoire tampon DMA est vide.| Une fois les commandes 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 supprimées du graphe, ce qui peut entraîner une perte audio. Pendant le développement, examinez en priorité les commandes bloquées pour améliorer la gestion des graphes de flux. En outre, avant la publication, assurez-vous que votre titre empêche totalement 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 une double mise en 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 également imposer le vidage de la mémoire tampon avant de soumettre le graphe de flux suivant : consommez, mettez à jour le pointeur de lecture DMA, puis soumettez le graphe de flux. Les commandes SRC disposent de trois modes.
  • SHAPE_SRC_COMMAND_TYPE_START est utilisé pour presque toutes les commandes SRC d’un graphe de flux. Effectue un traitement normal, en s’attendant à 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 sources XMA ou PCM. Le SRC produit 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 se termine pas, ce qui bloque le graphe de flux actif. Un graphe de flux persistant se termine à la fin de la trame audio, et un graphe de flux non persistant ne se termine jamais.

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 son utilisation. Vous pouvez utiliser SubmitCommand pour soumettre des commandes à exécuter à une trame spécifique, au début de la trame suivante ou dès que possible.
Le scénario “dès que possible” reste asynchrone par rapport à tout traitement processeur du titre. Certaines commandes peuvent ne pas se terminer 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’informations, consultez Se mettre en SHAPE : bonnes pratiques pour la construction de graphes de flux audio.
Dernière modification le 6 octobre 2026