[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