> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Vue d'ensemble de XMA2

> Fonctionnement de la décompression audio matérielle XMA2 sur XBOX One et comparaison avec le décodage logiciel xWMA pour le contenu audio de jeu XAudio2.

Sur XBOX One, la décompression audio XMA2 est implémentée dans le matériel. Ce n'est toutefois pas le cas de xWMA, qui nécessite un décodage logiciel. XMA2 et xWMA utilisent les mêmes algorithmes de compression, mais xWMA offre une plus grande variété de formats d'encodage. Encodez en XMA2 pour bénéficier d'avantages en matière de performances et de compression, mais notez que certaines musiques haute fidélité pourraient sonner mieux si elles sont rendues au moyen de xWMA - cela nécessiterait des tests d'écoute. Le codage de XMA2 au moyen de `XAudio2` devrait être l'approche la plus simple, mais XMA2 peut être codé directement pour le matériel à l'aide des commandes de l'ACP (Audio Control Processor).

<Note>xWMA et XMA2 tirent tous deux leur origine des codecs développés pour Windows Media Audio (WMA) et ont tous deux été développés spécifiquement pour les jeux XBOX. Le sous-ensemble de codecs et de paramètres disponibles utilisé par XMA2 est plus petit que celui utilisé par xWMA. Bien que xWMA et XMA2 aient tous deux été développés pour XBOX, ils ne sont pas interchangeables : les en-têtes de chaque format de fichier diffèrent, et les formats sont incompatibles avec les versions PC de Windows. Les codecs utilisés pour XMA2 et xWMA sont également légèrement différents, de sorte que chacun aura ses propres artefacts issus du système de compression utilisé.</Note>

Cette rubrique couvre les éléments suivants :

* [Encodage XMA2](#ID4E3)
* [Erreur de bus AXI XMA2](#ID4ENC)

<a id="ID4E3" />

## Encodage XMA2

Encodez les données audio en XMA2 à l'aide de l'[outil d'encodage XMA2](/fr-CA/build/console-features/audio/tools/xma2encodertool), fourni avec le Microsoft Game Development Kit (GDK). Les fichiers XMA2 sont des fichiers .wav qui possèdent l'en-tête de format [XMA2WAVEFORMATEX](/fr-CA/reference/audio/xma2defs/structs/xma2waveformatex) et un bloc `seek` supplémentaire dans la table d'emplacements `Seek`.

Le format XMA2 est compatible avec XBOX 360, et la table `Seek` doit faire l'objet d'une permutation d'octets `ULONG` pour XBOX One. Si l'entrée est un fichier .wav, la sortie peut être utilisée sans modification.

Pour permuter les octets de la table `Seek`, utilisez les lignes de code suivantes.

```cpp theme={null}
      for(UINT32 i = 0;(i < xmaformat->BlockCount);i++)
      {
      rgpXMASeekTable[i] = _byteswap_ulong(rgpXMASeekTable[i]);
      }  
```

Envisagez d'abord d'ajouter ce code à votre application pour tester la fonctionnalité, puis d'écrire éventuellement un outil distinct pour effectuer la permutation afin qu'aucun prétraitement ne soit requis de votre application.

Pour XBOX One, toutes les mémoires tampons d'entrée et de sortie DMA (Direct Memory Access) utilisées avec des graphes de flux, ainsi que tout le contenu XMA soumis à une mémoire tampon source, doivent être allouées à l'aide de la méthode [ApuAlloc](/fr-CA/reference/audio/apu/functions/apualloc) et libérées à l'aide de la méthode [ApuFree](/fr-CA/reference/audio/apu/functions/apufree). C'est ce que montre le code suivant. Notez l'utilisation de l'indicateur `SHAPE_XMA_INPUT_BUFFER_ALIGNMENT` pour aider à garantir que les blocs sont correctement alignés.

```cpp theme={null}
      HRESULT ApuVirtualAllocate(void** virtualAddress,UINT32 sizeInBytes)
      {
        DWORD dwsize = sizeInBytes;
        DWORD change = 0;
        if(FixBlockAlign((DWORD*)&sizeInBytes,SHAPE_XMA_INPUT_BUFFER_SIZE_ALIGNMENT,&change)) // Returns TRUE if an alignment was needed; else, returns FALSE.
        {
          return E_INVALIDARG;
        }
        return ApuAlloc(virtualAddress,NULL,sizeInBytes,SHAPE_XMA_INPUT_BUFFER_ALIGNMENT);
      }

      void ApuVirtualFree(void* virtualAddress)
      {
        if(virtualAddress)
        {
          ApuFree(virtualAddress);
        }
      }

      BOOL FixBlockAlign(DWORD* pBYTES,DWORD BLOCKALIGN,DWORD* pChange)
      {
        if(pBYTES && (BLOCKALIGN > 1))
        {
          DWORD bytes = (*pBYTES);
          (*pBYTES) /=  BLOCKALIGN;
          (*pBYTES) *=  BLOCKALIGN;
          if(pChange)
          {
            (*pChange) = bytes&mdash;(*pBYTES);
            if((*pChange) > 0)
            {
              return TRUE;
            }
          }
        }
        return FALSE;
      }  
```

Pour plus de détails sur l'utilisation des champs de la structure avec un fichier encodé en XMA2, consultez la structure [XMA2WAVEFORMATEX](/fr-CA/reference/audio/xma2defs/structs/xma2waveformatex).

<a id="ID4ENC" />

## Erreur de bus AXI XMA2

Un bogue de longue date dans le décodeur matériel XMA (et dans la XBOX 360) exige que les titres fournissent une solution de contournement s'ils utilisent `AcpHal` directement. `XAudio2` fournit déjà cette solution de contournement. Toutefois, jusqu'à ce que l'outil d'encodage XMA2 soit mis à jour, tenez compte des renseignements suivants.

Lors du décodage de flux binaires XMA avec une seule mémoire tampon d'entrée XMA, vous pouvez déclencher une erreur de bus AXI si les 64 derniers octets de la mémoire tampon XMA contiennent des données encodées. Un flux binaire XMA contient rarement des données encodées dans ses 64 derniers octets. Néanmoins, ce cas doit être géré pour éviter l'erreur de bus AXI. Jusqu'à ce que l'outil d'encodage XMA2 soit mis à jour pour garantir qu'aucun fichier encodé ne contienne de données encodées dans les 64 derniers octets du flux binaire, vous pouvez éviter ce problème à l'aide de l'une des méthodes suivantes.

* Utilisez toujours les deux mémoires tampons d'entrée XMA, et ne définissez jamais le pointeur de l'une ou l'autre des mémoires tampons d'entrée sur une valeur non valide.

* Définissez le pointeur de la mémoire tampon d'entrée inutilisée pour qu'il soit égal au pointeur de l'autre mémoire tampon d'entrée, même si vous n'activerez pas l'autre mémoire tampon. Voici un exemple.

```cpp theme={null}
      context->ptrRead1 = context->ptrRead0  
```

* Lors de la génération du contenu, utilisez un outil hors ligne pour analyser vos fichiers XMA. Si l'un des 64 derniers octets du flux binaire XMA encodé a une valeur autre que 0xFF, réencodez le fichier.

Chacune de ces méthodes empêche le prérécupérateur XMA de lire une adresse non valide.

<a id="ID4EFD" />

## Documentation de référence de l'API

* [APU (contenu de l'API)](/fr-CA/reference/audio/apu/apu_members)
  * Fonctions
    * [ApuAlloc](/fr-CA/reference/audio/apu/functions/apualloc)
    * [ApuFree](/fr-CA/reference/audio/apu/functions/apufree)
* [XMA2Defs (contenu de l'API)](/fr-CA/reference/audio/xma2defs/xma2defs_members)
  * Structures
    * [XMA2WAVEFORMATEX](/fr-CA/reference/audio/xma2defs/structs/xma2waveformatex)

## Voir aussi

[Outil d'encodage XMA2](/fr-CA/build/console-features/audio/tools/xma2encodertool)


## Related topics

- [Vue d'ensemble de XBOX Series X|S](/fr/paths/series-xs/overview.md)
- [Vue d'ensemble de l'accessibilité GDK](/fr/build/game-principles/accessibility/accessibility-overview.md)
- [Vue d'ensemble de Windows & ROG XBOX Ally](/fr/paths/windows/overview.md)
- [Vue d'ensemble de Godot et des moteurs communautaires](/fr/paths/community-engines/overview.md)
- [Vue d'ensemble de Play Anywhere (console + PC)](/fr/paths/play-anywhere/overview.md)
