Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS C FAQs C TUTORIELS C LIVRES C COMPILATEURS C SOURCES GTK+

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

23/10/2002

Par LFE (autres articles)
 

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


Avant-Propos
1. Préparation du Projet
2. Initialiser la DLL
3. Ouvrir le MP3
4. Fermer le MP3
5. Démarrer la lecture
6. Mettre la lecture en pause
7. Arrêter la lecture
8. Mute On/Off
9. Le Volume
9.1. Obtenir le volume courant
9.2. Fixer le volume
10. La Balance
10.1. Obtenir la valeur courante de balance
10.2. Fixer la valeur de la balance
11. La Durée
11.1. Obtenir la durée totale du MP3
11.2. Obtenir la durée écoulée
11.3. Se déplacer dans le MP3
12. Gestion des erreurs
13. Obtenir la charge CPU causée par FMOD


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 :

IMPLIB FMOD.LIB FMOD.DLL
ajouter le code suivant dans l'unite qui utilisera les fonctions de FMOD

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

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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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.

Responsable bénévole de la rubrique C : Arnaud Feltz (buchs) - Contacter par EMail :
Vos questions techniques : forum d'entraide C - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.