Avant-propos▲
FMOD est une librairie très complète, mais seule la partie permettant de lire des fichiers au format MP3 est l'objet de ce tutoriel.
L'utilisation est libre pour un usage privé. Seule l'utilisation commerciale fait l'objet d'une licence.
Elle est téléchargeable à l'adresse suivante : http://www.fmod.org . La version utilisée ici est la 3.6. Je vous conseille de télécharger les API, ainsi que l'aide, soit au format HTML, soit au format CHM.
Un mini lecteur MP3 écrit avec FMOD : Exécutable - Sources
I. Préparation du Projet▲
Lors de la création du projet, il est nécessaire d'effectuer quelques manipulations préliminaires afin de s'assurer que tous les éléments de FMOD soient disponibles.
Dans le répertoire contenant le projet, recopier les fichiers suivants :
- FMOD.DLL ;
- FMOD.H ;
- FMOD_ERRORS.H ;
- FMODBC.LIB ;
- WINCOMPAT.H.
Ajouter FMODBC.LIB à la liste des fichiers utilisés dans le Project Manager. Il s'agit de la librairie d'importation. Elle peut être recréée par la commande :
IMPLIB FMOD.LIB FMOD.DLL
ajouter le code suivant dans l'unité qui utilisera les fonctions de FMOD :
#define WIN32
#define DLL_EXPORTS
#include
"fmod.h"
Les deux defines sont nécessaires pour que les déclarations des prototypes de fonctions soient correctes.
le WIN32 indique que l'on travaille sous Windows.
le DLL_EXPORTS que l'on va utiliser des fonctions importées depuis une DLL.
II. Initialiser la DLL▲
Il est nécessaire d'initialiser la DLL par la commande suivante :
bool
lRet;
lRet =
FSOUND_Init(44100
, 32
, 0
);
Les paramètres sont ,dans l'ordre :
- la fréquence de mixage ;
- le nombre de canaux software ;
- des flags d'initialisation.
Pour une description des paramètres, se référer à la documentation de FMOD.
Une valeur de retour à true indique que l'initialisation s'est bien déroulée, false sinon.
III. Ouvrir le MP3▲
FSOUND_STREAM *
MP3Stream;
MP3Stream =
FSOUND_Stream_OpenFile("test.mp3"
, FSOUND_NORMAL, 0
);
FSOUND_Stream_OpenFile ouvre un fichier et le prépare pour la lecture
Les paramètres sont dans l'ordre :
- le nom du fichier ;
- le mode spécifiant la façon de jouer le morceau ;
- 0 à une exception près.
Le 3e paramètre n'a de raison d'être que si FSOUND_LOADMEMORY est spécifié dans les mode.
Dans ce cas, le 1er paramètre est un pointeur sur un buffer en mémoire contenant le morceau à jouer.
Le 3e paramètre est dans ce cas, la longueur de la zone pointée par le 1er paramètre.
La valeur de retour est un pointeur sur une structure FSOUND_STREAM ou NULL si le fichier n'a pas pu être ouvert.
IV. Fermer le MP3▲
bool
lRet;
lRet =
FSOUND_Stream_Close(MP3Stream);
FSOUND_Stream_Close ferme le stream passé en argument et libère les ressources allouées lors de l'ouverture.
Une valeur de retour à true indique que la fermeture s'est bien déroulée, false sinon.
V. Démarrer la lecture▲
int
iChannel;
iChannel =
FSOUND_Stream_Play(FSOUND_FREE, MP3Stream);
FSOUN_Stream_Play lance la lecture du Stream passé en second paramètre.
Le premier paramètre permet de spécifier le numéro du canal que l'on veut utiliser. FSOUND_FREE prend le premier canal libre.
La valeur de retour est le numéro du canal attribué pour la lecture du morceau.
VI. Mettre la lecture en pause▲
int
iChannel;
bool
lRet, lPaused;
lPaused =
FSOUND_GetPaused(iChannel);
lRet =
FSOUND_SetPaused(iChannel, lPaused);
FSOUND_GetPaused renvoie l'état de pause du channel passé en paramètre.
FSOUND_SetPaused met le channel passé en 1er paramètre en l'état de pause spécifié par le second paramètre : true met la pause, false l'enlève.
VII. Arrêter la lecture▲
bool
lRet;
lRet =
FSOUND_Stream_Stop(MP3Stream);
FSOUND_Stream_Stop arrête la lecture du stream passé en paramètre.
À noter que la lecture est arrêtée, mais que le Stream n'est pas libéré.
VIII. Mute On/Off▲
int
iChannel;
bool
lMute, lRet;
lMute =
FSOUND_GetMute(iChannel);
lRet =
FSOUND_SetMute(iChannel, lMute);
FSOUND_GetMute prend en paramètre le numéro de channel dont on veut connaître l'état et renvoie son état : true si le channel est en mute, false sinon.
FSOUND_SetMute prend en 1er paramètre le numéro de channel dont on veut modifier l'état, et en second paramètre le nouvel état : true pour mettre le mute on, false pour mute off.
À noter que seul le volume est coupé, la lecture du stream se poursuit.
IX. Le Volume▲
IX-A. Obtenir le volume courant▲
int
iVol, iChannel;
iVol =
FSOUND_GetVolume(iChannel);
FSOUND_GetVolume prend en paramètre le n° du channel pour lequel on désire connaître le volume.
La valeur de retour varie de 0 (silence) à 255 (volume maximum).
IX-B. Fixer le volume▲
bool
lRet;
int
iVol, iChannel;
lRet =
FSOUND_SetVolume(iChannel, iVol);
FSOUND_SetVolume prend en 1er paramètre, le n° du channel pour lequel on veut modifier le volume, et en second le nouveau volume : de 0 (silence) à 255 (volume maximum).
La valeur de retour et un booléen qui vaut true si la modification a eu lieu, false sinon.
X. La Balance▲
X-A. Obtenir la valeur courante de balance▲
int
iPan, iChannel;
iPan =
FSOUND_GetPan(iChannel);
FSOUND_GetPan prend en paramètre le n° du channel pour lequel on désire connaître le niveau de balance.
la valeur de retour varie de 0 (tout à gauche) à 255 (tout à droite).
128 représente la valeur médiane.
FSOUND_STEREOPAN (-1) est renvoyé pour un morceau stéréo.
X-B. Fixer la valeur de la balance▲
bool
lRet;
int
iPan, iChannel;
lRet =
FSOUND_SetPan(iChannel, iPan);
FSOUND_SetPan prend en 1er paramètre le n° du channel pour lequel on désire modifier le niveau de balance et en second, la valeur de 0 (tout à gauche) à 255 (tout à droite).
FSOUND_STEREOPAN (-1) peut être spécifié. Dans ce cas, le morceau est joué comme si la balance était de 128, mais au volume maximum.
XI. La Durée▲
XI-A. Obtenir la durée totale du MP3▲
int
iLength;
FSOUND_STREAM *
MP3Stream;
iLength =
FSOUND_Stream_GetLengthMs(MP3Stream);
FSOUND_GetLengthMs prend en paramètre le stream MP3 (obtenu lors de l'ouverture du MP3) et retourne la longueur du morceau, exprimée en millisecondes.
XI-B. Obtenir la durée écoulée▲
int
iPassed;
FSOUND_STREAM *
MP3Stream;
iPassed =
FSOUND_Stream_GetTime(MP3Stream);
FSOUND_Stream_GetTime prend en paramètre le stream MP3 (obtenu lors de l'ouverture du MP3) et retourne la durée écoulée, exprimée en millisecondes.
XI-C. Se déplacer dans le MP3▲
bool
lRet;
int
iPos;
FSOUND_STREAM *
MP3Stream;
lRet =
FSOUND_Stream_SetTime(MP3Stream, iPos);
FSOUND_Stream_SetTime prend en 1er paramètre le stream MP3 (obtenu lors de l'ouverture du MP3) et en second, la position désirée, exprimée en millisecondes.
La valeur de retour est true si le positionnement a eu lieu, false sinon.
XII. Gestion des erreurs▲
int
iErrCode;
iErrCode =
FSOUND_GetError();
Cette fonction renvoie un code d'erreur dont la description est :
FMOD_ERR_NONE |
No errors |
FMOD_ERR_BUSY |
Cannot call this command after FSOUND_Init. |
FMOD_ERR_UNINITIALIZED |
This command failed because FSOUND_Init or FSOUND_SetOutput was not called |
FMOD_ERR_INIT |
Error initializing output device |
FMOD_ERR_ALLOCATED |
Error initializing output device, but more specifically, the output device is already in use and cannot be reused |
FMOD_ERR_PLAY |
Playing the sound failed |
FMOD_ERR_OUTPUT_FORMAT |
Soundcard does not support the features needed for this soundsystem (16bit stereo output) |
FMOD_ERR_COOPERATIVELEVEL |
Error setting cooperative level for hardware |
FMOD_ERR_CREATEBUFFER |
Error creating hardware sound buffer |
FMOD_ERR_FILE_NOTFOUND |
File not found |
FMOD_ERR_FILE_FORMAT |
Unknown file format |
FMOD_ERR_FILE_BAD |
Error loading file |
FMOD_ERR_MEMORY |
Not enough memory or resources |
FMOD_ERR_VERSION |
The version number of this file format is not supported |
FMOD_ERR_INVALID_PARAM |
An invalid parameter was passed to this function |
FMOD_ERR_NO_EAX |
Tried to use an EAX command on a non EAX enabled channel or output |
FMOD_ERR_CHANNEL_ALLOC |
Failed to allocate a new channel |
FMOD_ERR_RECORD |
Recording is not supported on this machine |
FMOD_ERR_MEDIAPLAYER |
Windows Media Player not installed so cannot play wma or use Internet streaming |
FMOD_ERR_CDDEVICE |
An error occured trying to open the specified CD device |
XIII. Obtenir la charge CPU causée par FMOD▲
float
fCPUUsage;
fCPUUsage =
FSOUND_GetCPUUsage();
FSOUND_GetCPUUsage permet de connaître la charge CPU ajoutée par FMOD.
La valeur retournée est un flottant compris entre 0.0 et 100.0, représentant le pourcentage de CPU utilisé.