[OpenGL && FMOD] Lire un mp3

Lire un mp3 [OpenGL && FMOD] - C++ - Programmation

Marsh Posté le 26-07-2006 à 18:57:43    

Bonjour, je réalise un jeu en opengl et j'aimerais savoir comment jouer un son en mp3 ??
 
Merci d'avance
 
NC


Message édité par nisalon_caje le 02-08-2006 à 11:45:51
Reply

Marsh Posté le 26-07-2006 à 18:57:43   

Reply

Marsh Posté le 26-07-2006 à 19:50:37    

Rien à voir avec OpenGL.
Regarde du côté de Fmod

Reply

Marsh Posté le 26-07-2006 à 20:25:07    

ok, où puis-je trouver un tutorial ?

Reply

Marsh Posté le 26-07-2006 à 20:32:26    

les samples livrés avec fmod contiennent absolument tout ce qu'il faut.

Reply

Marsh Posté le 28-07-2006 à 22:33:20    

ok merci, cependant je viens de rencontrer un problème : j'ai le code suivant (issu de l'exemple : j'ai voulu lire un mp3)
 

Code :
  1. /*===============================================================================================
  2. SIMPLEST.EXE
  3. Copyright (c), Firelight Technologies Pty, Ltd, 1999,2000.
  4. This is the simplest way to play a song through FMOD.  It is basically Init, Load, Play!
  5. ===============================================================================================*/
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #if defined(WIN32) || defined(_WIN64) || defined(__WATCOMC__)
  9.     #include <windows.h>
  10.     #include <conio.h>
  11. #else
  12.     #include <FMOD/wincompat.h> // FMOD's Version
  13. #endif
  14. // Include FMOD
  15. #include <FMOD/fmod.h>
  16. #include <FMOD/fmod_errors.h>    /* optional */
  17. int main()
  18. {
  19.     FMUSIC_MODULE *mod = NULL;
  20.     if (FSOUND_GetVersion() < FMOD_VERSION)
  21.     {
  22.         printf("Error : You are using the wrong DLL version!  You should be using FMOD %.02f\n", FMOD_VERSION);
  23.         exit(1);
  24.     }
  25.    
  26.     /*
  27.         INITIALIZE
  28.     */
  29.     if (!FSOUND_Init(32000, 64, 0))
  30.     {
  31.         printf("%s\n", FMOD_ErrorString(FSOUND_GetError()));
  32.         exit(1);
  33.     }
  34.  
  35.     /*
  36.         LOAD SONG
  37.     */
  38.     mod = FSOUND_Stream_OpenFile("musique.mp3",FSOUND_LOOP_NORMAL, 0);
  39.    
  40.     FSOUND_Stream_Play(FSOUND_FREE, mod);
  41.     /*
  42.         UPDATE INTERFACE
  43.     */
  44.     getch();
  45.    /*
  46.         FREE SONG AND SHUT DOWN
  47.     */
  48.     FMUSIC_FreeSong(mod);
  49.     FSOUND_Close();
  50.     return 0;
  51. }


 
à la compilation, avec devc++, il m'indique : main.cpp `FSOUND_Stream_OpenFile' undeclared (first use this function)  
alors que j'ai inclu la librairie pourtant !!!
 
Pourquoi cette erreur, comment la résoudre ? Merci d'avance

Reply

Marsh Posté le 29-07-2006 à 07:46:54    

Tu l'as inclu avec '<>' il faut donc que les fichiers d'entête se trouvent dans ton $INCLUDE_PATH soit au niveau variable d'environnement soit au niveau répertoire include de ton projet.
Ou alors inclu les fichiers avec des quotes, les fichiers devant se trouver dans le répertoire courant.

Reply

Marsh Posté le 29-07-2006 à 14:54:07    

j'ai essayé avec les 2 !!! et ça ne marche pas :'(
 
cependant, je ne pense pas que ce soit un problème de "localisation" des fichiers car devc++ m'aurait indiqué un message du genre : "fmod/fmod.h" not found

Reply

Marsh Posté le 29-07-2006 à 15:12:20    

D'après la doc de fmod 3.75 elle existe pas cette fonction. Le bon nom serait plutôt FSOUND_Stream_Open.
 
Sinon, juste comme ça, pourquoi ne pas avoir pris FMod Ex?

Reply

Marsh Posté le 29-07-2006 à 15:15:31    

tout simplement parce que devc++ a un installateur de librairie automatique : il les télécharge et les installe tout seul comme un grand -> il n'y avait que fmod. J'aurais pu prendre Fmod ex mais j'aurais du l'installer manuellement.
 
Qu'y a til de plus avec fmodex ?

Reply

Marsh Posté le 29-07-2006 à 15:19:54    

Il est orienté objet mais à l'utilisation je ne sais pas. C'est surtout par curiosité comme j'ai vu que c'était la nouvelle évolution de FMod ;)
 
Sinon, cette fonction?

Reply

Marsh Posté le 29-07-2006 à 15:19:54   

Reply

Marsh Posté le 29-07-2006 à 15:33:22    

ca marche ... ou tout du moins ca compile : en effet, voici mon nouveau code :  

Code :
  1. /*===============================================================================================
  2. SIMPLEST.EXE
  3. Copyright (c), Firelight Technologies Pty, Ltd, 1999,2000.
  4. This is the simplest way to play a song through FMOD.  It is basically Init, Load, Play!
  5. ===============================================================================================*/
  6. #include <cstdlib>
  7. #include <iostream>
  8. #include "FMOD/fmod.h"
  9. using namespace std;
  10. int main()
  11. {
  12.     FSOUND_STREAM *musique = NULL;
  13.    /*
  14.         LOAD SONG
  15.     */
  16.     musique = FSOUND_Stream_Open("01.mp3",0,0,0);
  17.    
  18.     FSOUND_Stream_Play(FSOUND_FREE, musique);
  19.     FSOUND_SetVolume(FSOUND_ALL, 120);
  20.     /*
  21.         UPDATE INTERFACE
  22.     */
  23.     system("PAUSE" );
  24.    /*
  25.         FREE SONG AND SHUT DOWN
  26.     */
  27.     FSOUND_Stream_Close(musique);
  28.     FSOUND_Close();
  29.     return 0;
  30. }


 
Cependant, on entend aucun son ... :(

Reply

Marsh Posté le 29-07-2006 à 16:03:20    

Ca serait pas ta pause qui l'empêcherait de tourner?
Il vaudrait mieux que tu laisses le programme tourner tant que tu n'appuies pas sur une touche. Il y a un exemple dans l'archive FMod qui t'aiderait à y voir plus clair; jètes-y un oeil.

Reply

Marsh Posté le 29-07-2006 à 16:11:11    

logiquement t'as une boucle de callback pour progresser dans ton mp3, sinon effectivement t'entendra rien.


---------------
Töp of the plöp
Reply

Marsh Posté le 29-07-2006 à 19:47:41    

je viens de regarder l'exemple dans l'archive de fmod, cependant, dans cet exemple, il n'est pas jouer un stream . De plus, je n'ai pas trouvé de boucle pour faire 'avancer' le programme, il y a juste une boucle qui rafraichit l'affichage tant qu'on n'a pas appuyé sur le claiver
 
Donc comment faire pour faire une

Citation :

boucle de callback


 
Merci :)

Reply

Marsh Posté le 29-07-2006 à 20:20:49    

c'est dans les samples ! Y'a pas qu'un exemple.


---------------
Töp of the plöp
Reply

Marsh Posté le 30-07-2006 à 13:18:22    

ok merci, c'est bon ca marche !!!
 
enfin, ca lit le fichier cependant, un autre problème (encore un!!!) ressurgit :
 
en fait dans mon programme en opengl, j'utilisais un gluttimerfunc qui provoquer un rafraichissement de l'image toutes les 30 millisecondes. Depuis que j'ai mis les musiques, le taux d'utilisation de l'uc est passé de 20 % à 40% ce qui est génant quand on a des scènes assez chargées ou on avait auparavant une utilisation de 80-85 %
 
Est-ce normal ?
 
Si non, comment faire baisser ce % d'utilisation ??
 
Encore une fois, merci d'avance ;)

Reply

Marsh Posté le 31-07-2006 à 12:12:21    

Il faut que tu utilises FMOD en mode non temps réel (FSOUND_OUTPUT_NOSOUND_NONREALTIME) ainsi, tu updateras le mixer de FMOD dans ton timer. (FSOUND_Update)
Tout est dans la doc.

Reply

Marsh Posté le 31-07-2006 à 17:22:33    

ok merci, mais pourquoi cela faisait-il augmenter démeusuremment l'utilisation de l'uc

Reply

Marsh Posté le 31-07-2006 à 20:59:59    

C'est un problème connu : OpenGL force FMOD à se mettre à jour plus rapidement que ce qu'il devrait faire, en théorie, il doit se mettre à jour pour chaque frame de ta scène d'où l'utilisation de ce mode non temps réel qui te permet de ne mettre à jour le mixer de fmod qu'à chaque frame et non tout le temps.

Reply

Marsh Posté le 31-07-2006 à 21:50:01    

ok, juste c'est quoi la fonction pour fixer ce paramètre (désolé pas encore eu le temps de lire bien comme il faut la doc)

Reply

Marsh Posté le 01-08-2006 à 10:04:34    

nisalon_caje a écrit :

désolé pas encore eu le temps de lire bien comme il faut la doc


 
Et donc là tu perds du temps :sarcastic:
Lire la doc n'est jamais exactement une perte de temps, ni vraiment couteux, si tu y réfléchis bien ...


Message édité par _darkalt3_ le 01-08-2006 à 10:05:05
Reply

Marsh Posté le 01-08-2006 à 10:54:59    

rebonjour a tous : j'ai fait un effort, j'ai commencé à lire la doc, tout du moins ce qui me concerne pour le moment :)
 
Bon ben j'ai trouvé comment faire, mais j'ai plus de son : mon code :  

Code :
  1. FSOUND_SetOutput(FSOUND_OUTPUT_NOSOUND_NONREALTIME);
  2.   FSOUND_Init(44100, 32, 0);
  3.  
  4.   musique1 = FSOUND_Stream_Open("data/sons/intro.mp3",FSOUND_NORMAL ,0,0);
  5.   FSOUND_SetVolume(FSOUND_ALL, 150);


Message édité par nisalon_caje le 01-08-2006 à 10:55:14
Reply

Marsh Posté le 02-08-2006 à 10:05:29    

J'ai oublié de préciser que ceci était juste le code de mon initialisation, que je lance une fonction de lecture ensuite.
 
J'ai lu dans le manuel qu'il existait une fonction nommée FSOUND_Update() mais je n'ai aps compris à quoi elle servait vraiment, comment l'utiliser, et si c'était cette fonction qui faisait défaut ici.  
 
Voila merci de votre aide
 
NC

Reply

Marsh Posté le 02-08-2006 à 10:11:01    

(update ton titre de topic stp)
 
Y'a des samples dans livré avec la lib.
Dedans, y'a un exemple avec un programme qui ne fait que lire un mp3.
Pourquoi tu ne t'en inspires pas ?

Reply

Marsh Posté le 02-08-2006 à 10:32:05    

Heu ... pourquoi updater le titre de mon topic ???
 
Bon sinon, j'ai regardé les samples, mais le problème n'est pas là !! Le problème est que quand je lis ce mp3, l'uc utilisé est doublé. D'où l'utilisation de FSOUND_SetOutput(FSOUND_OUTPUT_NOSOUND_NONREALTIME); car d'après KarLKoX cela devrait fixer le problème, cependant, ca coupe totalement le son !

Reply

Marsh Posté le 02-08-2006 à 11:26:37    

Salut,
Il faut probablement le combiner avec un driver de sortie non?
Si tu n'appelles pas cette fonction, FMod utilises un driver par défaut. Si tu l'appelles, il faut tout lui préciser. Je ne sais pas si le driver et ce flag se combine en un seul appel, ou s'il faut le faire séparément (ça m'étonnerait m'enfin, bon, si le premier ne marche pas... ;) ).
A toi de voir.
 
Il faudrait que tu updates le titre de ton topic parce que ce n'est pas lié à GL, mais FMod, ce sera plus facile pour quelqu'un faisant une recherche sur cette lib plus tard de comprendre ton post.

Reply

Marsh Posté le 02-08-2006 à 11:47:38    

Voila, j'ai updaté le titre de mon topic, mais cependant, pas la peine de poser les questions, puisque je n'en sais rien ;) Voila sinon, le faire séparemment, ben à vrai dire, je ne sais pas trop comment faire ... En tout cas, ce qui pourrait être bien, c'est de savoir si le code que j'ai mis ci dessus est correct, donc si l'erreur vient de l'idée ou de la forme, ce afin de savoir ce qu'il faut corriger :)
 
Voila encore merci d'avance ;)

Reply

Marsh Posté le 03-08-2006 à 00:33:23    

Ben, j'ai jamais vraiment joué avec FMod :/
 
Combiner ton appel avec un driver voulait dire quelque chose du genre:
FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND | FSOUND_OUTPUT_NOSOUND_NONREALTIME);
ça me paraît le choix le plus logique, mais s'il faut le faire séparément, ça serait quelque chose de ce type:
FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND);
FSOUND_SetOutput(FSOUND_OUTPUT_NOSOUND_NONREALTIME);
 
Voilà, je sais pas quelle méthode marche; je mise tout sur la première, mais c'est toute l'aide que je peux t'apporter... :/

Reply

Marsh Posté le 18-08-2006 à 23:23:28    

Il y a aussi SDL, SDL_mixer et SDL_audio il me semble. C'est plutôt par mal et cross-plateform
 
----------
http://website.bluesourcesproject.info/

Reply

Marsh Posté le 18-08-2006 à 23:28:49    

il vaux mieux prendre FMOD Ex: normalement FMOD normal va être abandonné, et FMOD Ex supporte des canaux virtuels très pratiques.

Reply

Marsh Posté le 18-08-2006 à 23:30:14    

drayell a écrit :

Il y a aussi SDL, SDL_mixer et SDL_audio il me semble. C'est plutôt par mal et cross-plateform
 
----------
http://website.bluesourcesproject.info/


 
non là franchement la partie audio de SDL n'a rien de vraiment interressant.
autant attaquer directement en OpenAL si tu veux un truc efficace et cross-platform.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed