Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.4.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

QMediaPlayer et Delete

Bonjour,

Je rencontre un problème vraiment bizarre que je n'arrive pas à comprendre... Si vous avez des idées d'où le problème peut venir n'hésitez surtout pas à répondre.

J'ai un objet A global au projet dans lequel est alloué un QMediaPlayer pour jouer un son. Pas de soucis pour l'allouer et l'utiliser.

Dans une classe X j'utilise un autre QMediaPlayer (allocation dynamique + utilisation au sein de la classe). Dans le destructeur de l'objet X je delete le QMediaPlayer propre à la classe X. Sauf que quand je fais ca et que je veux réutiliser le QMediaPlayer de l'objet A j'ai soit un plantage de l'application, soit un message :

GLib-Gobject-WARNING **: invalid unclassed pointer in cast to 'GObject'
GLib-GObject-CRITICAL **: g_object_get: assertion 'G_IS_OBJECT (object)' failed


puis un plantage un peu plus loin.

Si je ne détruit pas le QMediaPlayer de la classe X je n'ai aucun soucis.... Et si je ré-instancie l'objet A après le delete de l'objet X pas de soucis non plus.

Je ne vois pas pourquoi le delete du QMediaPlayer membre de la classe X a un impact sur le QMediaPlayer membre de la classe A....

Des idées ?

Merci d'avance.

Réponses

  • Salut,
    aurais-tu un projet minimaliste qui montre le problème pour qu'on puisse tester ?
  • Projet réalisé sous Ubuntu 16.04 avec QtCreator 3.5.1 Basé sur Qt 5.5.1.

    Le son de la première fenêtre est joué grâce à un objet dédié à la lecture de son (singleton). Le son joué dans la fenetre popup utilise un QMediaPlayer local à la fenêtre (détruit à la fermeture).

    Quand on joue le son dans la première fenêtre pas de problème.
    -> Ouvrir la fenêtre popup et jouer un son "local"
    -> Fermer la fenêtre popup
    -> Réessayer de jouer un son avec l'objet dédié = soit message d'erreur, soit plantage de l'application.....

    zip
    zip
    QMediaPlayer_Exemple.zip
    1M
  • J'ai testé, je n'ai pas de plantage, mais cela ne joue rien, y a pas le fichier bip.wav ...

    Sinon, ce n'est pas la peine de joindre le dossier build, le dossier des sources suffit.
    delete soundPlayer::getInstance();
    Faire un delete sur un singleton est très curieux, d'autant que le destructeur de celui-ci devrait être privé.
  • J'ai joint le dossier build car il contient les fichiers .wav !

    Du coup tu me conseilles de ne pas faire de delete de l'instance ? La mémoire sera libérée à la fermeture du programme ?
  • December 2016 modifié
    L'appli ne plante pas non plus chez moi sous windows.
    +1 pour passer le destructeur en private,
    de plus, le destructeur de SoundPlayer doit mettre instance à nullptr, ou utiliser un smart pointer
    EDIT : pas testé sous linux
  • J'avoue ne pas avoir testé sous Windows... Merci à vous d'avoir pris le temps de tester. Vous n'avez même pas de message d'alerte en sortie de l'application ?

    Et merci des infos pour le destructeur.
  • December 2016 modifié
    Sur Ubuntu 15.10 ça plante:
    1 g_type_check_instance_cast 0x7ffff4a5f984
    2 ?? 0x7fffbb7c8e09
    3 gst_type_find_factory_call_function gsttypefindfactory.c 224 0x7fffba6242d3
    4 gst_type_find_helper_for_buffer gsttypefindhelper.c 537 0x7fffba8cec91
    5 gst_wavparse_add_src_pad gstwavparse.c 1781 0x7fffb421c6a7
    6 gst_wavparse_stream_data gstwavparse.c 1924 0x7fffb421cdf1
    7 gst_wavparse_loop gstwavparse.c 2063 0x7fffb4221a81
    8 gst_task_func gsttask.c 327 0x7fffba621fb3
    9 ?? 0x7ffff43832fe
    10 ?? 0x7ffff4382965
    11 start_thread pthread_create.c 333 0x7ffff54746aa
    12 clone clone.S 109 0x7ffff62e7eed
    Je viens de faire le test sur OSX, ça joue bien les sons et pas de plantage, donc bug spécifique à Linux.
  • December 2016 modifié
    @mpergand : pourrais-tu faire le test aussi sur QNX, Androis, iOS, raspbery, WinRT :D
  • Re,
    j'ai trouvé ça qui ressemble au problème :
    https://bugreports.qt.io/browse/QTBUG-50460
Connectez-vous ou Inscrivez-vous pour répondre.