Bonjour

Je réalise un lecteur audio avec SDL_mixer pour l'audio et GTK pour l'interface graphique ( très très simple pour le moment...)
Je peux charger une "playlist" morceau par morceau (grace à une boite de dialogue), jouer une chanson, et avancer ou reculer d'une ou plusieurs chansons dans ma plylist.

Ma difficulté majeure, c'est que quand une chanson est finie, je ne sais pas comment passer automatiquement à la chanson suivante; je dois pour le moment cliquer manuellement sur le bouton ">>".

Je pourrais utiliser une boucle 'while' avec la fonction Mix_PlayingMusic de la SDL_mixer (ça renvoie si un morceau est en train de jouer ou non); effectivement cela marche, mais dans ce cas, mon interface est "gelée", et je ne peux passer passer à la plage suivante...

Je ne sais pas si cela a de l'importance, mais je suis sous Gentoo et j'utilise CodeBlocks.

Pourriez-vous m'aider, svp?

Voici mes sources:

fonctions.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
extern int n; // varible globale : n = le numero du morceau joué (sur la playlist)
extern Mix_Music *musique;
 
// tous les prototypes des fonctions;
void joueMorceau();
void recupereChaine(FILE* fichier,char* chaine, int numeroLigne, int tailleMax);
void OnDestroy(GtkWidget *pWidget, gpointer pData);
void selectionneFichier(GtkWidget *pWidget, gpointer data);
void g_selectionneMorceau(GtkWidget *pWidget, gpointer data);
void g_joueMorceau(GtkWidget *pWidget, gpointer data);
void g_augmente();
void g_diminue();
void g_stop(GtkWidget *pWidget, gpointer data);
declare_n.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
int n; //déclaration de n en bariable globale
main.c :
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
#include <stdlib.h>
#include <gtk/gtk.h>
#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>
Mix_Music *musique;
int q = 0;
#include "fonctions.h"
 
int main (int argc, char **argv)
{
    GtkWidget *fenetrePrincipale;
    GtkWidget *pVBox;
    GtkWidget *pHBox;
    GtkWidget *pButton[5];
 
    FILE* playlist = NULL; // on créé le fichier "playlist" (s'il n'existe pas) et on le vide;
    playlist = fopen("playlist.txt", "w+");
    fclose(playlist);
 
    gtk_init(&argc, &argv);
    fenetrePrincipale = gtk_window_new(GTK_WINDOW_TOPLEVEL); //l'interface
    gtk_window_set_position(GTK_WINDOW(fenetrePrincipale), GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(fenetrePrincipale), 300, 180);
    gtk_window_set_title(GTK_WINDOW(fenetrePrincipale), "Gtk Player");
    g_signal_connect(G_OBJECT(fenetrePrincipale), "destroy", G_CALLBACK(OnDestroy), NULL);
 
    pVBox = gtk_vbox_new(TRUE, 0);
    gtk_container_add(GTK_CONTAINER(fenetrePrincipale), pVBox);
 
    pButton[0] = gtk_button_new_with_mnemonic("Selectionner");
    pButton[1] = gtk_button_new_with_label("<<");
    pButton[2] = gtk_button_new_with_label("PLAY");
    pButton[3] = gtk_button_new_with_label("STOP");
    pButton[4] = gtk_button_new_with_label(">>");
 
    gtk_box_pack_start(GTK_BOX(pVBox), pButton[0],TRUE, FALSE, 0);
 
    pHBox = gtk_hbox_new(TRUE, 0);
    gtk_box_pack_start(GTK_BOX(pVBox), pHBox, TRUE, TRUE, 0);
 
    gtk_box_pack_start(GTK_BOX(pHBox), pButton[1], TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(pHBox), pButton[2], TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(pHBox), pButton[3], TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(pHBox), pButton[4], TRUE, FALSE, 0);
 
    g_signal_connect(G_OBJECT(pButton[0]), "clicked", G_CALLBACK(selectionneFichier), NULL);
    g_signal_connect(G_OBJECT(pButton[1]), "clicked", G_CALLBACK(g_diminue), NULL);
    g_signal_connect(G_OBJECT(pButton[2]), "clicked", G_CALLBACK(g_joueMorceau), NULL);
    g_signal_connect(G_OBJECT(pButton[3]), "clicked", G_CALLBACK(g_stop), NULL);
    g_signal_connect(G_OBJECT(pButton[4]), "clicked", G_CALLBACK(g_augmente), NULL);
 
    gtk_widget_show_all(fenetrePrincipale);
 
    gtk_main ();
    Mix_CloseAudio();
    SDL_Quit();
    return 0;
}
 
void OnDestroy(GtkWidget *pWidget, gpointer data)
{
    gtk_main_quit();
}
 
void selectionneFichier(GtkWidget *pWidget, gpointer data)
{
    FILE* playlist = NULL; //selectionne un ou plusieurs fichiers à ajouter sur "playlist"
    GtkWidget *pFileSelection;
    GtkWidget *pParent;
    gchar *sChemin;
 
    pParent = GTK_WIDGET(data);
 
    pFileSelection = gtk_file_chooser_dialog_new("Ouvrir...",
        GTK_WINDOW(pParent),
        GTK_FILE_CHOOSER_ACTION_OPEN,
        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
        GTK_STOCK_OPEN, GTK_RESPONSE_OK,
        NULL);
    gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE);
 
    switch(gtk_dialog_run(GTK_DIALOG(pFileSelection)))
    {
        case GTK_RESPONSE_OK:
            sChemin = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection));
            playlist = fopen("playlist.txt", "a");
            fputs(sChemin, playlist);
            fputs("\n", playlist);
            fclose(playlist);
            g_free(sChemin);
            break;
        default:
            break;
    }
    gtk_widget_destroy(pFileSelection);
 
}
 
void g_joueMorceau(GtkWidget *pWidget, gpointer data)
{
    Mix_FreeMusic(musique);//libère la musique précédemment chargée (si c'était le cas) et appelle la focntion "joueMorceau"
    Mix_CloseAudio();
    SDL_Quit();
    n = 1;
    joueMorceau();
}
 
void g_augmente()
{
    Mix_FreeMusic(musique); //libère la musique précédemment chargée (si c'était le cas) et appelle la focntion "joueMorceau" mais avec n + 1
    Mix_CloseAudio();
    SDL_Quit();
    n = n+1;
    joueMorceau();
}
 
void g_diminue()
{
    Mix_FreeMusic(musique); //libère la musique précédemment chargée (si c'était le cas) et appelle la focntion "joueMorceau" mais avec n + 1
    Mix_CloseAudio();
    SDL_Quit();
    if (n > 1)
    {
        n = n -1;
    }
    joueMorceau();
}
 
void g_stop(GtkWidget *pWidget, gpointer pointeurSur_n)
{
    Mix_FreeMusic(musique);
    Mix_CloseAudio();
    SDL_Quit();
    n = 1;
}
selectionneMorceau.c :
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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>
#include <gtk/gtk.h>
#include "fonctions.h"
 
void joueMorceau()
 
{
    char morceau[150] = " ";
    int nb = 0;
    char caractereActuel = 0;
 
    SDL_Init(SDL_INIT_VIDEO);
    FILE* playlist = NULL;
    playlist = fopen("playlist.txt", "r"); //ouvre la playlist
    rewind(playlist);
    while (caractereActuel != EOF) // compte le nombre de titres dans la playlist
    {
        caractereActuel = (fgetc(playlist));
        if (caractereActuel == '\n')
        {
            nb++;
        }
    }
    rewind(playlist);
    recupereChaine(playlist, morceau, n, 150); // appelle la fonction "recupereChaine", qui trouve le titre voulu dans la playlist (1 titre par ligne; n définit le numéro de la ligne à lire)
 
    fclose(playlist);
 
    if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 1024) == -1) //initialise, charge et joue la musique
    {
        printf("erreur : %s", Mix_GetError());
    }
    musique = Mix_LoadMUS(morceau);
    Mix_PlayMusic(musique, 0);
 
    }
 
 
void recupereChaine(FILE* fichier,char* chaine, int numeroLigne, int tailleMax)
{
    int i = 0, a = 0; // la fonction qui récupéère et renvoie le titre à jouer, en fonction de n
    char chaineARecuperer[150] = " ";
    while (chaine[i] != '\0')
    {
        chaine[i]= 0;
        i++;
    }
    for (i=0 ; i<numeroLigne; i++)
    {
        fgets(chaineARecuperer,tailleMax, fichier);
    }
    while(chaineARecuperer[a] != '\n')
    {
        chaine[a] = chaineARecuperer[a];
        a++;
    }
}