Jump to content

[C]probleme de memoire vive


Recommended Posts

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);

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)

{

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);

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

Link to comment
Share on other sites

+1

Tu peux aussi vérifier les éventuels warnings à la compil (tu compiles avec -g -ansi -pedantic ? Au moins -g, c'est le minimum).

Sinon electric fence permet de gérer les problèmes de programmes mal concus qui "fonctionnent" par chance (due à la pagination de la mémoire (avec des pages de 4ko souvent))

Link to comment
Share on other sites

je vien de remarque que lorsue je retire la fonction de lecture audio, la memoire augmente, mais moin vite

donc d apres moi il devrais avoir un probleme de liberation memoire, voous en penser quoi?

si c 'est ca j ai deja essayer plusieur changement mais rien n y fait.

Link to comment
Share on other sites

nope dans un programme, la taille en mémoire doit finir par atteindre un état stable, si ça ne fait qu'aughmenter, c'est qu'il y a toujours une fuite.

on a pas la fin de ton code (avec les libérations justement) c'est un peu chaud pour t'aider :roule:

Link to comment
Share on other sites

oups y a eu un petit probleme en effet est ce que le forum n accepte pas plus de x lignes

bon c 'est rien voici la fin

//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.

Link to comment
Share on other sites

http://perens.com/FreeSoftware/ElectricFence/

Le principe (en résumé vite faite) c'est d'utiliser un malloc qui alloue ta mémoire à la fin de chaque page (de 4ko... ou pas rappelons le), comme ça, même si tu n'utilise moins de 4 ko, dès que ton programe a une erreur typique qui ammène à un segfault, ça plante direct et pas aléatoirement (vu que la prochaine page ne t'appartient pas).

Link to comment
Share on other sites

en gros, quand tu déborde, tu ne peux pas écraser de variables puisqu'il n'y en a pas juste derriere. Par contre, vu que tu changes de page, comme le dit theo, tu risque uniquement de violer un acces resreint. De fait, tu as un programme beaucoup moins aléatoire ;)

gribix1, ton code est quand même sacrément GruikGruiiiik... :francais:

exemple :

spectre = FSOUND_DSP_GetSpectrum();
 while(d < 8)
 {  
 positionFrequence.x = positionFond.x + b;

 while ( a < 64)
 {
	   resultat = resultat + spectre[e];
	   a++;
	   e++;	

 }
...

pourquoi pas plus simplement

int a;
for( a = 0;  a < 64; resultat += spectre[a++] );

tu utilises deux variables, là où une seule suffit

(c'est très condensé, mais l'idée est là :francais: )

d'autre part, je crois que tu ne libère jamais spectre, pourtant tu dois appeler affichage() un paquet de fois :francais:

Link to comment
Share on other sites

alor merci pour ces racourci

lorinc : mes deux variables sont necessaire car il y en a une ki est remise a 0 pas l autre

par contre je doit libérer spectre??? c juste un pointeur sur float pas un surface au autre chose, enfin si je doit kan meme, comment??

tsubasaleguedin: je comprend pas electric fence

sinon si mon code est un peut GruikGruiiiik , ben c paske je debute j ai pas encore (dutt) les reflexe du genre , mais j'aprend^^

merci de m aider meme si je compren pas bien tt^^ :-D:D:pleure:

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...