> ## 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 allons examiner l'utilisation de l'enveloppe dans le cadre de la convolution sur les appareils XBOX Series X|S à l'aide de XDSP. Ce mécanisme a été développé pour offrir aux développeurs une méthode flexible 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/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/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 d'obtenir 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 ***f\[n,m] = f\_Real\[n,m] + if\_Imag\[n,m]*** le signal du filtre de réponse impulsionnelle pour la case de fréquence ***n*** du bloc ***m***.
* Soit ***s\[n,m] = s\_Real\[n,m] + is\_Imag\[n,m]*** le signal d'entrée pour la case de fréquence ***n*** du bloc ***m***.
* Soit ***K\[m]*** la valeur de gain pour un bloc de filtre ***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 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 dans le cas d'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 l'ensemble du canal gauche, suivies des valeurs de gain de l'ensemble du canal droit. La longueur d'enveloppe de chaque canal doit être un multiple de 16 octets, sinon la sortie risque d'être incorrecte. Toutes les valeurs supplémentaires résultant de l'arrondi au multiple de 16 octets le plus proche sont ignorées. 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/reference/audio/xdspaudio/functions/xdspconnect) ou [XDspConnectWithMaximumStreamLimit](/fr/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 pas être 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 être égal 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 l'ensemble du canal gauche sont suivies des valeurs de gain de l'ensemble du canal droit, de la même manière que la réponse impulsionnelle du canal gauche est suivie de la réponse impulsionnelle 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 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 la forme d'un processus en plusieurs étapes, et chaque paquet d'entrée passe par l'une de ces étapes. Pour que la sortie reste fluide, l'enveloppe ne peut être activée ou désactivée qu'à la première étape. Cela signifie que l'effet d'enveloppe peut ne pas être désactivé ou activé immédiatement lors de la soumission de la commande. Plusieurs appels peuvent être nécessaires pour qu'il prenne effet.

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

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

## Voir aussi

[Vue d'ensemble de XDSP](/fr/build/console-features/audio/overviews/xdsp-overview)
[XDspSubmitCommandWithEnvelope](/fr/reference/audio/xdspaudio/functions/xdspsubmitcommandwithenvelope)
[Vue d'ensemble d'une convolution à flux unique avec enveloppe à l'aide de l'API XDSP](/fr/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)
