Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec f-mod pour lire les sons

Lors/Après un appel de fonction

Sujet résolu
    18 juin 2007 à 14:17:49

    Bonjour à tous les zérOs!!
    J'aurai besoin d'aide par rapport à f-mod.
    En fait, je commence à programmer quelques jeux en SDL.
    ( pas du haut niveau, hein! J'en suis encore à faire des pendus et des "marios-like" ^_^)
    Jusque là tout ce passe bien.
    Mais c'est au moment d'incorporer de la musique et des sons que ça se gâte :
    En effet, je programme en C++, et j'essaie dans la mesure du possible de le faire dans un esprit de POO.
    Ce qui fait que j'ai plusieurs classes et fonctions.
    Et le problème, c'est que si je suis dans ma fonction principale, par exemple,
    et que j'initie f-mod et lance une musique, eh bien, lorsque j'appelle une fonction
    (par exemple maClasse.BougerPersonnage(paramètres)), une fois dans la fonction, plus de musique!!
    Et une fois de retour dans la fonction appellante, plus de musique non plus!!
    Et ce, même si je met en pause avant d'appeller mafonction.
    Cela me pose donc bien des problèmes.
    J'avais aussi essayer de faire une fonction qui joue les sons :
    void maFonctionPourJouerSons(nomMusiqueAJouer);
    Seulement, dès le retour de la fonction (qui est presque instantané),
    on entend plus rien!!
    Voilà...
    Donc si quelqu'un peut m'aider, merci d'avance !! ^_^
    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2007 à 21:50:29

      Citation :

      Mais c'est au moment d'incorporer de la musique et des sons que ça se gâte :
      En effet, je programme en C++, et j'essaie dans la mesure du possible de le faire dans un esprit de POO.


      Si ce n'est pas déja le cas, utilise plutôt fmodEx, qui elle a déja une interface en c++.

      Citation :

      Et le problème, c'est que si je suis dans ma fonction principale, par exemple,
      et que j'initie f-mod et lance une musique, eh bien, lorsque j'appelle une fonction
      (par exemple maClasse.BougerPersonnage(paramètres)), une fois dans la fonction, plus de musique!!
      [...]
      J'avais aussi essayer de faire une fonction qui joue les sons :
      void maFonctionPourJouerSons(nomMusiqueAJouer);
      Seulement, dès le retour de la fonction (qui est presque instantané),
      on entend plus rien!!


      Pas normal ! je n'ai jamais eu ce problème..
      du code ?
      • Partager sur Facebook
      • Partager sur Twitter
        19 juin 2007 à 10:33:40

        Pour la version C++ de f-mod, merci de me le dire car, effectivement, je ne savait pas qu'elle existait, je la télécharge dès que possible (je suis en 56k avec un forfait ridicule ...Oui, ça existe encore...malheureusement...)
        Pour le code, voilà :
        Lorsque j'appèle une fonction d'une autre fonction (ici main), je suis obligé, comme ici, de recommencer la lecture de la musique...
        #include "Jeu.h"
        #include "Options.h"
        #include "Constantes.h"

        int main(int argc, char *argv[])
        {
            SDL_Surface *ecran=NULL, *fond=NULL;
            SDL_Rect position;
            position.x=0;
            position.y=0;
            SDL_Event event;
            int continuer = 1;


            SDL_Init(SDL_INIT_VIDEO);
            TTF_Init();

            FSOUND_STREAM *musique = NULL;

            FSOUND_Init(44100, 32, 0);
            musique = FSOUND_Stream_Open(MUSIQUE_FOND_MENU, 0, 0, 0);
            if (musique == NULL)
            {
                fprintf(stderr, "Impossible de lire musiqueFond.mp3\n");
            }
            FSOUND_Stream_SetLoopCount(musique, -1);
            FSOUND_Stream_Play(FSOUND_FREE, musique);

            SDL_WM_SetIcon(SDL_LoadBMP(ICONE), NULL);

            ecran = SDL_SetVideoMode(900, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
            SDL_WM_SetCaption(" Pendu version X.2.0  par Anje91", NULL);


            fond = IMG_Load(MENU_PRINCIPAL);
            position.x=0;
            position.y=0;
            SDL_BlitSurface(fond, NULL, ecran, &position);
            SDL_Flip(ecran);

            Options lesOptions(ecran);

            while (continuer)
            {
                SDL_WaitEvent(&event);
                switch(event.type)
                {
                    case SDL_QUIT:
                        lesOptions.JouerSon(TOUCHE, T_TOUCHE);
                        continuer = 0;
                        break;
                    case SDL_KEYDOWN:
                        if (event.key.keysym.sym==SDLK_j)
                        {
                                Jeu leJeu(ecran);
                                leJeu.LancerJeu();
                                position.x=0;
                                position.y=0;
                                SDL_BlitSurface(fond, NULL, ecran, &position);
                                SDL_Flip(ecran);
                                lesOptions.JouerSon(TOUCHE1, 750);
                                FSOUND_Stream_Play(FSOUND_FREE, musique);
                        }
                        if (event.key.keysym.sym==SDLK_o)
                        {
                                lesOptions.AfficherOptions();
                                position.x=0;
                                position.y=0;
                                SDL_BlitSurface(fond, NULL, ecran, &position);
                                SDL_Flip(ecran);
                                lesOptions.JouerSon(TOUCHE1, 750);
                                FSOUND_Stream_Play(FSOUND_FREE, musique);
                        }
                        switch (event.key.keysym.sym)
                        {
                            case SDLK_a :
                                lesOptions.JouerSon(TOUCHE, T_TOUCHE);
                                continuer=0;
                                break;
                            case SDLK_ESCAPE :
                                lesOptions.JouerSon(TOUCHE, T_TOUCHE);
                                continuer=0;
                                break;
                        }
                }
            }

            FSOUND_Stream_Close(musique);
            FSOUND_Close();

            TTF_Quit();
            SDL_Quit();

            exit(EXIT_SUCCESS);
        }

        Et de plus, je suis obligé de re-initialiser f-mod dans la fonction appellée si je veux y jouer un son...
        Meme si je passe "musique" en paramètre...

        Et pour la fonction qui était sensée jouer des sons, la voila :

        void Options::JouerSon(char *nomSon, int temps)
        {
            FSOUND_SAMPLE *son;
            FSOUND_Init(44100, 32, 0);
            son = FSOUND_Sample_Load(FSOUND_FREE, nomSon, 0, 0, 0);
            if (son == NULL)
            {
                fprintf(stderr, "Impossible d'ouvrir le son\n");
            }
            if (!(FSOUND_PlaySound(FSOUND_FREE, son)))
            {
                fprintf(stderr, "Impossible de lire le son\n");
            }
            SDL_Delay(temps);
            FSOUND_Sample_Free(son);
            FSOUND_Close();
        }

        Je suis obligé de faire un "SDL8Delay(temps);", sinon de retour dans la fonction appellante, on entend plus de son...

        C'est sûrement une erreur bête mais vraiment je ne vois pas...
        • Partager sur Facebook
        • Partager sur Twitter
          19 juin 2007 à 13:51:47

          Forcément, si tu fermes fmod à la fin de la fonction, comment veux-tu que la musique continue à être jouée après ? :D

          Citation :

          Et de plus, je suis obligé de re-initialiser f-mod dans la fonction appellée si je veux y jouer un son... Meme si je passe "musique" en paramètre...


          Non c'est faux ( j'viens de faire une petite batterie de test histoire de m'en assurer )


          Ta conception est assez loin de l'esprit POO : On voit une grosse fonction qui se charge elle même de tout initialiser, puis une classe un peu fourre tout (Options) qui gère en même temps l'affichage, le son.. tout ça dans une programmation plus procédural qu'objet finalement.

          J'te conseillerais plutôt d'avoir une class spécialisé dans le son, qui initialise fmod dans son constructeur, qui possède des FSOUND_SAMPLE* comme attributs privé ( chargés ou non dans le constructeur suivant tes besoins.. ) Tu vois l'idée ?

          • Partager sur Facebook
          • Partager sur Twitter
            20 juin 2007 à 14:38:13

            voila la structure a utiliser:
            début de main
            - initialiser fmod
            - faire des trucs
            - appeler une fonction qui joue un son (cette fonction NE FERME PAS FMod)
            - faire des trucs
            -fermer fmod
            exit(0);
            fin de main
            • Partager sur Facebook
            • Partager sur Twitter
              21 juin 2007 à 11:12:40

              j'ai eu ce probleme avec SDL_Surface ^^

              tu veux utiliser un son qui est definit dans le main...
              1) pourquois char* nomSon???
              pourquois pas FSOUND_SAMPLE *nomSon
              2)encore mieux pourquois tu ne ferais pas...

              class SON {
              FSOUND_SAMPLE *m_son; //pointeur de type FSOUND_SAMPLE
              public:
              void debutFmod(herts=44100,canaux=32);//je ne souvien plus trop mais tu pouras me corriger lol
              void chargerSon(const char *fichier);
              void jouerSon();//plus de parametre car tu utilisera m_son ^^
              void effacerSon();//FSOUND_Sample_Free(m_son);
              void finFmod();// FSOUND_Close();  ^^
              };


              dans ton main il te suffira de mettre SON son[5](exemple)
              //seul UNE variable ouvre Fmod,ferme Fmod (et peut servir de son)(j'utiliserais son[0] pour cette noble tache :lol:
              • Partager sur Facebook
              • Partager sur Twitter
                21 juin 2007 à 12:08:45

                Citation : neuneutrinos

                1) pourquois char* nomSon???


                C'est ce qu'il fait déja je crois non ?

                Citation : neuneutrinos

                2)encore mieux pourquois tu ne ferais pas...


                Utiliser une classe, c'est l'idée que j'ai déja proposé plus haut.
                Par contre quit à utiliser un tableau (mieux: un vecteur), mieux vaut en faire un de FSOUND_SAMPLE dans la classe, plutôt qu'un tableau de classe pour chaque son .. ça m'semble plus raisonnable non ?
                • Partager sur Facebook
                • Partager sur Twitter
                  21 juin 2007 à 12:24:50

                  c'est ce que j'ai fais dans l'exemple (mais si il veut vraiment utiliser un autre pointeur il ne faut pas mettre char* nomSon mais FSOUND_SAMPLE*
                  (j'ai l'impression de me repeter ^^ )
                  de toutes façon il n'y a pas 36 solutions ici avec les class donc on se repete un peu... :lol:





                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 juin 2007 à 18:39:55

                    Merci beaucoup pour vos conseils que je vais m'empresser de suivre !! ^_^
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Problème avec f-mod pour lire les sons

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown