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

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

Article lu   fois.

L'auteur

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

1. 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 etre recréée par la commande :

 
Sélectionnez

				IMPLIB FMOD.LIB FMOD.DLL  
			

ajouter le code suivant dans l'unite qui utilisera les fonctions de FMOD

 
Sélectionnez

#define WIN32
#define DLL_EXPORTS

#include "fmod.h" 
			

Les 2 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.

2. 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 deroulée, false sinon.

3. 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.

4. 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 deroulée, false sinon.

5. 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.

6. 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 lesecond paramètre : true met la pause, false l'enlève.

7. 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.

A noter que la lecture est arretée, mais que le Stream n'est pas libéré.

8. 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.

A noter que seul le volume est coupé, la lecture du stream se poursuit

9. Le Volume

9.1. 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).

9.2. 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.

10. La Balance

10.1. 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.

10.2. 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 etait de 128, mais au volume maximum.

11. La Durée

11.1. 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 milli-secondes.

11.2. Obtenir la durée écoulée

 
Sélectionnez

int iPassed;

FSOUND_STREAM *MP3Stream;
iPassed = FSOUND_Stream_GetTime(MP3Stream);
				

FSOUND_Stream_GetTime prend en parmètre le stream MP3 (obtenu lors de l'ouverture du MP3) et retourne la durée écoulée, exprimée en milli-secondes.

11.3. 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 parmètre le stream MP3 (obtenu lors de l'ouverture du MP3) et en second, la position désirée, exprimée en milli-secondes.

La valeur de retour est true si le positionnement a eu lieu, false sinon.

12. 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

13. 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ésetant le pourcentage de CPU utilisé.

Voir également mes autres articles :
Piloter Word sous C++ Builder et Delphi
Piloter Excel sous C++ Builder et Delphi
Utiliser l'API mySQL sous C++ Builder et Delphi
Utiliser un WebService sous C++ Builder et Delphi
Utiliser FMOD sous C++ Builder
Créer et utiliser une DLL sous C++ Builder
Signer des données avec C++ Builder
Comment déployer une application SWT via WebStart
Créer et déployer un premier servlet avec TomCat
Sans oublier :
la FAQ C++ Builder par Geronimo
la FAQ C
la FAQ C++

Ce document est issu de http://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.