Bonjour amis développeurs,
J'ai commencé un petit programme qui lit des musiques et affiche le spectre de la musique ( selon les cours du site du zér0 ) mais avant d'aller plus loin, j'ai un gros problème assez embêtant, c'est que mon programme ne se modère pas pour prendre toute la mémoire. Il monte environ de 2mo de RAM par seconde et ne s'arrête pas tant qu'il reste de la place...
Donc voilà je ne sais pas trop ce qui demande autant de mémoire dans mon code, si vous savez me l'indiquer...
Merci.

Mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_IMAGE.h>
#include <FMOD/fmod.h>
#include "constantes.h"
 
void setPixel(SDL_Surface *surface, int x, int y, Uint32 pixel);
 
int main(int argc, char *argv[])
{
    // Déclaration des variables
        SDL_Surface *ecran = NULL, *visualisation_spectre = NULL, *fond_spectre = NULL;
        SDL_Surface *ligne_spectre = NULL;
        SDL_Event event;
        SDL_Rect position;
            position.x = 0;
            position.y = 0;
        FSOUND_STREAM *musique = NULL;
        float *spectre = NULL;
        double ratio;
        long continuer, i, j, lecture_en_cours = 0, volume = 122, temps_precedent = 0;
 
    // Initialisation de SDL
        if( SDL_Init( SDL_INIT_VIDEO | SDL_DOUBLEBUF ) == -1 )
        {
            fprintf( stderr, "Erreur d'initialisation de SDL : %s\n", SDL_GetError() );
            exit( EXIT_FAILURE );
        }
 
    // Initialisation de FMOD
        if( FSOUND_Init( 44100, 32, 0 ) == -1 )
        {
            fprintf( stderr, "Erreur d'initialisation de FMOD : %s\n", FSOUND_GetError() );
            exit( EXIT_FAILURE );
        }
        FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 1);
 
    // Chargement du mode vidéo
        ecran = SDL_SetVideoMode( LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE );
        if( ecran == NULL )
        {
            fprintf( stderr, "Erreur de chargement du mode vidéo : %s\n", SDL_GetError() );
            exit( EXIT_FAILURE );
        }
        SDL_WM_SetCaption( "Gestion du son avec FMOD", NULL );
 
    // Chargement des images
        fond_spectre = IMG_Load("fond.png");
        if( fond_spectre == NULL )
        {
            fprintf( stderr, "Erreur de chargement de l'image fond.png : %s\n", IMG_GetError() );
            exit( EXIT_FAILURE );
        }
        visualisation_spectre = SDL_CreateRGBSurface( SDL_HWSURFACE, 512, HAUTEUR_FENETRE, 32, 0, 0, 0, 0 );
        if( visualisation_spectre == NULL )
        {
            fprintf( stderr, "Erreur de chargement de la surface \"visualisation_spectre\"\n" );
            exit( EXIT_FAILURE );
        }
 
    // Chargement des sons
        musique = FSOUND_Stream_Open( "musiques/home.mp3", FSOUND_LOOP_NORMAL, 0, 0 );
        if( musique == NULL )
        {
            fprintf( stderr, "Erreur de chargement du son \"musiques/home.mp3\".\n" );
            exit( EXIT_FAILURE );
        }
 
    // Gestion des évènements
        continuer = 1;
        while( continuer )
        {
            SDL_PollEvent( &event );
            switch( event.type )
            {
                case SDL_QUIT :
                    continuer = 0;
                    break;
                case SDL_KEYDOWN :
                    switch( event.key.keysym.sym )
                    {
                        case SDLK_ESCAPE :
                            continuer = 0;
                            break;
                        case SDLK_1 :
                            FSOUND_Stream_Stop( musique );
                                lecture_en_cours = 0;
                            musique = FSOUND_Stream_Open( "musiques/home.mp3", FSOUND_LOOP_NORMAL, 0, 0 );
                            if( musique == NULL )
                            {
                                fprintf( stderr, "Erreur de chargement du son \"musiques/home.mp3\".\n" );
                                exit( EXIT_FAILURE );
                            }
                            break;
                        case SDLK_2 :
                            FSOUND_Stream_Stop( musique );
                                lecture_en_cours = 0;
                            musique = FSOUND_Stream_Open( "musiques/pinguin.mp3", FSOUND_LOOP_NORMAL, 0, 0 );
                            if( musique == NULL )
                            {
                                fprintf( stderr, "Erreur de chargement du son \"musiques/pinguin.mp3\".\n" );
                                exit( EXIT_FAILURE );
                            }
                            break;
                        case SDLK_3 :
                            FSOUND_Stream_Stop( musique );
                                lecture_en_cours = 0;
                            musique = FSOUND_Stream_Open( "musiques/pluck.mp3", FSOUND_LOOP_NORMAL, 0, 0 );
                            if( musique == NULL )
                            {
                                fprintf( stderr, "Erreur de chargement du son \"musiques/pluck.mp3\".\n" );
                                exit( EXIT_FAILURE );
                            }
                        case SDLK_l :
                            FSOUND_Stream_Play( FSOUND_FREE, musique );
                                lecture_en_cours = 1;
                            break;
                        case SDLK_p :
                            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
                                SDL_Delay(500);
                            }
                            break;
                        case SDLK_s :
                            FSOUND_Stream_Stop(musique);
                                lecture_en_cours = 0;
                            break;
                        default :
                            break;
                    }
                    break;
                case SDL_MOUSEBUTTONDOWN :
                    switch( event.button.button )
                    {
                        case SDL_BUTTON_WHEELUP :
                            if( volume <= 255 - 20 )
                                volume += 20;
                            break;
                        case SDL_BUTTON_WHEELDOWN :
                            if( volume >= 20 )
                                volume -= 20;
                            break;
                    }
                    break;
 
            }
 
            // Réglages du spectre
                ratio = ( visualisation_spectre->h / 255.0 );
                if( temps_precedent <= SDL_GetTicks() - 25 )
                {
                    if( lecture_en_cours )
                    {
                        spectre = FSOUND_DSP_GetSpectrum();
                        SDL_FillRect( visualisation_spectre, NULL, SDL_MapRGB( visualisation_spectre->format, 0, 0, 0 ) );
                        position.x = 0;
                        position.y = 0;
                        SDL_BlitSurface( fond_spectre, NULL, visualisation_spectre, &position );
                        for( i = 0 ; i < 512 ; i++ )
                        {
                            if( spectre[i] * 4 > 1 )
                                spectre[i] = 1 / 4;
                            ligne_spectre = SDL_CreateRGBSurface( SDL_HWSURFACE, 1, ( HAUTEUR_FENETRE * spectre[i] ) * 4, 32, 0, 0, 0, 0 );
                            if( ligne_spectre->h != 0 )
                            {
                                SDL_LockSurface( ligne_spectre );
                                for( j = 0 ; j <= ligne_spectre->h ; j++ )
                                    setPixel( ligne_spectre, 0, ligne_spectre->h - j, SDL_MapRGB( ligne_spectre->format, ( j / ratio ), 255 - ( j / ratio ), 0 ) );
                                SDL_UnlockSurface( ligne_spectre );
                                position.x = i;
                                position.y = HAUTEUR_FENETRE - ligne_spectre->h;
                                SDL_BlitSurface( ligne_spectre, NULL, visualisation_spectre, &position );
                            }
                        }
                    }
                    temps_precedent = SDL_GetTicks();
                }
                else
                {
                    SDL_Delay( 25 - ( SDL_GetTicks() - temps_precedent ) );
                }
 
            // Mise à jour du volume
                FSOUND_SetVolume(FSOUND_ALL, volume);
 
            // Blit time
                SDL_FillRect( ecran, NULL, SDL_MapRGB( ecran->format, 0, 128, 255 ) );
                position.x = 0;
                position.y = 0;
                SDL_BlitSurface( visualisation_spectre, NULL, ecran, &position );
 
            // Mise à jour de l'écran
                SDL_Flip( ecran );
        }
 
    // Fermeture du programme et libération de la mémoire
        SDL_FreeSurface( ecran );
        SDL_FreeSurface( ligne_spectre );
        SDL_FreeSurface( visualisation_spectre );
        SDL_FreeSurface( fond_spectre );
        SDL_Quit();
        FSOUND_Stream_Close(musique);
        FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 0);
        FSOUND_Close();
        exit( EXIT_SUCCESS );
}
 
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;
    }
}