Bonjour � vous tous.
Je viens d'essayer de r�aliser un bout de code pour faciliter l'utilisation de la biblioth�que SDL_mixer. L'objectif est de pouvoir charger, jouer et lib�rer un nombre plus ou moins important de sons (ou musique) avec l'aide de fonctions simples.
Le probl�me est que je suis assez nouveau dans le domaine et encore plus dans l'utilisation cette biblioth�que.
Lorsque je lance le programme, les sons se chargent, ils se jouent � tour de r�les mais, ils restent en m�moire alors que le programme demande leur lib�ration.

Comment puis-je r�soudre ce soucis et comment puis-je am�liorer aux maximum le code (le rendre vraiment bien et efficace, car je pense qu'actuellement, il n'est pas bon bien qu'il tourne � peu pr�s ).

Voici le 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
#include <string>
#include <iostream>
#include <SDL/SDL_mixer.h>
#include "sons.h"
 
using namespace std;
 
Mix_Music *musique = NULL; // La musique qui sera jouée
Mix_Chunk *son[] = {NULL}; // Le(s) son(s) qui sera joué
int *nombreSon = NULL;
 
void jouerMusique(string nom)
{
    size_t size = nom.size() + 1;
    char * buffer = new char[ size ];
    strncpy( buffer, nom.c_str(), size );
    musique = Mix_LoadMUS(buffer); //Charge le son a l'adresse indiquée
    delete [] buffer;
 
 
    if(musique == NULL)  //Vérifie si le son est ok.
    {
        cout << "Erreur lors du chargement du son";
    }
 
    Mix_PlayMusic(musique, -1); // on joue notre son qu'une seul fois.
}
 
void stopMusique()
{
    Mix_HaltMusic();
    Mix_FreeMusic(musique);
}
 
/*
    initSons(char nom[][], int numSound)
 
	Charger tout les sons
	demandés.
*/
 
void initSons(string *nom, int numSound, int numChannel)
{
    int i = 0; //Pour le systeme de boucle
    nombreSon = &numSound;
    Mix_AllocateChannels(numChannel); //Nombre de channels
    size_t size = nom[i].size() + 1;
    while(i != numSound)
    {
        size = nom[i].size() + 1;
        char * buffer = new char[ size ];
        strncpy( buffer, nom[i].c_str(), size );
        son[i] = Mix_LoadWAV(buffer);
        cout << "Son:"<<i<<" - Nom:" <<buffer<<" - Nombre de canaux:"<<numChannel << "\n";
        delete [] buffer;
        i++;
    }
}
 
void jouerSon(int numSound) //Jouer le son numéro X
{
    if(numSound > *nombreSon)
    {
        printf("Son inexistant!");
    }
    else
    {
        Mix_PlayChannel(-1, son[numSound], 0);
    }
}
 
void suppSons() //Supprime tout les sons charger ainsi que les channels disponibles
{
    int i = NULL;
    Mix_AllocateChannels(0);
    while(i != *nombreSon)
    {
        Mix_FreeChunk(son[i]);
        i++;
    }
}
Et voici le r�sultat que renvoie Valgrind:
==5173== Memcheck, a memory error detector
==5173== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==5173== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==5173== Command: ./PSBG
==5173== Parent PID: 4440
==5173==
==5173== Conditional jump or move depends on uninitialised value(s)
==5173== at 0x4073E8: jouerSon(int) (sons.cpp:75)
==5173== by 0x407009: main (main.cpp:47)
==5173==
==5173== Conditional jump or move depends on uninitialised value(s)
==5173== at 0x407473: suppSons() (sons.cpp:89)
==5173== by 0x407018: main (main.cpp:49)
==5173==
==5173== Conditional jump or move depends on uninitialised value(s)
==5173== at 0x64C718C: MPEGaudio::Stop() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x64C72A9: MPEGaudio::Rewind() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x64D93C6: MPEGaudio::initialize() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x64C7628: MPEGaudio::MPEGaudio(MPEGstream*, bool) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x64C0CCD: MPEG::parse_stream_list() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x64C163A: MPEG::Init(SDL_RWops*, bool) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x64C6D82: SMPEG_new (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x40A812: Mix_LoadMUS (in /home/thedahu/C++/PSBG/bin/Debug/PSBG)
==5173== by 0x4071DD: jouerMusique(std::string) (sons.cpp:30)
==5173== by 0x407051: main (main.cpp:51)
==5173==
==5173== Thread 3:
==5173== Conditional jump or move depends on uninitialised value(s)
==5173== at 0x64D5F46: MPEGaudio::layer3hybrid(int, int, float (*) [18], float (*) [32]) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x64D7D27: MPEGaudio::extractlayer3() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x64D90B4: MPEGaudio::run(int, double*) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x64D91A1: Decode_MPEGaudio(void*) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x4E3E3F4: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
==5173== by 0x4E815F8: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
==5173== by 0x5E4B970: start_thread (pthread_create.c:304)
==5173== by 0x5BA792C: clone (clone.S:112)
==5173==
==5173== Conditional jump or move depends on uninitialised value(s)
==5173== at 0x64D5F46: MPEGaudio::layer3hybrid(int, int, float (*) [18], float (*) [32]) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x64D7F26: MPEGaudio::extractlayer3() (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x64D90B4: MPEGaudio::run(int, double*) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x64D91A1: Decode_MPEGaudio(void*) (in /usr/lib/libsmpeg-0.4.so.0.1.4)
==5173== by 0x4E3E3F4: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
==5173== by 0x4E815F8: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
==5173== by 0x5E4B970: start_thread (pthread_create.c:304)
==5173== by 0x5BA792C: clone (clone.S:112)
==5173==
==5173==
==5173== HEAP SUMMARY:
==5173== in use at exit: 16,055,011 bytes in 1,367 blocks
==5173== total heap usage: 15,134 allocs, 13,767 frees, 35,560,879 bytes allocated
==5173==
==5173== LEAK SUMMARY:
==5173== definitely lost: 26 bytes in 3 blocks
==5173== indirectly lost: 176 bytes in 4 blocks
==5173== possibly lost: 8,176 bytes in 1 blocks
==5173== still reachable: 16,046,633 bytes in 1,359 blocks
==5173== suppressed: 0 bytes in 0 blocks
==5173== Rerun with --leak-check=full to see details of leaked memory
==5173==
==5173== For counts of detected and suppressed errors, rerun with: -v
==5173== Use --track-origins=yes to see where uninitialised values come from
==5173== ERROR SUMMARY: 41 errors from 5 contexts (suppressed: 6 from 5)