Forum Clubic

[RESOLU][C] petit probleme de memoire - memoire vive "explose"

slt

alors je debute en c (et j adore), je viens de terminer les tutos de m@teo21 (qui sin géniaux)
et j’ai eu l envie de me lancer ds un plus “grand” projet.
j’essaye de faire un petit lecteur audio.

maintenat passons a mon probleme
il est simple et chiant:

je lance mon programme , jusque la tt va bien
et je me demande combien ca prend de memoire
donc ctrl-alt-delete

et la surprise je voit que la memoire vive utiliser par mon programme ne fait qu augmenter!!
c’est assez embetant puisque a un certain moment mon ordi commence a “ralentir” et donc ce programme devient inutilisable

j espere que vous aves compris je vais maintenat vous mon trer mon code c assez long je vous previens


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

#include "interface_graphique.h"
#include "player.h"

int main(int argc, char *argv[])
{
   
    FSOUND_Init(44100, 32, 0);
    SDL_Init(SDL_INIT_VIDEO);
   
 
    interface_graphique();
   
   
    SDL_Quit();
    FSOUND_Close();

    return EXIT_SUCCESS;
}


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

#include "interface_graphique.h"
#include "player.h"

#define DELAI_RAFRAICHISSEMENT  25

// pointeurs et variables necessaire au multiples foncyions du dossier

SDL_Surface *frequence = NULL, *ecran = NULL, *frequence_rouge = NULL, *temps = NULL, *restant = NULL, *titre_chanson = NULL;

SDL_Rect positionFond, positionFrequence, position;

TTF_Font *police = NULL, *police14 = NULL;

SDL_Color couleurNoire = {0, 0, 0};

float *spectre = NULL;

double resultat = 0.0;
long duree = 00, tempsQuiReste = 0, ratio = 0, playPause = 0, nbFichier = 0, debutChaine = 2;
char tempsChanson[10] = "", tempsRestant[10] = "", title_chanson[150] = "";
char* title;
int isPlaying = 0, deja = 0;

//fonction initialisation
void  interface_graphique()
{
      
      TTF_Init();//initialiastion TTF
      
      // initialisation des SDL surface
      SDL_Surface *fond = NULL, *barre_de_titre = NULL, *audioball_codename = NULL,*triball = NULL, *play = NULL;
      SDL_Surface *stop = NULL, *active = NULL, *baffle = NULL, *barreTemps = NULL, *barreDAvancement = NULL, *barreSon = NULL;
      SDL_Surface *son = NULL, *retour = NULL, *suivant = NULL, *change = NULL, *bibliotheque = NULL, *quitter = NULL;
      SDL_Surface *pause = NULL, *play_pause = NULL;
      
      SDL_Event event; // SDL evenement initialisation
      
      //SDL initialisation des position
      SDL_Rect positionBarreDeTitre, positionaudioball, positiontriball, positionplay, positionstop, positionactive;
      SDL_Rect positionbaffle, positionBarreTemps, positionBarreDAvancement, positionBarreSon, positionSon, positionRetour;
      SDL_Rect positionSuivant, positionChange, positionBibliotheque, positionQuitter, positionTemps, positionRestant;
      
      //variables
      int continuer = 1;
      
      long test = 1, tempsActuel = 0, tempsPrecedent, fin = 0, avancementAutoBarreTemps = 0;
      
      //definiton des positions
      
      positionFond.x = (1280 / 2) - (1000 / 2);
      positionFond.y =  1024 - 125;
      positionBarreDeTitre.x = positionFond.x + 130;
      positionBarreDeTitre.y = positionFond.y + 5;
      position.x = positionBarreDeTitre.x + 20;
      position.y = positionBarreDeTitre.y + 6;
      positionaudioball.x = 1280/2 - 100;
      positionaudioball.y = 1024/2 - 200;
      positiontriball.x = 1280/2 + 110;
      positiontriball.y = 1024/2 - 150;
      positionplay.x = positionFond.x + 3;
      positionplay.y = positionFond.y + 32;
      positionstop.x = positionFond.x + 68;
      positionstop.y = positionFond.y + 22;
      positionactive.x = positionFond.x + 108;
      positionactive.y = positionFond.y + 57;
      positionbaffle.x = positionFond.x + 538;
      positionbaffle.y = positionFond.y + 77;
      positionBarreTemps.x = positionFond.x + 159;
      positionBarreTemps.y = positionFond.y + 77;
      positionBarreDAvancement.x = positionFond.x + 161;
      positionBarreDAvancement.y = positionFond.y + 89;
      positionBarreSon.x = positionFond.x + 580;
      positionBarreSon.y = positionFond.y + 30;
      positionSon.x = positionFond.x + 572;
      positionSon.y = positionFond.y + 27;
      positionRetour.x = positionFond.x + 2;
      positionRetour.y = positionFond.y + 95;
      positionSuivant.x = positionFond.x + 58;
      positionSuivant.y = positionFond.y + 95;
      positionChange.x = positionFond.x + 920;
      positionChange.y = positionFond.y + 22;
      positionBibliotheque.x = positionFond.x + 855;
      positionBibliotheque.y = positionFond.y + 32;
      positionQuitter.x = positionFond.x + 960;
      positionQuitter.y = positionFond.y + 57;
      positionTemps.x = positionFond.x + 126;
      positionTemps.y = positionFond.y + 82;
      positionRestant.x = positionFond.x + 495;
      positionRestant.y = positionFond.y + 82;
      
      //chargement fenetre
      ecran = SDL_SetVideoMode (1280, 1024, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
      SDL_WM_SetCaption ("version de recherche d un programme de lecture audio", NULL);
      
      //chargement des images
      fond = IMG_Load ("fond.bmp");
      SDL_SetColorKey(fond, SDL_SRCCOLORKEY, SDL_MapRGB(fond->format, 253, 215, 215));
      barre_de_titre = IMG_Load ("barre_de_titre.bmp");
      SDL_SetColorKey(barre_de_titre, SDL_SRCCOLORKEY, SDL_MapRGB(barre_de_titre->format, 253, 215, 215));
      SDL_SetAlpha(barre_de_titre, SDL_SRCALPHA, 128);
      audioball_codename = IMG_Load ("audioball_codename.bmp");
      triball = IMG_Load ("triball.bmp");
      SDL_SetColorKey(triball, SDL_SRCCOLORKEY, SDL_MapRGB(triball->format, 253, 215, 215));
      play = IMG_Load ("play.bmp");
      SDL_SetColorKey(play, SDL_SRCCOLORKEY, SDL_MapRGB(play->format, 255, 255, 255));
      SDL_SetAlpha(play, SDL_SRCALPHA, 200);
      stop = IMG_Load ("stop.bmp");
      SDL_SetColorKey(stop, SDL_SRCCOLORKEY, SDL_MapRGB(stop->format, 255, 255, 255));
      SDL_SetAlpha(stop, SDL_SRCALPHA, 200);
      active = IMG_Load ("active.bmp");
      SDL_SetColorKey(active, SDL_SRCCOLORKEY, SDL_MapRGB(active->format, 255, 255, 255));
      SDL_SetAlpha(active, SDL_SRCALPHA, 200);
      baffle = IMG_Load ("baffle.bmp");
      SDL_SetColorKey(baffle, SDL_SRCCOLORKEY, SDL_MapRGB(baffle->format, 255, 255, 255));
      barreTemps = IMG_Load ("barre_temps.bmp");
      SDL_SetColorKey(barreTemps, SDL_SRCCOLORKEY, SDL_MapRGB(barreTemps->format, 255, 255, 255));
      SDL_SetAlpha(barreTemps, SDL_SRCALPHA, 200);
      barreDAvancement = SDL_CreateRGBSurface(SDL_HWSURFACE, 328, 1, 32, 0, 0, 0, 0);
      SDL_FillRect(barreDAvancement, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
      barreSon = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, 75, 32, 0, 0, 0, 0);
      SDL_FillRect(barreSon, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
      son = IMG_Load ("son.bmp");
      SDL_SetColorKey(son, SDL_SRCCOLORKEY, SDL_MapRGB(son->format, 255, 255, 255));
      SDL_SetAlpha(son, SDL_SRCALPHA, 200);
      retour = IMG_Load ("retour.bmp");
      SDL_SetColorKey(retour, SDL_SRCCOLORKEY, SDL_MapRGB(retour->format, 255, 255, 255));
      SDL_SetAlpha(retour, SDL_SRCALPHA, 200);
      suivant = IMG_Load ("suivant.bmp");
      SDL_SetColorKey(suivant, SDL_SRCCOLORKEY, SDL_MapRGB(suivant->format, 255, 255, 255));
      SDL_SetAlpha(suivant, SDL_SRCALPHA, 200);
      change = IMG_Load ("change.bmp");
      SDL_SetColorKey(change, SDL_SRCCOLORKEY, SDL_MapRGB(change->format, 255, 255, 255));
      SDL_SetAlpha(change, SDL_SRCALPHA, 200);
      bibliotheque = IMG_Load ("bibliotheque.bmp");
      SDL_SetColorKey(bibliotheque, SDL_SRCCOLORKEY, SDL_MapRGB(bibliotheque->format, 255, 255, 255));
      SDL_SetAlpha(bibliotheque, SDL_SRCALPHA, 200);
      quitter = IMG_Load ("active.bmp");
      SDL_SetColorKey(quitter, SDL_SRCCOLORKEY, SDL_MapRGB(quitter->format, 255, 255, 255));
      SDL_SetAlpha(quitter, SDL_SRCALPHA, 200);
      frequence = IMG_Load ("frequence.bmp");
      SDL_SetAlpha(frequence, SDL_SRCALPHA, 160);
      frequence_rouge = IMG_Load ("frequence_rouge.bmp");
      SDL_SetAlpha(frequence_rouge, SDL_SRCALPHA, 160);
      
      
      play_pause = IMG_Load ("play.bmp");
      SDL_SetColorKey(play_pause, SDL_SRCCOLORKEY, SDL_MapRGB(play_pause->format, 255, 255, 255));
      SDL_SetAlpha(play_pause, SDL_SRCALPHA, 200);
      pause = IMG_Load ("pause.bmp");
      SDL_SetColorKey(pause, SDL_SRCCOLORKEY, SDL_MapRGB(pause->format, 255, 255, 255));
      SDL_SetAlpha(pause, SDL_SRCALPHA, 200);
      
      //chargement des polices
      police = TTF_OpenFont("arial.ttf", 12);
      police14 = TTF_OpenFont("arial.ttf", 14);
      
      
      
      
      //ouverture boucle principale
      while (continuer)
      {
           
         nbFichier = nombreDeFichier();
   
         SDL_PollEvent(&event);// chargement de SDL evenement
         
         switch(event.type)//condition des differents evenement...
         {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_MOUSEMOTION://...par rapport a la position de la souris
                if (event.button.x >= positionFond.x + 10 && event.button.x <= positionFond.x + 67 && event.button.y >= positionFond.y + 39 && event.button.y <= positionFond.y + 93)
                {
                       SDL_SetAlpha(play, SDL_SRCALPHA, 255);
                }
                else if (event.button.x >= positionFond.x + 73 && event.button.x <= positionFond.x + 111 && event.button.y >= positionFond.y + 27 && event.button.y <= positionFond.y + 64)
                {
                       SDL_SetAlpha(stop, SDL_SRCALPHA, 255);
                }
                else if (event.button.x >= positionFond.x + 112 && event.button.x <= positionFond.x + 130 && event.button.y >= positionFond.y + 60 && event.button.y <= positionFond.y + 79)
                {
                       SDL_SetAlpha(active, SDL_SRCALPHA, 255);
                }
                else if (event.button.x >= positionBarreTemps.x && event.button.x <= positionBarreTemps.x + 35 && event.button.y >= positionBarreTemps.y && event.button.y <= positionBarreTemps.y + 20)
                {                
                       SDL_SetAlpha(barreTemps, SDL_SRCALPHA, 255);
                }
                else if (event.button.x >= positionSon.x + 1 && event.button.x <= positionSon.x + 14 && event.button.y + 1 >= positionSon.y && event.button.y <= positionSon.y + 14)
                {                
                        SDL_SetAlpha(son, SDL_SRCALPHA, 255);
                }
                else if (event.button.x >= positionFond.x + 3 && event.button.x <= positionFond.x + 20 && event.button.y >= positionFond.y + 96 && event.button.y <= positionFond.y + 114)
                {
                       SDL_SetAlpha(retour, SDL_SRCALPHA, 255);
                }
                else if (event.button.x >= positionFond.x + 59 && event.button.x <= positionFond.x + 76 && event.button.y >= positionFond.y + 96 && event.button.y <= positionFond.y + 114)
                {
                       SDL_SetAlpha(suivant, SDL_SRCALPHA, 255);
                }
                else if (event.button.x >= positionFond.x + 862 && event.button.x <= positionFond.x + 919 && event.button.y >= positionFond.y + 39 && event.button.y <= positionFond.y + 93)
                {
                       SDL_SetAlpha(bibliotheque, SDL_SRCALPHA, 255);
                }
                else if (event.button.x >= positionFond.x + 925 && event.button.x <= positionFond.x + 963 && event.button.y >= positionFond.y + 27 && event.button.y <= positionFond.y + 64)
                {
                       SDL_SetAlpha(change, SDL_SRCALPHA, 255);
                }
                else if (event.button.x >= positionFond.x + 964 && event.button.x <= positionFond.x + 982 && event.button.y >= positionFond.y + 60 && event.button.y <= positionFond.y + 79)
                {
                       SDL_SetAlpha(quitter, SDL_SRCALPHA, 255);
                }
                
                else
                {
                       SDL_SetAlpha(play, SDL_SRCALPHA, 200);
                       SDL_SetAlpha(stop, SDL_SRCALPHA, 200);
                       SDL_SetAlpha(active, SDL_SRCALPHA, 200);
                       SDL_SetAlpha(barreTemps, SDL_SRCALPHA, 200);
                       SDL_SetAlpha(son, SDL_SRCALPHA, 200);
                       SDL_SetAlpha(retour, SDL_SRCALPHA, 200);
                       SDL_SetAlpha(suivant, SDL_SRCALPHA, 200);
                       SDL_SetAlpha(quitter, SDL_SRCALPHA, 200);
                       SDL_SetAlpha(bibliotheque, SDL_SRCALPHA, 200);
                       SDL_SetAlpha(change, SDL_SRCALPHA, 200);
                }                   
                break;
            case SDL_MOUSEBUTTONDOWN://...si on clique
                if (test == 2 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 159 && event.button.x <= positionFond.x + 459 && event.button.y >= positionFond.y + 77 && event.button.y <= positionFond.y + 97) 
                {//POSITION PISTE
                        positionBarreTemps.x =  event.button.x - 14;
                        controle_position(positionFond.x, event.button.x, ratio);
                        
                }
                else if (test == 2 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 460 && event.button.x <= positionFond.x + 487 && event.button.y >= positionFond.y + 77 && event.button.y <= positionFond.y + 97) 
                {//POSITION PISTE
                        positionBarreTemps.x =  positionFond.x + 444;
                        controle_position(positionFond.x, event.button.x, ratio);
                }
                else if (test == 2 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 157 && event.button.x <= positionFond.x + 158 && event.button.y >= positionFond.y + 77 && event.button.y <= positionFond.y + 97) 
                {//POSITION PISTE
                        positionBarreTemps.x =  positionFond.x + 173;
                        controle_position(positionFond.x, event.button.x, ratio);
                }
                else if (event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionSon.x + 1 && event.button.x <= positionSon.x + 14 && event.button.y >= positionFond.y + 27 && event.button.y <= positionFond.y + 89) 
                {//VOLUME
                        positionSon.y =  event.button.y - 7;
                        
                        controle_volume(positionFond.y, event.button.y);
                }
                else if (event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionSon.x + 1 && event.button.x <= positionSon.x + 14 && event.button.y >= positionFond.y + 90 && event.button.y <= positionFond.y + 108) 
                {//VOLUME
                        positionSon.y =  positionFond.y + 91;
                        controle_volume(positionFond.y, event.button.y);
                }
                else if (event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionSon.x + 1 && event.button.x <= positionSon.x + 14 && event.button.y >= positionFond.y + 23 && event.button.y <= positionFond.y + 26) 
                {//VOLUME
                        positionSon.y =  positionFond.y + 27;
                        controle_volume(positionFond.y, event.button.y);
                }
                else if (test == 1 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 10 && event.button.x <= positionFond.x + 67 && event.button.y >= positionFond.y + 39 && event.button.y <= positionFond.y + 93)
                {//PLAY INITIALISATION
           
                        initialisation(test, debutChaine);
                        play = pause;
                        
                        playPause = 1;    
                        test = 2;
                        deja = 1;
         
                }
                else if (test == 2 && debutChaine < nbFichier - 1 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 59 && event.button.x <= positionFond.x + 76 && event.button.y >= positionFond.y + 96 && event.button.y <= positionFond.y + 114)
                {//SUIVANT
                        action_stop();
                        test = 1;
                        positionBarreTemps.x = positionFond.x + 159;
                        
                        play = play_pause;
                        playPause = 0;
                        
                        debutChaine++;
                        initialisation(test, debutChaine);
                        play = pause;
                        
                        playPause = 1;    
                        test = 2;
                }
                else if (test == 2 && debutChaine > 2 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 3 && event.button.x <= positionFond.x + 20 && event.button.y >= positionFond.y + 96 && event.button.y <= positionFond.y + 114)
                {//RETOUR
                       action_stop();
                        test = 1;
                        positionBarreTemps.x = positionFond.x + 159;
                        
                        play = play_pause;
                        playPause = 0;
                        
                        debutChaine--;
                        initialisation(test, debutChaine);
                        play = pause;
                        
                        playPause = 1;    
                        test = 2;
                }
                else if (test == 2 && debutChaine == 2 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 3 && event.button.x <= positionFond.x + 20 && event.button.y >= positionFond.y + 96 && event.button.y <= positionFond.y + 114)
                {//RETOUR CHANSON 1
                        action_stop();
                        test = 1;
                        positionBarreTemps.x = positionFond.x + 159;
                        
                        play = play_pause;
                        playPause = 0;
                           
                        initialisation(test, debutChaine);
                        play = pause;
                        
                        playPause = 1;    
                        test = 2;
                }
                else if (test == 2 && debutChaine > 2 && duree >= 20000 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 3 && event.button.x <= positionFond.x + 20 && event.button.y >= positionFond.y + 96 && event.button.y <= positionFond.y + 114)
                {//retour
                        action_stop();
                        test = 1;
                        positionBarreTemps.x = positionFond.x + 159;
                        
                        play = play_pause;
                        playPause = 0;
                        deja = 0;
                           
                        initialisation(test, debutChaine);
                        play = pause;
                        
                        playPause = 1;    
                        test = 2;
                        deja = 1;
                }
                else if (test == 2 && event.button.button == SDL_BUTTON_LEFT && event.button.x >= positionFond.x + 10 && event.button.x <= positionFond.x + 67 && event.button.y >= positionFond.y + 39 && event.button.y <= positionFond.y + 93 )
                {//PLAY-PAUSE
  
                        action_play();
                        if ( playPause == 1)
                        {
                             play = play_pause;
                             playPause = 0;
                        }
                        else
                        {
                             play = pause;
                             playPause = 1;
                        }
     
                }
                else if (event.button.x >= positionFond.x + 73 && event.button.button == SDL_BUTTON_LEFT && event.button.x <= positionFond.x + 111 && event.button.y >= positionFond.y + 27 && event.button.y <= positionFond.y + 64)
                {//STOP
                        action_stop();
                        test = 1;
                        positionBarreTemps.x = positionFond.x + 159;
                        
                        play = play_pause;
                        playPause = 0;
                        deja = 0;
                        
                        
                }
                else if (event.button.x >= positionFond.x + 964 && event.button.button == SDL_BUTTON_LEFT && event.button.x <= positionFond.x + 982 && event.button.y >= positionFond.y + 60 && event.button.y <= positionFond.y + 79)
                {
                       continuer = 0;
                } 
                break;
            case SDL_KEYDOWN://...avec le clavier
                switch (event.key.keysym.sym)
                {
                    case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */
                        continuer = 0;
                        break;
                }
                break;
                
                     
         }
         tempsActuel = SDL_GetTicks();// ici on fait la pause de 25 ms pour decharger le proceceur
         if (tempsActuel - tempsPrecedent < DELAI_RAFRAICHISSEMENT)
         {
             SDL_Delay(DELAI_RAFRAICHISSEMENT - (tempsActuel - tempsPrecedent));
         }
         tempsPrecedent = SDL_GetTicks();
         
         SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));// effaçage de l écran 
         
         isPlaying = playing ();//est-ce en lecture ??
         
         //chargement du titre
         if (test == 2)
         sprintf(title_chanson, "%s", titre());
         
         
         titre_chanson = TTF_RenderText_Blended(police14, title_chanson, couleurNoire);
         
         if (duree == fin && debutChaine < nbFichier - 1 && deja == 1)//la chanson est fini? on passe a la suivante alors
         {
                        
                        debutChaine++;
                        
                        action_stop();
                        test = 1;
                        positionBarreTemps.x = positionFond.x + 159;
                        
                        play = play_pause;
                        playPause = 0;

                        initialisation(test, debutChaine);
                        play = pause;
                   
                        playPause = 1;    
                        test = 2;
         }
         else if (duree == fin && debutChaine == nbFichier - 1)//la chanson est finie et c'est la derniere alors STOP
         {
                        action_stop();
                        test = 1;
                        positionBarreTemps.x = positionFond.x + 159;
                        
                        play = play_pause;
                        playPause = 0;
                        
                        debutChaine = 2;
                        deja = 0;
         }
         if (test == 2)// si la chanson est demare, alors on lance les fonctions suivantes, ki servent a voir le temps total et accompli de la musique
         {
             fin = fin_musique();
             duree = duree_musique();             
         }
         ratio = fin /328;//calcul du ratio 
 
         
         tempsQuiReste = fin - duree;//analyse du temps restant
         
         if ( test == 2)//positionnement automatique de la barre d'avancement
         {
             avancementAutoBarreTemps = duree / (fin/300);
             positionBarreTemps.x = positionFond.x + 173 - 14 + avancementAutoBarreTemps;
         }
 
 // blitage des surfaces
         SDL_BlitSurface(fond, NULL, ecran, &positionFond);
         SDL_BlitSurface(barre_de_titre, NULL, ecran, &positionBarreDeTitre);
         SDL_BlitSurface(audioball_codename, NULL, ecran, &positionaudioball);
         SDL_BlitSurface(triball, NULL, ecran, &positiontriball);
         SDL_BlitSurface(play, NULL, ecran, &positionplay);
         SDL_BlitSurface(stop, NULL, ecran, &positionstop);
         SDL_BlitSurface(active, NULL, ecran, &positionactive);
         SDL_BlitSurface(baffle, NULL, ecran, &positionbaffle);
         SDL_BlitSurface(barreDAvancement, NULL, ecran, &positionBarreDAvancement);
         SDL_BlitSurface(barreTemps, NULL, ecran, &positionBarreTemps);
         SDL_BlitSurface(barreSon, NULL, ecran, &positionBarreSon);
         SDL_BlitSurface(son, NULL, ecran, &positionSon);
         SDL_BlitSurface(retour, NULL, ecran, &positionRetour);
         SDL_BlitSurface(suivant, NULL, ecran, &positionSuivant);
         SDL_BlitSurface(change, NULL, ecran, &positionChange);
         SDL_BlitSurface(bibliotheque, NULL, ecran, &positionBibliotheque);
         SDL_BlitSurface(quitter, NULL, ecran, &positionQuitter);  
         
         if (test == 2)//si chanson en cours, alors on affiche le temps restant et accompli
         {
             position_temps_chanson(duree, fin);
             position_temps_restant(tempsQuiReste);     
         }
         else if (test == 1)//sinon on affiche 00:00
         {
             temps = TTF_RenderText_Blended(police, "00:00", couleurNoire);
             restant = TTF_RenderText_Blended(police, "00:00", couleurNoire); 
         } 
  
         if (test == 2)//si la chanson est en cours, alors on affiche le spectre sonore
         {
              affichage();
         }
          
         SDL_BlitSurface(temps, NULL, ecran, &positionTemps);//on blite ces deux surface du temps
         SDL_BlitSurface(restant, NULL, ecran, &positionRestant);
         SDL_BlitSurface(titre_chanson, NULL, ecran, &position);
         SDL_Flip(ecran);// et enfin on affiche l écran
      
      }
      
      //on libere la memoire
      SDL_FreeSurface(ecran);
      SDL_FreeSurface(fond);
      SDL_FreeSurface(barre_de_titre);
      SDL_FreeSurface(audioball_codename);
      SDL_FreeSurface(triball);
      SDL_FreeSurface(play); 
      SDL_FreeSurface(stop);
      SDL_FreeSurface(active);
      SDL_FreeSurface(baffle);
      SDL_FreeSurface(barreTemps);
      SDL_FreeSurface(barreDAvancement);
      SDL_FreeSurface(barreSon); 
      SDL_FreeSurface(son);     
      SDL_FreeSurface(retour);
      SDL_FreeSurface(suivant);
      SDL_FreeSurface(quitter);     
      SDL_FreeSurface(bibliotheque);
      SDL_FreeSurface(change);
      SDL_FreeSurface(frequence);
      SDL_FreeSurface(frequence_rouge);
      SDL_FreeSurface(temps);
      SDL_FreeSurface(restant);
      SDL_FreeSurface(titre_chanson);

      liberation_memoire();  
      
      TTF_CloseFont(police);//et on ferme la police et ttf
      TTF_Quit(); 
      
}

void affichage()//fonction qui gère le spectre
{
      
   long a = 0, b = 600, c = 0, d = 0, e = 0;
    
   spectre = FSOUND_DSP_GetSpectrum();
   while(d < 8)
   {  
      positionFrequence.x = positionFond.x + b;
            
      while ( a < 64)
      {
            resultat = resultat + spectre[e];
            a++;
            e++;    
            
      }
      resultat = resultat / 64;
      
      if (resultat <=0.01 && resultat > 0.001)
      {
            test_c(96);      
      }
      else if ( resultat > 0.01 && resultat <= 0.020)
      { 
            test_c(96);
            test_c(85);
      }
      else if ( resultat > 0.020 && resultat <= 0.035)
      { 
            test_c(96);
            test_c(85);
            test_c(74);
            
      }
      else if ( resultat > 0.035 && resultat <= 0.055)
      { 
            test_c(96);
            test_c(85);
            test_c(74);
            test_c(63);
      }
      else if ( resultat > 0.055 && resultat <= 0.080)
      { 
            test_c(96);
            test_c(85);
            test_c(74);
            test_c(63);
            test_c(52);
      }
      else if ( resultat > 0.08 && resultat <= 0.105)
      { 
            test_c(96);
            test_c(85);
            test_c(74);
            test_c(63);
            test_c(52);
            test_c(41);
      }
      else if ( resultat > 0.105 && resultat <= 0.125)
      { 
            test_c(96);
            test_c(85);
            test_c(74);
            test_c(63);
            test_c(52);
            test_c(41);
            test_c_rouge(30); 
      }  
      else if ( resultat > 0.125 && resultat <= 0.250)
      { 
            test_c(96);
            test_c(85);
            test_c(74);
            test_c(63);
            test_c(52);
            test_c(41);
            test_c_rouge(30);
            test_c_rouge(19);
      }
      else if ( resultat > 0.250 && resultat <= 1.0)
      { 
            test_c(96);
            test_c(85);
            test_c(74);
            test_c(63);
            test_c(52);
            test_c(41);
            test_c_rouge(30);
            test_c_rouge(19);
            test_c_rouge(8);
      }
      resultat = 0;
      a = 0;
      b = b + 30;
      d++;
   }              
     
}

void position_temps_chanson (long milliseconde, long fin)//fonction qui calcul ou en est la chanson et l affiche en mm:ss
{
     long seconde = 0, minute = 0, time = 0;
     time = milliseconde / 1000;
     minute = time / 60;
     seconde = time % 60;
     
     if (minute < 10 && seconde > 9)
     {
          sprintf(tempsChanson, "0%d:%d", minute, seconde);;     
     }
     else if (minute > 9 && seconde < 10)
     {
          sprintf(tempsChanson, "%d:0%d", minute, seconde);      
     }
     else if (minute < 10 && seconde < 10)
     {
          sprintf(tempsChanson, "0%d:0%d", minute, seconde);      
     }
     else 
     {
          sprintf(tempsChanson, "%d:%d", minute, seconde);      
     }
     
     temps = TTF_RenderText_Blended(police, tempsChanson, couleurNoire);
}

void position_temps_restant (long milliseconde)//idem sauf ke c'est ce qu'il en reste
{
     long seconde = 0, minute = 0, time = 0;
     time = milliseconde / 1000;
     minute = time / 60;
     seconde = time % 60;
     
     if (minute < 10 && seconde > 9)
     {
          sprintf(tempsRestant, "0%d:%d", minute, seconde);      
     }
     else if (minute > 9 && seconde < 10)
     {
          sprintf(tempsRestant, "%d:0%d", minute, seconde);      
     }
     else if (minute < 10 && seconde < 10)
     {
          sprintf(tempsRestant, "0%d:0%d", minute, seconde);      
     }
     else
     {
          sprintf(tempsRestant, "%d:%d", minute, seconde);      
     }
     
     restant = TTF_RenderText_Blended(police, tempsRestant, couleurNoire);
}
void test_c (long c)
{
            positionFrequence.y = positionFond.y + c;
            SDL_BlitSurface(frequence, NULL, ecran, &positionFrequence);
}
void test_c_rouge (long c)
{
            positionFrequence.y = positionFond.y + c;
            SDL_BlitSurface(frequence_rouge, NULL, ecran, &positionFrequence);
}


#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>
#include <FMOD/fmod.h>
#include <dirent.h>
#include <sys/types.h>
#include <string.h>

#include "interface_graphique.h"
#include "player.h"

#define THE_DIR "testMusique"

FSOUND_STREAM *musique = NULL;
FSOUND_SAMPLE *titre_de_la_chanson = NULL;

struct dirent * dirData;
long i = 0;
          
void action_play()
{     
     if (FSOUND_GetPaused(1)) // Si la chanson est en pause
            FSOUND_SetPaused(FSOUND_ALL, 0); // On enlève la pause
     else // Sinon, elle est en cours de lecture
            FSOUND_SetPaused(FSOUND_ALL, 1); // On met en pause     
}

long initialisation(long action, long j)
{     
     
     DIR * TheDir;
     TheDir = opendir(THE_DIR);
       
     i = telldir (TheDir);
     seekdir (TheDir, i + j);
     dirData = readdir(TheDir);
     
     char chaine2[150] =  "testMusique/";
     strcat(chaine2, dirData->d_name);               
     
     musique = FSOUND_Stream_Open(("%s", chaine2), 0, 0, 0);
     FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 1);
     FSOUND_Stream_Play(FSOUND_FREE, musique);
     closedir(TheDir);
     
     return 2; 
}

void action_stop()
{     
     FSOUND_Stream_Stop(musique); 
     FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 0);
     FSOUND_Stream_Close(musique);    
}

void liberation_memoire()
{
     
     FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 0);
     FSOUND_Stream_Close(musique);
     
}

void controle_volume(long positionFond_y, long positionSouris_y)
{    
     long x = 0, volume = 0;
     
     x = positionSouris_y - 23 - positionFond_y;
     x = 85 - x;
     volume = 3*x;
     FSOUND_SetVolume(FSOUND_ALL, volume);
}

long duree_musique()
{
     long temps = 0;     
     temps = FSOUND_Stream_GetTime (musique);  
     return temps;
}

long fin_musique()
{
     long temps = 0;     
     temps = FSOUND_Stream_GetLengthMs (musique);  
     return temps;
}
void controle_position (long positionFond, long positionSouris, long ratio)
{
     long  x =0, position = 0;
     x = positionSouris - 163 - positionFond;
     position = x * ratio;
     FSOUND_Stream_SetTime (musique, position);     
}
long nombreDeFichier()
{
   DIR * TheDir;
   struct dirent * dirData;
   long w =0;

   TheDir = opendir(THE_DIR);
   if (TheDir) 
   {
      
      while(dirData = readdir(TheDir)) 
      { 
         w++;
      }
      printf("\n\n\n   %ld", w);
      closedir(TheDir);
   }
   return w;
}
int playing ()
{
return FSOUND_IsPlaying (FSOUND_ALL);
}

char* titre()
{
return FSOUND_Sample_GetName (FSOUND_Stream_GetSample (musique));
}

voila
j ai pas bcp de commentaires
j espere que vous comprendrai
je veux bien vous envoyer le programme suffit de me donner votre email

merci d avance

ps: desole pour la lourdeur du code donc si par la meme occasion vous avez des idées pour le reduire elles sont les bien venues.

j’interviens pour te montrer comment réduire un peu ton code
int playing ()
{
int vrai = 0;
vrai = FSOUND_IsPlaying (FSOUND_ALL);
return vrai;
}

char* titre()
{
char *name;

titre_de_la_chanson = FSOUND_Stream_GetSample (musique);
name = FSOUND_Sample_GetName (titre_de_la_chanson);

return name;
}

deviendrais


int playing ()
{
 return FSOUND_IsPlaying (FSOUND_ALL);
}

char* titre()
{
return FSOUND_Sample_GetName (FSOUND_Stream_GetSample (musique));
}

de meme, tu repete plusieurs fois le code suivant
c = 52;
positionFrequence.y = positionFond.y + c;
SDL_BlitSurface(frequence, NULL, ecran, &positionFrequence);

a remplacer par un appel a une fonction


main()
{
  changerC([I]une valeur[/I]);
}

changerC(int c)
{
 c = 52;
 positionFrequence.y = positionFond.y + c;
 SDL_BlitSurface(frequence, NULL, ecran, &positionFrequence);
}

cela permet d’alleger ton code.

pour ton probleme de mémoire, il faut que tu verifie que tu libere bien la mémoire.


//ouverture boucle principale
while (continuer)
{


frequence = IMG_Load ("frequence.bmp");
SDL_SetAlpha(frequence, SDL_SRCALPHA, 160);
frequence_rouge = IMG_Load ("frequence_rouge.bmp");
SDL_SetAlpha(frequence_rouge, SDL_SRCALPHA, 160);

Tu charges en ram à chaque boucle, c’est déja une fuite mémoire.

oui je c cette fuite memoire est corrigé mais j avais deja le probleme avant cela( en fait j ai essayer plusieurs code et j ai oublier de le remettre ds ma version initialle) merci quand meme

jmgchouchou

[QUOTE]
de meme, tu repete plusieurs fois le code suivant
c = 52;
positionFrequence.y = positionFond.y + c;
SDL_BlitSurface(frequence, NULL, ecran, &positionFrequence);

a remplacer par un appel a une fonction



main()
{
 changerC([I]une valeur[/I]);
}

changerC(int c)
{
c = 52;
positionFrequence.y = positionFond.y + c;
SDL_BlitSurface(frequence, NULL, ecran, &positionFrequence);
}


[CODE]

ca j ai pas compris

une portion de code identique (a part la valeur de c qui change) peut etre mise dans une fonction ou une procédure. dans ton cas le code éxécuté sur 3 lignes ne tient plus que sur une seule. tu n’as plus qu’a passer en parametre la valeur de c (par exemple).


void main(void)
{
  int a,b;

  a = 1;
  b = 2;
  if(a < b) printf("a inférieur à b\n");
  else printf("a supérieur à b\n");

  a = 3;
  b = 0;
  if(a < b) printf("a inférieur à b\n");
  else printf("a supérieur à b\n");

  a = 1;
  b = 100;
  if(a < b) printf("a inférieur à b\n");
  else printf("a supérieur à b\n");
}

devient


void main(void)
{
  testAetB(1,2);
  testAetB(3,0);
  testAetB(1,100);
}

void testAetB(int a , int b)
{
  if(a < b) printf("a inférieur à b\n");
  else printf("a supérieur à b\n");
}

le code est plus court et plus lisible.

merci bien j avais pas saisi alors que c’était tout simple, vraiment merci
par contre j ai tjs ce sal probleme

T’as tenté un coup de gdb ou valgrind? (je pense que tu es sous Linux, 'fin sinon tu n’auras que gdb)

je suis sous windows
j essaye bien de passer a linux mais j ai tro de probleme

bon c’est quoi ca gdb et valgrind??
et ca sert a quoi?

merci

La fuite mémoire apparait apres avoir démarré la lecture d’un fichier ou lorsque tu lances l’application, commence par éliminer chaque étape pour en isoler la partie du code inciminée.

Ton code est trop dense pour moi.

valgrind c’est un utilitaire sympathoche qui gràce au fonctionnement de linux va proprement remplacer Xalloc (malloc, calloc, realloc, free) pour afficher le nombre d’allocation, et d’autres infos.

la fuite est plus rapide lorsque une chanson est en lecture

Honnêtement, tu devrais essayer de couper ton programme en sous fonction, ça faciliterait la lecture ET le debug.

Sinon, tu as gdb sous Windows, et tu devrais pouvoir le lancer sur malloc ou heap_alloc, pour déterminer où c’est que tu alloues, voir les points chauds.

Sans-Nom

je comprend rien gdb c’est quoi et quesque ca va faire :??: :??:

sinon le reduction du code je vais y reflechir, c’était initialement prevu pour la version 1.1 ^^ :lol:

mais bon j epense que je vais plutot devoir tt recomencer en le repensen mieu depuis le debut, mais je risque de refaire les meme erreur. enfin je verifirer la meoire a chaque essais et donc je pourrai sirectement savoir ou est le probleme. je pense pas avoir le choix? si?

Ben :slight_smile: recommencer ça a l’avantage de faire ça plus proprement et de virer les erreurs sans les chercher.

pas besoin de recommencer (pour le moment ne tt cas)

j ai trouvé la solution (enfin c un forumeur du site du zero)

la voici si ca inetresse quelqun
j avait oublier de liberer les surface ,temps, restant, et peut etre d’autre. donc a chaque boucle le pointeur pointait une nouvelle adresse sans avoir libéré la précédente, d’ou la fuite. enfin c’est ce k il me semble ,l explication est de moi. bon ainsi vous ferai pas l erreur meme si je me doute que vous ne l auriez pas fait.

merci car vous m avez permis de bien reduire le code