]> git.sesse.net Git - vlc/commitdiff
libvlc: add libvlc_MediaListEndReached event
authorThomas Guillem <thomas@gllm.fr>
Tue, 20 Jan 2015 09:46:31 +0000 (10:46 +0100)
committerJean-Baptiste Kempf <jb@videolan.org>
Tue, 20 Jan 2015 10:20:28 +0000 (11:20 +0100)
Expose an event to libvlc users which allows them to get notified when a media
list reached the end. That is, when the media list is attached to a media
(subitems) that completed a parsing. Or when the media list is attached to a
media discovery that stopped.

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
include/vlc/libvlc_events.h
lib/media.c
lib/media_discoverer.c
lib/media_list.c
lib/media_list_internal.h

index 963163a402871a430c687acfd7eabbd4a9de0e21..c99e25c8c9a6add1ae0f526fcc448fb1ea43fca2 100644 (file)
@@ -82,6 +82,7 @@ enum libvlc_event_e {
     libvlc_MediaListWillAddItem,
     libvlc_MediaListItemDeleted,
     libvlc_MediaListWillDeleteItem,
+    libvlc_MediaListEndReached,
 
     libvlc_MediaListViewItemAdded=0x300,
     libvlc_MediaListViewWillAddItem,
index b8b7620c1b5d23fb8933ba6075f6b06103b2094d..6f3440b88cbf5e3e39440171599859000c214889 100644 (file)
@@ -164,8 +164,18 @@ static void input_item_subitemtree_added( const vlc_event_t * p_event,
 {
     VLC_UNUSED( p_event );
     libvlc_media_t * p_md = user_data;
+    libvlc_media_list_t *p_subitems;
     libvlc_event_t event;
 
+    /* notify the media list */
+    p_subitems = media_get_subitems( p_md );
+    if( p_subitems != NULL )
+    {
+        libvlc_media_list_lock( p_subitems );
+        libvlc_media_list_internal_end_reached( p_subitems );
+        libvlc_media_list_unlock( p_subitems );
+    }
+
     /* Construct the event */
     event.type = libvlc_MediaSubItemTreeAdded;
     event.u.media_subitemtree_added.item = p_md;
index c914e3a3ac84525fd26c4a904ff19f6519c68d0f..4e11c80aef22c2861c90bbca811c26a8ec49bd33 100644 (file)
@@ -169,8 +169,15 @@ static void services_discovery_ended( const vlc_event_t * p_event,
 {
     VLC_UNUSED(p_event);
     libvlc_media_discoverer_t * p_mdis = user_data;
+    libvlc_media_list_t * p_mlist = p_mdis->p_mlist;
     libvlc_event_t event;
+
     p_mdis->running = false;
+
+    libvlc_media_list_lock( p_mlist );
+    libvlc_media_list_internal_end_reached( p_mlist );
+    libvlc_media_list_unlock( p_mlist );
+
     event.type = libvlc_MediaDiscovererEnded;
     libvlc_event_send( p_mdis->p_event_manager, &event );
 }
index 74218b0a6ca95811a6a61b5f82b5ab06e13af058..28479e18db8d53922ce92de6b1f9ca3254190a71 100644 (file)
@@ -122,6 +122,17 @@ notify_item_deletion( libvlc_media_list_t * p_mlist,
     libvlc_event_send( p_mlist->p_event_manager, &event );
 }
 
+/* LibVLC internal */
+void libvlc_media_list_internal_end_reached( libvlc_media_list_t * p_mlist )
+{
+    libvlc_event_t event;
+
+    event.type = libvlc_MediaListEndReached;
+
+    /* Send the event */
+    libvlc_event_send( p_mlist->p_event_manager, &event );
+}
+
 /**************************************************************************
  *       static mlist_is_writable (private)
  **************************************************************************/
@@ -176,6 +187,8 @@ libvlc_media_list_new( libvlc_instance_t * p_inst )
             libvlc_MediaListItemDeleted );
     libvlc_event_manager_register_event_type( p_mlist->p_event_manager,
             libvlc_MediaListWillDeleteItem );
+    libvlc_event_manager_register_event_type( p_mlist->p_event_manager,
+            libvlc_MediaListEndReached );
 
     vlc_mutex_init( &p_mlist->object_lock );
     vlc_mutex_init( &p_mlist->refcount_lock ); // FIXME: spinlock?
index 47d2fbf807577953c43610ede3c4762a65cee74d..40b34da992e391fffa373964f17ace9948764852 100644 (file)
@@ -64,4 +64,6 @@ void libvlc_media_list_internal_insert_media(
 int libvlc_media_list_internal_remove_index(
         libvlc_media_list_t * p_mlist, int index );
 
+void libvlc_media_list_internal_end_reached(
+        libvlc_media_list_t * p_mlist );
 #endif