Utilisation de la librairie FMOD pour lire un MP3 sous C++ Builder

Ce document a pour but de présenter l'utilisation de la librairie FMOD et son utilisation sous C++ Builder pour lire des fichiers MP3. ♪

Article lu   fois.

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 :

 
Sélectionnez
                IMPLIB FMOD.LIB FMOD.DLL

ajouter le code suivant dans l'unité qui utilisera les fonctions de FMOD :

 
Sélectionnez
#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 :

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
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.
Call FSOUND_Close first

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

 
Sélectionnez
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é.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Ce document est issu de https://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.