[vlc-devel] [PATCH] libvlc: fix "media changed" notification

Romain Vimont rom1v at videolabs.io
Mon Apr 27 18:02:54 CEST 2020


---

Thank you very much for the provided details. Here is a proposal to fix the
reported issue (see code comments for details).

(I'm not very happy with core item wrapping into LibVLC media, but it is
necessary to keep a stable LibVLC API while the core can change.)

Regards,
Romain

 lib/media_player.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/lib/media_player.c b/lib/media_player.c
index 96af310c340..65eee704f64 100644
--- a/lib/media_player.c
+++ b/lib/media_player.c
@@ -872,6 +872,27 @@ void libvlc_media_player_set_media(
     }
     p_mi->p_md = p_md;
 
+    /*
+     * The input_item_t wrapped in the libvlc_media_t is set to the core player
+     * via vlc_player_SetCurrentMedia(), which notifies the
+     * libvlc_media_player_t of the change.
+     *
+     * But the notification only provides the core input_item_t instance, it
+     * may not provide the LibVLC wrapper libvlc_media_t.
+     *
+     * As a consequence, to avoid resetting p_mi->p_md by a new instance of
+     * libvlc_media_t wrapping the same input_item_t, the notification handler
+     * (on_current_media_changed) keeps the existing instance if it already
+     * wraps the expected input_item_t, and ignore the change.
+     *
+     * But the listeners registered by LibVLC client must still be notified, so
+     * send an event separately here.
+     */
+    libvlc_event_t event;
+    event.type = libvlc_MediaPlayerMediaChanged;
+    event.u.media_player_media_changed.new_media = p_md;
+    libvlc_event_send(&p_mi->event_manager, &event);
+
     vlc_player_SetCurrentMedia(p_mi->player, p_md->p_input_item);
 
     /* The policy here is to ignore that we were created using a different
-- 
2.26.2



More information about the vlc-devel mailing list