Jouer un wav avec PlaySound et contrôler le volume
Récemment, par intérêt personnel, j'ai commencé à explorer les différentes façons de faire sortir du son d'un ordinateur par programmation C++. Comme point de départ, j'ai testé la sortie de son par le haut-parleur et j'ai joué avec les fréquences pour composer une mélodie simpliste. L'étape suivante devait naturellement être celle où j'allais faire jouer un fichier wav et dans l'ordre logique des choses, je m'attaquerai éventuellement au format mp3.
Avant toute chose, j'avais besoin de lier une librairie pour le son à mon projet dans l'éditeur Bloodshed C++. La fonction PlaySound(), nécessaire à la lecture d'un wav, se trouve dans libwinmm.a. Je l'ai localisée dans mon installation Windows dans le répertoire de librairies fournies avec l'éditeur dans C:\Dev-Cpp\lib\libwinmm.a.
Pour l'ajouter, rendez-vous dans le menu Project / Project Options / Parameters / Add Library or Object et ajoutez le chemin vers le fichier libwinmm.a.
Dans le répertoire du projet, j'ai ajouté 2 fichiers wav à des fins de tests et j'ai écrit le code suivant:
#include <windows.h>Quelques explications :
#include <stdio.h>
using namespace std;
int main(int argc, char *argv[]){
MMRESULT result;
result = waveOutSetVolume(NULL, 0x3000);
if(MMSYSERR_NOERROR == result){
// ils jouent un après l'autre, pas simultanément
printf("Debut de son1.wav\n");
PlaySound("son1.wav", NULL, SND_FILENAME);
printf("cette ligne sera ecrite apres\n");
printf("Debut de son2.wav\n");
PlaySound("son2.wav", NULL, SND_FILENAME|SND_ASYNC);
printf("cette ligne sera ecrite pendant que son2.wav joue, l'execution du code se poursuit...\n");
}
system("PAUSE");
return EXIT_SUCCESS;
}
- il faut inclure windows.h en entête en plus de lier libwinmm.a. Sinon, stdio.h ne sert qu'à l'utilisation de la fonction printf() pour suivre la trace.
- comme paramètre à la fonction waveOutSetVolume(), le niveau de volume doit être une valeur hexadécimale située entre 0x0000 (silence) à 0xFFFF (plein volume).
- on peut aussi balancer le volume entre le canal gauche et droit, la valeur 0xFFFF0000 indiquant que le son ne sortira que du côté droit, alors que 0x0000FFFF sera uniquement pour le gauche. Dans le DWORD, les 4 premiers caractères sont pour le canal droit et les 4 suivants sont pour le gauche (0xDDDDGGGG).
- j'en ai profité pour illustrer la différence entre la façon de jouer les 2 fichiers. La première instruction PlaySound attendra que la lecture du wav soit terminée pour exécuter la ligne suivante alors que la deuxième instruction, qui utilise le flag SND_ASYNC, permet de poursuivre l'exécution pendant que le wav joue.
- il est possible de le combiner avec le flag SND_LOOP pour le jouer en boucle.