Texel
DirectX | Index | Contact

Le son dans l'espace Part V:
Les effets spéciaux



Dans la partie précédente, nous avons pris connaissance des différents effets spéciaux pris en charge par DirectX. Nous allons voire ici comment utiliser ces effets dans un programme pour la lecture d'un son wave ou une musique MIDI. Les sources sont ICI

Les effets sont appliqués à une voie audio par l'intermédiaire d'un buffer. Donc comme dans la partie 5, il vous faut créer une voie audio et en obtenir un buffer avec CreateStandardAudioPath et GetObjectInPath (cf parties précédentes ou code source). Pour mieux suivre ce tutorial, vous pouvez cliquez ICI pour ouvrir une fenêtre avec le code source. A partir de maintenant, je considère que votre programme a déjà initialisé DirectX Audio et que vous avez accès à un buffer de votre voie audio.




1. Activation de l'effet

La première chose à savoir, c'est que l'on ne peut pas affecter d'effet spécial à un son (ou plutôt à un buffer) pendant sa lecture. Il faut donc le faire avant la lecture du son.

Par contre, une fois qu'un effet spécial est affecté à un son, on peut modifier ses paramètres à n'importe quel moment, même pendant la lecture (en temps réel).

Si on souhaite que l'effet spécial ne soit audible qu'à un moment précis de la lecture du son, il faut tout simplement jouer avec les paramètres pour que l'intensité de l'effet soit au minimum au début de la lecture du son. Mais ce n'est pas toujours possible. Certain effets comme le "Gargle" sont audible même à une intensité minimum. Pour connaître les possibilité des différents effets de DirectX Audio, exécutez les programmes d'exemple du SDK (Audio FX ou Sound FX).

Passons enfin au code. Dans notre exemple, nous utiliserons l'effet "Gargle". Pour affecter un effet à un buffer, il faut que la voie audio de celui-ci soit désactivé. On utilise pour cela la méthode IDirectMusicAudioPath8::Active() qui ne prend qu'un argument: une valeur Boolean pour TRUE ou FALSE.

pAudioPath->Activate(FALSE);

// Description de l'effet
DSEFFECTDESC dsEffect;
dsEffect.dwSize = sizeof(DSEFFECTDESC);
dsEffect.dwFlags = 0;
dsEffect.guidDSFXClass = GUID_DSFX_STANDARD_GARGLE;
dsEffect.dwReserved1 = 0;
dsEffect.dwReserved2 = 0;

DWORD dwResults;

// Affectation de l'effet
pDSB->SetFX(1, &dsEffect, &dwResults);

pAudioPath->Activate(TRUE);




















La structure de type DSEFFECTDESC permet de définir le type d'effet à affecter au buffer grâce au champs guidDSFXClass. Consultez la documentation du SDK pour savoir quelle valeur donnez à ce champ suivant l'effet désiré. Le champ dwFlags définit si l'effet sera calculé en Hardware ou Software. Les autres champs doivent rester tel quel.

la méthode IDirectSoundBuffer8::SetFX() affecte l'effet. Le premier argument indique le nombre d'effets. Mettez le à zéro pour supprimer tous les effets. Le deuxième paramètre est la structure remplie précédemment. Et le dernier argument est une variable de type de DWORD permettant d'identifier les éventuelles problèmes lors de exécution de la méthode (cf doc du SDK).

A partir de cette instant, l'effet est actif avec des paramètres standards. Si on jout un son (sans avoir oublié de réactiver la voie audio), on pourra entendre l'effet.




2. Réglage de l'effet

L'effet est affecté et activé. On veux maintenant changer ses paramètres pour les adapter à notre convenance.
Le code qui suit peut être placé avant pendant ou après la lecture du son.

IDirectSoundFXGargle8* pEffectDMO;
DSFXGargle FXParams;

pAudioPath->GetObjectInPath(DMUS_PCHANNEL_ALL,
    DMUS_PATH_BUFFER_DMO, 0,
    GUID_All_Objects, 0, IID_IDirectSoundFXGargle8,
    (LPVOID*) &pEffectDMO);
pEffectDMO->GetAllParameters(&FXParams);
FXParams.dwRateHz = 0;
pEffectDMO->SetAllParameters(&FXParams);














Cette modification nécessite l'utilisation d'une interface et d'une structure qui sont toutes les deux propre à chaque effet (cf doc du SDK). Dans notre exemple, nous appliquons l'effet "Gargle". Nous avons donc besoin de déclarer une interface de type IDirectSoundFXGargle8 et une structure de type DSFXGargle. La méthode IDirectMusicAudioPath8::GetObjectInPath permet (encore une fois) d'obtenir un pointeur vers une interface IDirectSoundFXGargle8.

Les méthodes GetAllParameters et SetAllParameters permettent d'obtenir ou d'appliquer les paramètres d'un effet grâce à une structure passé un argument que l'on peut remplir soit même (de type DSFXGargle dans notre exemple). Le nombre de champs de la structure et leur fonction varie suivant les effets (ou plutôt suivant les structures nécessaires aux effets).


Conclusion:

A la fin de votre application, n'oubliez pas de libérer les interfaces utilisées. Je vous conseil aussi de supprimer les effets spéciaux affectés à vos buffer avec la méthode SetFX et son premier paramètre à zéro. Je ne sait pas si c'est conseillé ou obligatoire, mais j'ai déjà eu des problèmes sur un PC (l'effet semblait être toujours actif après l'exécution de mon application) et ça a résolut le problème.




Version originale: Septembre 2001
Dernière mise à jour: Septembre 2002
Par Grégory Smialek
www.texel.fr.fm