Fonctionnement de l’exemple Echo
Le code crée l’effet ECHO en allouant une mémoire tampon suffisamment grande pour contenir exactement la quantité de données audio qui peuvent être rendues dans l’intervalle de temps spécifié par la valeur Delay Time. La taille de la mémoire tampon est calculée, en octets, par la formule suivante :
taille de la mémoire tampon = taux d’échantillonnage de délai * / * alignement de bloc 1000
Le délai est exprimé en millisecondes. Le taux d’échantillonnage et les valeurs d’alignement de bloc sont fournis dans une structure WAVEFORMATEX. Le taux d’échantillonnage est en échantillons par seconde ; la division par 1000 donne des échantillons par milliseconde. L’alignement du bloc est égal au produit du nombre de canaux (1 pour mono, 2 pour stéréo) et du nombre de bits par échantillon (8 ou 16) divisé par 8 (bits par octet).
En plus de la variable pointeur qui pointe vers le début de la mémoire tampon de délai, le code crée un pointeur mobile qui parcourt les données dans la mémoire tampon en synchronisation avec la boucle de traitement dans la fonction DoProcessOutput . Lorsque le pointeur mobile atteint la fin de la mémoire tampon de retard, il revient à l’en-tête de la mémoire tampon. Une mémoire tampon utilisée de cette manière est appelée mémoire tampon circulaire.
une fois que la mémoire tampon de délai existe et que Lecteur Windows Media a alloué une mémoire tampon d’entrée pour fournir des données audio et une mémoire tampon de sortie pour recevoir les données audio traitées, le traitement des échos se déroule comme suit :
- Entrez une boucle qui autorise le traitement de chaque échantillon audio dans la mémoire tampon d’entrée.
- Récupérez un exemple de la mémoire tampon d’entrée. Ensuite, déplacez le pointeur de la mémoire tampon d’entrée vers l’exemple suivant pour préparer l’itération de la boucle suivante.
- Récupérez un exemple de la mémoire tampon de délai.
- Copiez l’exemple à partir de la mémoire tampon d’entrée vers le même emplacement dans la mémoire tampon de délai à partir de laquelle l’échantillon de dernier retard a été récupéré.
- Déplacez le pointeur de mémoire tampon de délai vers l’exemple suivant. Si le pointeur se déplace au-delà de la fin de la mémoire tampon, déplacez-le vers l’en-tête de la mémoire tampon.
- Associez l’exemple de la mémoire tampon d’entrée à l’exemple de la mémoire tampon de délai.
- Copiez le résultat dans la mémoire tampon de sortie. Ensuite, déplacez le pointeur de la mémoire tampon de sortie vers l’unité suivante pour préparer l’itération de la boucle suivante.
- Répétez l’opération jusqu’à ce que tous les exemples soient traités.
Lorsqu’un exemple d’entrée récupéré à l’étape 2 est copié dans la mémoire tampon de délai de l’étape 4, il reste là jusqu’à ce que le pointeur mobile effectue un pas à pas détaillé dans la mémoire tampon de retard et finalement retourne à la même position. Étant donné que la taille de la mémoire tampon de délai est conçue pour correspondre au délai, le temps écoulé entre l’échantillon copié dans la mémoire tampon de retard et l’échantillon récupéré une nouvelle fois est égal au délai spécifié (plus toute latence introduite par le traitement réel).
Lorsqu’un flux démarre, aucune donnée de délai n’est générée tant que le délai n’est pas écoulé. Par conséquent, il est important que la mémoire tampon de délai contienne initialement un silence. Si la mémoire tampon de délai contient des données aléatoires, l’utilisateur entendra un bruit blanc jusqu’à ce que le plug-in génère suffisamment de données de délai pour remplacer l’intégralité de la mémoire tampon de retard.