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+ avec C & C++ Discussion :

g_signal_connect paramètres incohérents.


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut g_signal_connect paramètres incohérents.
    Salut à tous,
    Je travaille sur un serveur rtsp en utilisant la bibliotheque "gst-rtsp-server" qui utilise gstreamer qui utilise la glib.
    Pour les besoins de mon appli, je souhaite récupérer des events comme "start playing", "stop playing", "media created", etc etc etc.
    Ces évènements sont lancé par des "g_signal_emit" et je les récupère au moyen de callback enregistré avec "g_signal_connect".
    L'appel des callback fonctionnent bien, mais j'ai des incohérences sur les paramètres.

    Dans mon main, j'enregistre un callback pour le signal "media-configure" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect (G_OBJECT (factory), "media-configure", G_CALLBACK (callback_media_configured), NULL);

    Mon callback se présente sous la forme :
    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
    void 
    callback_media_configured(GstRTSPMediaFactory *factory, GstRTSPMedia *media, gpointer *userdata) 
    { 
      fprintf(stderr, "media ptr:%p (dans le callback)\n", media); // Affiche l'adresse du pointeur de la structure qui m’intéresse
      fprintf(stderr, "media element ptr:%p (dans le callback)\n", media->element); // Affiche NULL alors que ca ne devrait pas.
     
      g_signal_connect (G_OBJECT (media), "new-state", G_CALLBACK (callback_media_new_state), NULL); 
    } 
     
     
    void 
    callback_media_new_state(GstRTSPMedia *media, gpointer *ptr, int state) 
    { 
      // Retourne une valeur incohérente.
      fprintf(stderr, "new state = %d (dans le callback)\n", media, state); 
    }
    Pour vérifier, j'ai ajouté du debug juste avant et juste après les "g_signal_emit" pour afficher les adresses et valeurs des paramètres que je souhaite récupérer. Ceux ci sont bon.

    Si on déroule le programme, ça affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    - "media ptr:0x850f42a6 (avant le emit)"             // OK
    - "media element ptr:0x85c245da (avant le emit)"     // OK
    - "media ptr:0x850f42a6 (dans le callback)"          // OK
    - "media element ptr:null(dans le callback)"         // NOK
    - "media ptr:0x850f42a6 (après le emit)"             // OK
    - "media element ptr:0x85c245da (après le emit)"     // OK
     
    - "new state = 2 (avant emit)"                       // OK
    - "new state = 154248524 (dans le callback)"         // WTF
    - "new state = 2 (après le emit)"                    // OK

    Bref, je n'arrive pas à comprendre :
    - Comment dans le callback "callback_media_configured" l'adresse du pointeur de la structure que je récupère est bonne mais pas certain de ses champs.
    - Comment un INT peut se transformer en n'importe quoi dans le callback "new-state".




    Edit: Pour info, voici comment se présentes les signaux et leurs emits :
    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
     
    gst_rtsp_media_factory_signals[SIGNAL_MEDIA_CONFIGURE] =
          g_signal_new ("media-configure", G_TYPE_FROM_CLASS (klass),
          G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTSPMediaFactoryClass,
              media_configure), NULL, NULL, g_cclosure_marshal_VOID__OBJECT,
          G_TYPE_NONE, 1, GST_TYPE_RTSP_MEDIA);
     
    g_signal_emit (factory, gst_rtsp_media_factory_signals[SIGNAL_MEDIA_CONFIGURE], 0, media, NULL);
     
    gst_rtsp_media_signals[SIGNAL_NEW_STATE] =
          g_signal_new ("new-state", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
          G_STRUCT_OFFSET (GstRTSPMediaClass, new_state), NULL, NULL,
          g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 0, G_TYPE_INT);
     
    int state = 2;
    g_signal_emit (media, gst_rtsp_media_signals[SIGNAL_NEW_STATE], 0, state, NULL);

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Je ne suis pas sûr, mais je crois qu'il y a une nuance: c'est le signal media-configure, pas media-configured.

    Le commit qui a ajouté cette fonctionnalité indique:
    Add signal to allow the application to configure the media after it was created from the factory.
    Donc ce signal, c'est pour te prévenir que tu as du boulot à faire, pas pour te dire que le boulot a été fait.

    Source: http://cgit.freedesktop.org/gstreame...eda7acc3f67f87

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    Mon signal s'appelle bien "media-configure". C'est seulement mon callback qui fini par "..configured".

    Ce signal permet de faire de la config "custom" mais n'est pas necessaire au bon fonctionnement de l'appli (le serveur rtsp).
    D'ailleurs le serveur marche bien.

    Juste que je ne comprends pas pourquoi les paramètres reçus des signaux par les callbacks sont incohérents :/
    Je pense qu'il ne s'agit meme pas d'un probleme lié à gstreamer.
    La callstack dans mon callback indique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    callback_media_configured > g_cclosure_marshal_VOID__OBJECT > _g_closure_invoque_va > g_signal_emit_valist > g_signal_emit
    Je soupçonne l'origine de mon problème quelque part la dedans et plus particulièrement dans les va_args...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    Ok, je buildait avec une bibliothèque et j'en utilisais une autre au runtime. :/
    Ca m'appendra à pas ranger mes fichiers au bon endroit :/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. incohérence passage paramètre d'une fonction
    Par EIN-LESER dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 27/04/2012, 09h29
  2. Passer une structure en paramètre d'un g_signal_connect
    Par drhouse87 dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 28/12/2011, 23h52
  3. Solution la plus judicieuse lors d'un paramètre effectif incohérent.
    Par Gaal Dornick dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 23/10/2009, 10h54
  4. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47
  5. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24

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