Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Visualisation spectrale du son

Sujet résolu
    7 août 2006 à 20:47:15

    Bonsoir,

    J'ai voulu faire le TP proposer par M@teo mais mon prog ne marche pas, Je veut juste afficher les barres de la même couleur en vert.


    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <FMOD/fmod.h>

    #define LARGEUR_FENETRE 512
    #define HAUTEUR_FENETRE 400



    int main(int argc, char *argv[])
    {
    SDL_Surface *ecran = NULL, *Surf[512]={NULL};
    FSOUND_STREAM *musique = NULL;
    SDL_Rect position;
    SDL_Event event;
    Uint32 couleur_verte = SDL_MapRGB(ecran->format, 0, 255, 0);
    int continuer=1;
    int i,hauteur,tempsActuel,tempsPrecedent;
    float *spectre=NULL;


    SDL_Init(SDL_INIT_VIDEO);
    FSOUND_Init(44100, 32, 0);

    //Activer le module DSP de FMOD
    FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 1);
    ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE );
    SDL_WM_SetCaption("Visualisation spectrale du son!!", NULL);

    musique = FSOUND_Stream_Open("sos.mp3", 0, 0, 0);
    FSOUND_Stream_Play(FSOUND_FREE, musique);


    while(continuer)
    {
        SDL_PollEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer=0;
                break;
        }


        tempsActuel = SDL_GetTicks();
        if (tempsActuel - tempsPrecedent < 25)
        {
            SDL_Delay(25 - (tempsActuel - tempsPrecedent));
        }
        tempsPrecedent = SDL_GetTicks();

        spectre = FSOUND_DSP_GetSpectrum();
        for(i=0;i<511;i++)
        {
            hauteur=spectre[i]*HAUTEUR_FENETRE*4;
            if(hauteur>HAUTEUR_FENETRE)
                hauteur=HAUTEUR_FENETRE;

            Surf[i]=SDL_CreateRGBSurface(SDL_HWSURFACE, 1, hauteur, 32, 0, 0, 0, 0);
            SDL_FillRect(Surf[i], NULL, couleur_verte);
            position.x=i;
            position.y=HAUTEUR_FENETRE;
            SDL_BlitSurface(Surf[i], NULL, ecran, &position);
        }
        SDL_Flip(ecran);
    }


    FSOUND_Stream_Stop(musique);
    FSOUND_Stream_Close(musique);
    //Désactiver le module DSP de FMOD
    FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 0);
    FSOUND_Close();
        for(i=0;i<511;i++)
            SDL_FreeSurface(Surf[i]);
    SDL_Quit();
    return EXIT_SUCCESS;
    }


    Je n'ai pas d'erreur de compilation, mais windows creer une erreur au lancement du programme. Pouvez vous m'aider à trouver mon erreur, s'il vous plait

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      7 août 2006 à 20:50:39

      Si tu ne veux pas que ton sujet ferme, mets les formules de politesses ;) c'est un conseil.
      • Partager sur Facebook
      • Partager sur Twitter
        7 août 2006 à 20:50:51

        Pourquoi diantre fais-tu ce que M@teo21 nous demande de ne pas faire?
        Une fonction qui dessine pixel par pixel est plus facile que 512 surfaces de 1 pixel de hauteur et largeur.
        Regarde la correction et tu comprendras.
        En espérant que le problème vienne de là.
        • Partager sur Facebook
        • Partager sur Twitter
          7 août 2006 à 21:00:32

          <span class="citation">Citation : M@teo</span><div class="citation2">Dans un premier temps, vous pouvez réaliser des barres de couleur unie. Vous pourrez donc créer des surfaces. Il devra y avoir 512 surfaces : une pour chaque barre. Chaque surface fera donc 1 pixel de large et la hauteur des surfaces variera en fonction de l'intensité de chaque fréquence.</div>


          Désolé mais je préférai faire le tp plutot que de regarder la correction, et effectivement dans la correction il utilise une fonction qui créer pixel par pixel, mais moi je voulais d'abord faire avec les 512 surface de couleur uni. Donc si quelqu'un voit mon erreur? merci

          De plus je ne crée pas 512 surface de 1*1 mais 512 surface de 1*hauteur(qui correspondà la quantité de la fréquence).








          Après quelque heure de debuggage de mon programme je vien de trouver les solutions. Je met la solution au cas ou ca interesserai qqun.
          J'était passer à coté de 3 ptits détails

          <span class="code">Code : C</span><div class="code2 c">Uint32 couleur_verte = SDL_MapRGB&#40;ecran->format, 0, 255, 0&#41;;</div>
          Je l'utilisai avant d'avoir initialiser la SDL.


          <span class="code">Code : C</span><div class="code2 c">int i,hauteur,tempsActuel=0,tempsPrecedent=0;</div>
          Je n'avais pas initialiser les valeur tampsActuel et temps précédent donc le programme se perdait lors de la soustraction if (tempsActuel - tempsPrecedent &lt; 25)


          <span class="code">Code : C</span><div class="code2 c">position.y=HAUTEUR_FENETRE-hauteur;</div>
          Et oui les surface etait bien creer mais en dessous de la fenetre :-°


          Je met le code complet corrigé


          #include <stdlib.h>
          #include <stdio.h>
          #include <SDL/SDL.h>
          #include <FMOD/fmod.h>

          #define LARGEUR_FENETRE 512
          #define HAUTEUR_FENETRE 400



          int main(int argc, char *argv[])
          {
          SDL_Surface *ecran = NULL, *Surf[512]={NULL};
          FSOUND_STREAM *musique = NULL;
          SDL_Rect position;
          SDL_Event event;
          int continuer=1;
          int i,hauteur,tempsActuel=0,tempsPrecedent=0;
          float *spectre=NULL;


          FSOUND_Init(44100, 32, 0);



          musique = FSOUND_Stream_Open("sos.mp3", 0, 0, 0);
          //Activer le module DSP de FMOD
          FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 1);
          FSOUND_Stream_Play(FSOUND_FREE, musique);

          SDL_Init(SDL_INIT_VIDEO);

          ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE );
          SDL_WM_SetCaption("Visualisation spectrale du son!!", NULL);
          Uint32 couleur_verte = SDL_MapRGB(ecran->format, 0, 255, 0);


          while(continuer)
          {
              SDL_PollEvent(&event);
              switch(event.type)
              {
                  case SDL_QUIT:
                      continuer=0;
                      break;
              }
              SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));


              tempsActuel = SDL_GetTicks();
              if (tempsActuel - tempsPrecedent < 25)
              {
                  SDL_Delay(25 - (tempsActuel - tempsPrecedent));
              }
              tempsPrecedent = SDL_GetTicks();

              spectre = FSOUND_DSP_GetSpectrum();
              for(i=0;i<511;i++)
              {
                  hauteur=spectre[i]*HAUTEUR_FENETRE*4;
                  if(hauteur>HAUTEUR_FENETRE)
                      hauteur=HAUTEUR_FENETRE;

                  Surf[i]=SDL_CreateRGBSurface(SDL_HWSURFACE, 1, hauteur, 32, 0, 0, 0, 0);
                  SDL_FillRect(Surf[i], NULL, couleur_verte);
                  position.x=i;
                  position.y=HAUTEUR_FENETRE-hauteur;
                  SDL_BlitSurface(Surf[i], NULL, ecran, &position);
              }
              SDL_Flip(ecran);


          }


          FSOUND_Stream_Stop(musique);
          FSOUND_Stream_Close(musique);
          //Désactiver le module DSP de FMOD
          FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 0);
          FSOUND_Close();
              for(i=0;i<511;i++)
                  SDL_FreeSurface(Surf[i]);
          SDL_Quit();
          return EXIT_SUCCESS;
          }



          • Partager sur Facebook
          • Partager sur Twitter

          [SDL] Visualisation spectrale du son

          × 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