Partage
  • Partager sur Facebook
  • Partager sur Twitter

Spectre sonore

ca marche, mais sa bouffe

    23 août 2006 à 14:20:31

    Salut à tous !

    Voilà, j'ai réussi a créer le spectre sonore (au passage, un TP très utile pour réviser, bravo et merci à M@teo !) je l'ai également amélioré, ça marche aussi ! Le prblème, c'est qu'il bouffe plus de 50% du processeur, et j'ai beau cherché, je ne trouve pas ce qu'il explique cela, je vous donne le code pour que vous puissiez m'aider :

    (attention les yeux, c'est tout dans le main ! C'est pas une bonne chose à faire je sais :-° )



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



    #define LARGEUR_FENETRE         512
    #define HAUTEUR_FENETRE         400
    #define LARGEUR_SPECTRE         (LARGEUR_FENETRE / 2) - 10
    #define HAUTEUR_SPECTRE         400
    #define RATIO                   (HAUTEUR_FENETRE/255.0)
    #define DELAI_RAFFRAICHISSEMENT 25

    #define SON_OFF                 0
    #define SON_FAIBLE              50
    #define SON_MOYEN               100
    #define SON_ELEVE               150
    #define SON_MAX                 200


    void setPixel(SDL_Surface *surface, int x, int y, Uint32 pixel);

    int main(int argc, char *argv[])
    {

        float *spectre = NULL;
        int tempsActuel = 0, tempsPrecedent = 0, tempsPrecedent2 = 0, hauteurBarre = 0;
        int i = 0, j = 0;
        int choix = 1;
        long Volume = 100;
        long compteur = 0;
        long nbreDizaineMinute = 0, nbreUniteMinute = 0, nbreDizaineSeconde = 0, nbreUniteSeconde = 0;
        char niveauVolume[30] = "";
        char temps[30] = "";

        FSOUND_Init(44100, 32, 0);
        FSOUND_STREAM *musique = NULL;
        musique = FSOUND_Stream_Open("hype_home.mp3", 0, 0, 0);
        FSOUND_Stream_Play(FSOUND_FREE, musique);
        FSOUND_SetVolume(FSOUND_ALL, SON_MAX); /* changer le volume */

        FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 1);/*on active le module DSP*/

        SDL_Surface *ecran = NULL, *texte = NULL;
        SDL_Color couleurNoire = {0, 0, 0};
        SDL_Color couleurBlanche = {255, 255, 255};
        SDL_Init(SDL_INIT_VIDEO);
        ecran = SDL_SetVideoMode(LARGEUR_FENETRE,HAUTEUR_FENETRE,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Spectre sonore", NULL);
        SDL_Rect positionTexte;

        TTF_Init();
        TTF_Font *police = NULL;
        police = TTF_OpenFont("arial.ttf", 20);
        TTF_SetFontStyle(police, TTF_STYLE_ITALIC | TTF_STYLE_UNDERLINE);


        SDL_WarpMouse(ecran->w/2, ecran->h/2);

         int continuer = 1;
        SDL_Event event;
        while (continuer)
        {
            FSOUND_Stream_SetLoopCount(musique, -1); /* répéter une musique, -1 veut dire à l'infini)*/
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;

                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {

                         case SDLK_KP0 :
                        FSOUND_SetVolume(FSOUND_ALL, SON_OFF);
                        Volume = 0;
                        break;

                        case SDLK_KP1 :
                        FSOUND_SetVolume(FSOUND_ALL, SON_FAIBLE);
                        Volume = 25;
                        break;

                        case SDLK_KP2 :
                        FSOUND_SetVolume(FSOUND_ALL, SON_MOYEN);
                        Volume = 50;
                        break;

                        case SDLK_KP3 :
                        FSOUND_SetVolume(FSOUND_ALL, SON_ELEVE);
                        Volume = 75;
                        break;

                        case SDLK_KP4 :
                        FSOUND_SetVolume(FSOUND_ALL, SON_MAX);
                        Volume = 100;
                        break;

                        case SDLK_SPACE:
                        if(choix == 1)
                        {
                            choix = 2;
                            FSOUND_Stream_Stop(musique);
                            musique = FSOUND_Stream_Open("DragonBall GT - Opening Theme.mp3", 0, 0, 0);
                            FSOUND_Stream_Play(FSOUND_FREE, musique);
                        }

                        else
                        {
                            choix = 1;
                            FSOUND_Stream_Stop(musique);
                            musique = FSOUND_Stream_Open("hype_home.mp3", 0, 0, 0);
                            FSOUND_Stream_Play(FSOUND_FREE, musique);
                        }
                        break;

                    }
                break;

            }
        /* on efface l'écran quand on veut dessiner*/
         SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));

        /*on endort le programme 25ms*/
        tempsActuel = SDL_GetTicks();
            if (tempsActuel - tempsPrecedent < DELAI_RAFFRAICHISSEMENT)
            {
                SDL_Delay(DELAI_RAFFRAICHISSEMENT - (tempsActuel - tempsPrecedent));
            }
            tempsPrecedent = SDL_GetTicks();

        //actualise le compteur
        compteur += 25;

        if(compteur == 1000)
        {
            nbreUniteSeconde++;
            compteur = 0;
        }

        if(nbreUniteSeconde ==10)
        {
            nbreUniteSeconde = 0;
            nbreDizaineSeconde++;
        }

        if(nbreDizaineSeconde ==6)
        {
            nbreDizaineSeconde = 0;
            nbreUniteMinute++;
        }

        if(nbreUniteMinute == 10)
        {
            nbreUniteMinute = 0;
            nbreDizaineMinute++;
        }


        spectre = FSOUND_DSP_GetSpectrum();

        SDL_LockSurface(ecran);

        /*on parcourt la fenêtre en largeur*/
        for(i = 0; i < LARGEUR_SPECTRE ; i++)
        {
            hauteurBarre = spectre[i*2] * 4 * HAUTEUR_SPECTRE;
            if (hauteurBarre > HAUTEUR_SPECTRE)
            hauteurBarre = HAUTEUR_SPECTRE;

            /* on parcourt la fenêtre sur la hauteur pour dessiner la hauteur des barres*/
            for ( j = HAUTEUR_SPECTRE - hauteurBarre ; j < HAUTEUR_SPECTRE ; j++)
            {
                setPixel(ecran, i, j, SDL_MapRGB(ecran->format, 255 - (j / RATIO), j / RATIO, 0));
                SDL_UnlockSurface(ecran);
            }
        }

        if(choix == 1)
        texte = TTF_RenderText_Shaded(police, "hype_home.mp3", couleurBlanche, couleurNoire);

        else
        texte = TTF_RenderText_Shaded(police, "DragonBall GT - Opening Theme.mp3", couleurBlanche, couleurNoire);


        positionTexte.x = LARGEUR_SPECTRE +20;
        positionTexte.y = 20;
        SDL_BlitSurface(texte, NULL, ecran, &positionTexte);

        positionTexte.x = LARGEUR_SPECTRE +20;
        positionTexte.y = 100;
        sprintf(niveauVolume,  "Volume : %d%%", Volume);
        texte = TTF_RenderText_Shaded (police, niveauVolume, couleurBlanche, couleurNoire);
        SDL_BlitSurface(texte, NULL, ecran, &positionTexte);

        positionTexte.x = LARGEUR_SPECTRE +20;
        positionTexte.y = 150;
        sprintf(temps, "%d%d : %d%d", nbreDizaineMinute, nbreUniteMinute, nbreDizaineSeconde, nbreUniteSeconde);
        texte = TTF_RenderText_Shaded (police, temps, couleurBlanche, couleurNoire);
        SDL_BlitSurface(texte, NULL, ecran, &positionTexte);

        SDL_Flip(ecran);
    }
        SDL_FreeSurface(ecran);
        SDL_FreeSurface(texte);


        TTF_CloseFont(police);
        TTF_Quit();

        FSOUND_Stream_Close(musique);
        FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 0);
        FSOUND_Close();

        SDL_Quit();

        return EXIT_SUCCESS;

    }

    /* La fonction setPixel permet de dessiner pixel par pixel dans une surface */
    void setPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
    {
        int bpp = surface->format->BytesPerPixel;

        Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

        switch(bpp) {
        case 1:
            *p = pixel;
            break;

        case 2:
            *(Uint16 *)p = pixel;
            break;

        case 3:
            if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
                p[0] = (pixel >> 16) & 0xff;
                p[1] = (pixel >> 8) & 0xff;
                p[2] = pixel & 0xff;
            } else {
                p[0] = pixel & 0xff;
                p[1] = (pixel >> 8) & 0xff;
                p[2] = (pixel >> 16) & 0xff;
            }
            break;

        case 4:
            *(Uint32 *)p = pixel;
            break;
        }
    }


    Est-ce un problème de code ou dois-je passer au C++ ? (chose déjà faite d'ailleurs :p , sauf que c'est plus compliqué que M@teo :( )
    • Partager sur Facebook
    • Partager sur Twitter
      23 août 2006 à 20:21:55

      Pourquoi tu 'Unlock' ta surface screen dans une boucle for? :-°
      Ensuite à chaque tour de boucle il doit recreer tes surfaces-textes alors que ceux-ci n'ont probablement pas changés..
      • Partager sur Facebook
      • Partager sur Twitter
        24 août 2006 à 16:27:55

        Hé bien pour répondre simplement, c'est comme ça que M@teo à fait, ce qui veut dire que c'est la façon de faire.

        Au fait, j'ai oublié de dire que que comme il rame beaucoup, les secondes s'écoulent beaucoup plus lentement, et c'est très embêtant.
        • Partager sur Facebook
        • Partager sur Twitter
          24 août 2006 à 16:30:33

          Citation : Racksha

          Hé bien pour répondre simplement, c'est comme ça que M@teo à fait, ce qui veut dire que c'est la façon de faire.


          justement non, mateo unlock la surface après la boucle for
                  for (i = 0 ; i < LARGEUR_FENETRE ; i++)
                  {
                      hauteurBarre = spectre[i] * 4 * HAUTEUR_FENETRE;

                      if (hauteurBarre > HAUTEUR_FENETRE)
                          hauteurBarre = HAUTEUR_FENETRE;

                      for (j = HAUTEUR_FENETRE - hauteurBarre ; j < HAUTEUR_FENETRE ; j++)
                      {
                          setPixel(ecran, i, j, SDL_MapRGB(ecran->format, 255 - (j / RATIO), j / RATIO, 0));
                      }
                  }

                  SDL_UnlockSurface(ecran); /* On a fini de travailler sur l'écran, on débloque la surface */

                  SDL_Flip(ecran);
          • Partager sur Facebook
          • Partager sur Twitter
            24 août 2006 à 16:37:32

            Ah oui t'a raison ! J'ai mal regardé son code ! Je suis vraiment désolé de t'avoir répondu comme ca Kerwando :(

            Par contre, j'ai toujours le même problème, ca prend toujours plus de la moitié du processeur à lui tout seul et je comprend toujours pas.
            • Partager sur Facebook
            • Partager sur Twitter

            Spectre sonore

            × 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