Texel
DirectX | Index | Contact

Le son dans l'espace Part I:
En 2D pour commencer



Nous allons voir dans cette suite de tutoriaux comment immerger l'utilisateur de nos applications dans un espace sonore 2D ou 3D. Vous verrez que DirectX facilite beaucoup la vie des programmeurs. Je pars du principe que vous avez déjà lu le tutorial sur la lecture d'un fichier audio (du site ou du SDK).

Nous allons voir ici comment utiliser trois effets très simples de spatialisation du son dans un espace à deux dimensions. Vous allez apprendre à modifier la fréquence d'échantillonnage d'un son, utiliser vos enceintes stéréo, et changer le volume d'un son sans toucher au bouton du volume (ouha!!). Ces techniques ne seront plus utilisés lorsque l'on s'intéressera au son en 3D (on utilisera d'autres techniques plus intéressantes).

On va aussi en profiter pour voir comment créer une nouvelle voie audio différente de celle créé par défaut par InitAudio.

Vous pouvez télécharger ici un code source d'exemple pour cette partie.





1. Création d'une voie audio

On peut créer plusieurs voies audio (qui corresponde à autant de buffer différent) pour utiliser différents effets spatiaux pour des sons différents ou pour stopper un ensemble de sons en même temps (cf. tutorial sur la lecture d'un fichier audio).

Pour créer une nouvelle voie audio, c'est très simple. Il suffit de déclarer un objet de type IDirectMusicAudioPath8, de l'initialiser à NULL, et d'utiliser la méthode CreateStandardAudioPath de votre interface IDirectMusicPerformance8 pour lui obtenir un pointeur:

IDirectMusicAudioPath8* pAudioPath = NULL;

g_pPerformance->CreateStandardAudioPath(
DMUS_APATH_DYNAMIC_STEREO, // voie audio
64, // nombre de canaux
TRUE, // active la voie immédiatement
&pAudioPath // adresse de l'objet
);











Le premier argument est le type de voie que vous désirez. Ce son les même drapeaux que pour InitAudio.

Le deuxième argument est le nombre de canaux ( Comme pour InitAudio).

Le troisième argument définit si oui ou non la voie doit être immédiatement activer (TRUE ou FALSE).

Le dernier argument est l'adresse de l'objet qui reçoit le pointeur.

Il ne faut pas oublier d'indiquer à PlaySegmentEx la voie que l'on utilise.




2. Accéder à une interface IDirectSoundBuffer8

Les méthodes dont on à besoin pour manipuler le son se trouve dans l'interface IDirectSoundBuffer8. Un objet de ce type a été créé en interne par DirectX lorsque l'on a créé une voie audio. Il faut donc le récupérer par la méthode GetObjectInPath de l'interface IDirectMusicAudioPath8:

IDirectSoundBuffer8* pDSB = NULL;

pAudioPath->GetObjectInPath(
DMUS_PCHANNEL_ALL,
DMUS_PATH_BUFFER,
0,
GUID_NULL,
0,
IID_IDirectSoundBuffer,
(LPVOID*) &pDSB
);














Le drapeau DMUS_PCHANNEL_ALL passé en premier argument permet d'avoir tous les canaux du buffer. (Sinon le premier canal à la valeur 0).

Le drapeau DMUS_PATH_BUFFER passé en deuxième argument indique que l'on souhaite avoir l'interface d'un buffer (cette méthode permet d'obtenir d'autres choses dont on n'a pas besoin).

Pour les trois arguments suivants consultez la documentation, sinon passer simplement les arguments indiqués.

L'avant dernier argument est un indentificateur COM qui indique que l'on désire l'interface d'un buffer simple. Pour un buffer qui gère la 3D, il faut passer l'identificateur IID_IDirectSound3DBuffer.

Le dernier argument est l'adresse le l'objet qui reçoit le pointeur vers l'interface.




3. Les effets

Toutes les méthodes citées ci-dessous appartiennent à l'interface IDirectSoundBuffer8.

La fréquence d'échantillonnage:

La majorité des fichiers audio on un taux d'échantillonnage de 11, 22 ou 44 KHz. DirectX Audio permet de modifier le taux d'échantillonnage d'un son en direct grâce à la méthode SetFrequency.

pDSB->SetFrequency( 22000);




Cette méthode peu être utilisé pour accélérer les bruits de pas d'un homme ou le bruit du moteur d'une voiture proportionnellement à une vitesse de déplacement. Elle peut aussi servir à créer un effet Doppler (cf. part II) soit même, sans utiliser les possibilités 3D de DirectX Audio.

La méthode GetFrequency est aussi disponible.


Le volume:

Pour modifier le volume d'un son, il suffit d'utiliser la méthode SetVolume.

pDSB->SetVolume( 200);




Cette méthode prend en argument une valeur qui s'étend de -10000 à 10000. Si la valeur est 0, le son est joué avec son volume original (celui de l'enregistrement). Une valeur négative/positive diminue/augmente le volume.

La méthode GetVolume est aussi disponible.


L'effet Stéréo

La méthode SetPan répartit le son entre les deux haut-parleurs.

pDSB->SetPan(-10000); // Tout le son est jouer à gauche




L'argument de la méthode est une valeur qui s'étend de -10000 à 10000. La valeur 0 fixe le son avec le même volume pour les deux haut-parleurs. Une valeur négative diminue le son du haut-parleur droit ( et fait donc passer le son plus à gauche). Et inversement pour une valeur positive.




Conclusion:

N'oubliez pas de libérer les interfaces de la voie audio et du buffer avant de quitter l'application avec la méthode Release.

Les autres méthodes de l'interface IDirectSoundBuffer8 sont moins intéressantes. Vous pouvez maintenant passer à la partie II si vous voulez gérer le son en 3D.


Version originale: Avril 2001
Dernière mise à jour: Juin 2002
Par Grégory Smialek

www.texel.fr.fm