> ## 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 l'enveloppe XDSP

> Vue d'ensemble de l'enveloppe XDSP

Dans cette rubrique, nous verrons comment utiliser l'enveloppe dans le cadre d'une convolution effectuée sur les appareils XBOX Series X|S à l'aide de XDSP. Ce mécanisme a été conçu pour offrir aux développeurs une méthode souple permettant de modifier dynamiquement une partie du filtre de réponse impulsionnelle sur le flux existant, sans réactiver un nouveau flux. L'API [XDspSubmitCommandWithEnvelope](/fr-CA/reference/audio/xdspaudio/functions/xdspsubmitcommandwithenvelope) est fournie; elle accepte un *envelopeBuffer* contenant des valeurs de gain pour chaque bloc du filtre de réponse impulsionnelle, en plus des paramètres fournis à l'API [XDspSubmitCommand](/fr-CA/reference/audio/xdspaudio/functions/xdspsubmitcommand). Les valeurs de gain sont multipliées par les blocs correspondants du filtre de réponse impulsionnelle pendant le processus de convolution afin de produire l'effet souhaité. Le filtre de réponse impulsionnelle d'origine n'est pas modifié pendant ce processus.

Pour mieux comprendre le mécanisme d'enveloppe, définissons les variables suivantes dans le domaine fréquentiel :

* Soit le signal du filtre de réponse impulsionnelle pour la case de fréquence ***n*** du bloc ***m*** : ***f\[n,m] = f\_Real\[n,m] + if\_Imag\[n,m]***.
* Soit le signal d'entrée pour la case de fréquence ***n*** du bloc ***m*** : ***s\[n,m] = s\_Real\[n,m] + is\_Imag\[n,m]***.
* Soit la valeur de gain pour un bloc de filtre ***m***, représentée par ***K\[m]*** (le gain d'enveloppe pour le bloc ***m***).

La représentation mathématique de l'enveloppe est alors la suivante :

***r\[n,m] = K\[m] \* f\[n,m] \* s\[n,m]***
***r\[n,m] = K\[m] \* (f\_Real\[n,m] + if\_Imag\[n,m]) \* (s\_Real\[n,m] + is\_Imag\[n,m])***

où ***r\[n,m]*** est la sortie de la convolution une fois que chaque case de fréquence et chaque bloc ont été mis à l'échelle par le gain d'enveloppe associé. Si aucun gain d'enveloppe n'est spécifié, alors ***K\[m] = 1.0f*** pour tous les blocs ***m***.

## Mémoire tampon d'enveloppe

La mémoire tampon d'enveloppe contient des valeurs de gain de type float pour chaque bloc du filtre de réponse impulsionnelle, à appliquer pendant la convolution. La taille minimale de cette mémoire tampon doit être de 8 valeurs float pour un filtre de réponse impulsionnelle mono et de 16 valeurs float pour un filtre de réponse impulsionnelle stéréo. Dans le cas d'une réponse impulsionnelle stéréo, la mémoire tampon d'enveloppe contient les valeurs de gain des deux canaux, les valeurs de gain de tout le canal gauche étant suivies des valeurs de gain de tout le canal droit. La longueur de l'enveloppe pour chaque canal doit être un multiple de 16 octets, sinon la sortie risque d'être incorrecte. Toute valeur supplémentaire découlant de l'arrondi au multiple de 16 octets le plus proche sera ignorée. Tous les pointeurs de mémoire tampon doivent être alignés sur 16 octets.
Cette mémoire tampon doit faire partie de la mémoire inscrite par [XDspConnect](/fr-CA/reference/audio/xdspaudio/functions/xdspconnect) ou [XDspConnectWithMaximumStreamLimit](/fr-CA/reference/audio/xdspaudio/functions/xdspconnectwithmaximumstreamlimit) et doit être alignée sur 16 octets. Cette mémoire tampon est utilisée par le matériel et ne peut être ni modifiée ni libérée tant que toutes les commandes qui l'utilisent ne sont pas terminées et que les réponses n'ont pas été récupérées.
Le nombre de valeurs de gain dans la mémoire tampon d'enveloppe doit correspondre au nombre de blocs du filtre de réponse impulsionnelle, arrondi au multiple de 16 octets le plus proche, et se calcule comme suit.

```cpp theme={null}
#define ROUND_UP_TO_16BYTE_ALIGNED(x) (((x) + (15)) & ~(0xF))

// XDspActivationParameters::impulseResponseLengthInFloats is the impulse response length of each channel in case of stereo IR
uint32_t irLengthInComplexes = XDspActivationParameters::impulseResponseLengthInFloats/2;  
uint32_t numFilterBlocks = irLengthInComplexes/XDspActivationParameters::blockFrameCount;

// Round up the envelope size to the nearest multiple of 16 bytes. Additional values resulting from the rounding will be ignored.
// envelopeGainCount represents the number of gain values an envelope buffer holds. In case of a stereo impulse response filter,
// this is the number of gain values per channel.
uint32_t envelopeLengthInBytes = ROUND_UP_TO_16BYTE_ALIGNED(numFilterBlocks * sizeof(float));
uint32_t envelopeGainCount = envelopeSize / sizeof(float)  

// Account for left and right channel envelopes in case of stereo impulse response
if (stereoImpulseRespone)
{
    envelopeLengthInBytes = envelopeLengthInBytes * 2;
}
```

Cette mémoire tampon suit la structure du filtre de réponse impulsionnelle. Pour une réponse impulsionnelle stéréo, les valeurs de gain de tout le canal gauche sont suivies des valeurs de gain de tout le canal droit, de la même façon que la réponse impulsionnelle du canal gauche est suivie de celle du canal droit.
Pour une réponse impulsionnelle mono, les mêmes valeurs de gain sont appliquées aux canaux gauche et droit d'un signal d'entrée stéréo.

## Utilisation de l'API

Voici un exemple de modèle d'utilisation de l'API. Consultez les remarques ci-dessous pour obtenir plus de détails.

```cpp theme={null}
XDspSubmitCommand(...)/XDspSubmitCommandWithEnvelope(.., nullptr, ...);  // _envelopeState = Off;  
XDspSubmitCommand(...)/XDspSubmitCommandWithEnvelope(.., nullptr, ...);  // _envelopeState = Off;  
:::::::::::::::::::::::     
XDspSubmitCommandWithEnvelope(..., envelopeBuffer1, ...); // _envelopeState = Engaged with envelopeBuffer1  
XDspSubmitCommandWithEnvelope(..., envelopeBuffer1, ...); // _envelopeState = Engaged with envelopeBuffer1  
:::::::::::::::::::::: 
XDspSubmitCommandWithEnvelope(..., envelopeBuffer2, ...); // _envelopeState = Engaged with envelopeBuffer2  
XDspSubmitCommandWithEnvelope(..., envelopeBuffer2, ...); // _envelopeState = Engaged with envelopeBuffer2  
::::::::::::::::::::::  
XDspSubmitCommand(...)/XDspSubmitCommandWithEnvelope(.., nullptr, ...);  // _envelopeState = Off;  
XDspSubmitCommand(...)/XDspSubmitCommandWithEnvelope(.., nullptr, ...);  // _envelopeState = Off;  
:::::::::::::::::::::::
```

## Remarques

La convolution est implémentée sous forme de processus en plusieurs étapes, et chaque paquet d'entrée passe par l'une de ces étapes. Pour que la sortie demeure fluide, l'enveloppe ne peut être activée ou désactivée qu'à la première étape. Cela signifie que l'effet d'enveloppe pourrait ne pas être désactivé ou activé immédiatement lorsque la commande est soumise. Quelques appels peuvent être nécessaires avant qu'il prenne effet.

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

* [XDspAudio (contenu de l'API)](/fr-CA/reference/audio/xdspaudio/xdspaudio_members)
  * Fonctions
    * [XDspSubmitCommandWithEnvelope](/fr-CA/reference/audio/xdspaudio/functions/xdspsubmitcommandwithenvelope)
    * [XDspSubmitCommand](/fr-CA/reference/audio/xdspaudio/functions/xdspsubmitcommand)
    * [XDspConnect](/fr-CA/reference/audio/xdspaudio/functions/xdspconnect)
    * [XDspConnectWithMaximumStreamLimit](/fr-CA/reference/audio/xdspaudio/functions/xdspconnectwithmaximumstreamlimit)

## Voir aussi

[Vue d'ensemble de XDSP](/fr-CA/build/console-features/audio/overviews/xdsp-overview)
[XDspSubmitCommandWithEnvelope](/fr-CA/reference/audio/xdspaudio/functions/xdspsubmitcommandwithenvelope)
[Vue d'ensemble d'une convolution à flux unique avec enveloppe à l'aide de l'API XDSP](/fr-CA/build/console-features/audio/overviews/xdsp-overview-single-stream-convolution-with-envelope)


## 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)
