IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ Discussion :

problème avec GtkHScale


Sujet :

GTK+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut problème avec GtkHScale
    Bonsoir à tous je suis nouveau dans le site,je suis entrain de programmer un lecteur audio avec gtk+ et fmod et j'ai un petit souci lorsque je veux déplacer la barre de temps pour faire avancer la musique donc voila je me sert d'une fonction que j'appelle toutes les 500 ms avec g_timeout_add pour mettre ç jour le temps voici donc la fonction:

    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
    gint setBarreTemps(gpointer data)/*     */
    {
        MainWindow *fenetre=(MainWindow*)data;
        gdouble valeur_barre_menu=0;
        if (audio.music!=NULL)
        {
            if (FSOUND_IsPlaying(1))
            {/* si la music est entrain de jouer on update le temps */
                gtk_range_set_range (GTK_RANGE(fenetre->barre_temps), 0, FSOUND_Stream_GetLengthMs(audio.music));
                gtk_range_set_value(GTK_RANGE(fenetre->barre_temps), FSOUND_Stream_GetTime(audio.music));
                valeur_barre_menu=gtk_range_get_value(GTK_RANGE(fenetre->barre_temps));
            }
            else gtk_range_set_value(GTK_RANGE(fenetre->barre_temps),0);
     
        }
     
        return 1;
    }
    donc je voudrais que lorsqu'on déplace le curseur de la barre de temps je fais avancer ma musique j'ai chercher s'il ya un signal lorsqu'on fait bouger le curseur de la barre je n'ai rien trouvé voila merci de votre aide

  2. #2
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Salut,

    Tu as l'évènement "change-value" qui détecte si tu bouges le curseur.

    Il y a aussi "value-changed", qui détecte tout changement de valeur, qu'il soit d'origine graphique (curseur déplacé) ou interne (appel de gtk_range_set_value).


    -

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut
    Bonjour,

    J'ai essayer avec le signal "changed-value" ça ne marche pas puisque ma barre de temps change de valeurs toutes les secondes
    pour mieu comprendre voici comment fais pour récuper une musique d'un file chooser
    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
    switch (gtk_dialog_run(GTK_DIALOG(FileSelection)))
        {
        case GTK_RESPONSE_OK:
     
            ptr_fenetre->fichier_Ajouer = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(FileSelection)); /** n'oubliez pas de libérer cette variable,en effet la fonction fait une allocation*/
            gtk_window_set_title(GTK_WINDOW(ptr_fenetre->window),ptr_fenetre->fichier_Ajouer);
            LoadMusic(ptr_fenetre,&audio,ptr_fenetre->fichier_Ajouer);
            g_signal_connect(G_OBJECT(ptr_fenetre->boutons[BOUTON_PLAY]),"clicked",G_CALLBACK(PlayMusic),audio.music); /* si on clique sur les boutons*/
            g_timeout_add(500, DisplayMusicTime, ptr_fenetre);
            g_timeout_add(500,setBarreTemps,ptr_fenetre);
            g_signal_connect(G_OBJECT(ptr_fenetre->boutons[BOUTON_PAUSE]),"clicked",G_CALLBACK(PauseMusic),NULL);      /* on fait appelle au fonction "audio.c"*/
            g_signal_connect(G_OBJECT(ptr_fenetre->boutons[BOUTON_STOP]),"clicked",G_CALLBACK(StopMusic),ptr_fenetre);
            g_signal_connect(G_OBJECT(ptr_fenetre->barre_temps),"change-value",G_CALLBACK(slider),ptr_fenetre);
            g_free(ptr_fenetre->fichier_Ajouer);
     
            break;
        default:
            break;
     
            (void)widget;
     
        }
    @monnomamoi: j'ai ajouter une fonction callback avec "change-value" bah désolé mais ça fait planter mon programme ....

    Merci encore

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Citation Envoyé par manrugby Voir le message
    @monnomamoi: j'ai ajouter une fonction callback avec "change-value" bah désolé mais ça fait planter mon programme ....
    Tu penses vraiment que dans gtk+ il y a des parties de code qui font planter ton programme quand tu les utilises correctement ? Si ca plante, ca doit vouloir dire que tu utilises l'API de façon non valide ou qu'il y a un problème dans ton programme.

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut
    Hum ce que je voulais dire c'est oui bien sur l'erreur est dans mon code c'est pour ça que je suis la d'ailleurs , bon je vais vous expliquer de A à Z comment je procède lors de la lecture d'une musique:

    Tout d'abord je récupère la musique choisie donc le file chooser voici le fonction:
    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
    void OnFileChooser(GtkWidget *widget,gpointer data) /** On récupére le fichier choisie, soit un fichier audio **/
    {
        GtkWidget *FileSelection=NULL;
        MainWindow* ptr_fenetre=(MainWindow*)data;
        FileSelection = gtk_file_chooser_dialog_new("Ouvrir...",
                        GTK_WINDOW(ptr_fenetre->window),
                        GTK_FILE_CHOOSER_ACTION_OPEN,
                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                        GTK_STOCK_OPEN, GTK_RESPONSE_OK,
                        NULL);
        gtk_window_set_modal(GTK_WINDOW(FileSelection), TRUE);
     
        switch (gtk_dialog_run(GTK_DIALOG(FileSelection)))
        {
        case GTK_RESPONSE_OK:
     
            ptr_fenetre->fichier_Ajouer = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(FileSelection)); /** n'oubliez pas de libérer cette variable,en effet la fonction fait une allocation*/
            gtk_window_set_title(GTK_WINDOW(ptr_fenetre->window),ptr_fenetre->fichier_Ajouer);
            LoadMusic(ptr_fenetre,&audio,ptr_fenetre->fichier_Ajouer);
            g_signal_connect(G_OBJECT(ptr_fenetre->boutons[BOUTON_PLAY]),"clicked",G_CALLBACK(PlayMusic),audio.music); /* si on clique sur les boutons  on fait appelle au fonction "audio.c"*/
            g_timeout_add(500, DisplayMusicTime, ptr_fenetre);
            g_timeout_add(500,setBarreTemps,ptr_fenetre);
            g_signal_connect(G_OBJECT(ptr_fenetre->boutons[BOUTON_PAUSE]),"clicked",G_CALLBACK(PauseMusic),NULL);   
            g_signal_connect(G_OBJECT(ptr_fenetre->boutons[BOUTON_STOP]),"clicked",G_CALLBACK(StopMusic),ptr_fenetre);
            g_free(ptr_fenetre->fichier_Ajouer);
            break;
        default:
            break;
     
        }
        gtk_widget_destroy(FileSelection);
        (void)widget;
    }
    voici la fonction qui charge la musique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void LoadMusic(MainWindow *fenetre,MyMusic* audio,gchar *path)
    {
        FSOUND_Stream_Close(audio->music); /* on libére la musique précédente*/
        audio->music=NULL;
        audio->music=FSOUND_Stream_Open(path,0,0,0); /* on ouvre la musique choisie */
        if (audio->music==NULL) /* si erreur on affiche une boite de dialogue */
        {
            errorLectureMusic(fenetre->window);
        }
        audio->volume=255/2;
        PlayMusic(NULL,audio->music);
    }
    ensuite toutes les 500ms j'appelle mes fonctions setBarreTemps et DisplayMusicTime que voici:
    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
    MusicTime setTime(FSOUND_STREAM *ptr_music)
    {
     
        MusicTime tmp={0,0,0,0,0,0};
        tmp.seconde=FSOUND_Stream_GetTime(ptr_music)/1000%60;
        tmp.minute=FSOUND_Stream_GetTime(ptr_music)/1000/60%60;
        tmp.heure=FSOUND_Stream_GetTime(ptr_music)/1000/60/60;
        tmp.length_music_s=FSOUND_Stream_GetLengthMs(ptr_music) / 1000%60 ;
        tmp.length_music_m=FSOUND_Stream_GetLengthMs(ptr_music) / 1000/60;
        tmp.length_music_h=FSOUND_Stream_GetLengthMs(ptr_music) / 1000/60/60;
     
        return tmp;
    }
    gint DisplayMusicTime(gpointer data)
    {
        MusicTime music_time;
        MainWindow *fenetre=(MainWindow*)data;
     
        gchar buffer[strlen(" Time:00.00.00 / 00.00.00 ")+1]="";
     
        if (FSOUND_IsPlaying(1))
        {
            music_time=setTime(audio.music);
            sprintf(buffer,"Time: %02d.%02d.%02d/%02d.%02d.%02d",music_time.heure,music_time.minute,music_time.seconde,
                    music_time.length_music_h,music_time.length_music_m,music_time.length_music_s);
            gtk_label_set_label(GTK_LABEL(fenetre->label_time),buffer);
     
        }
        return TRUE;
    }
    gint setBarreTemps(gpointer data)/*     */
    {
        MainWindow *fenetre=(MainWindow*)data;
        gdouble valeur_barre_menu=0;
        if(FSOUND_IsPlaying(1))
        {
          gtk_range_set_range (GTK_RANGE(fenetre->barre_temps), 0, FSOUND_Stream_GetLengthMs(audio.music));
          gtk_range_set_value(GTK_RANGE(fenetre->barre_temps), FSOUND_Stream_GetTime(audio.music));
          valeur_barre_menu=gtk_range_get_value(GTK_RANGE(fenetre->barre_temps));
          g_signal_connect(G_OBJECT(fenetre->barre_temps),"change-value",G_CALLBACK(slider),fenetre);
        }
     return 1;
    }
    voici espérant avoir une réponse car je bloque vraiment

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Utilise g_strdup_printf plutôt que sprintf, quand je vois du code qui plante et qui utilise cette fonction, je n'ai pas confiance du tout Sinon, j'évite en général de renvoyer une structure comme valeur de retour d'une fonction, tu peux à la place passer un pointeur sur la structure à modifier en argument, c'est ensuite à l'appelant de passer le bon argument.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo