]> git.sesse.net Git - vlc/blobdiff - src/control/media_list.c
control/flat_media_list_view.c: Use the new media_list_view object. (Plus minor heade...
[vlc] / src / control / media_list.c
index bf069173346ca659e8b3e49ccc38fec82d8509d9..8463fb18f07167724fad7d4a9f83d82bd98619f4 100644 (file)
@@ -74,141 +74,6 @@ notify_item_deletion( libvlc_media_list_t * p_mlist,
     libvlc_event_send( p_mlist->p_event_manager, &event );
 }
 
-/**************************************************************************
- *       media_descriptor_changed (private) (libvlc Event Callback )
- *
- * An item has changed.
- **************************************************************************/
-static void
-media_descriptor_changed( const libvlc_event_t * p_event, void * user_data )
-{
-    libvlc_media_list_t * p_mlist = user_data;
-    libvlc_media_descriptor_t * p_md = p_event->p_obj;
-    libvlc_event_t event;
-    
-    /* Construct the new media list event */
-    event.type = libvlc_MediaListItemChanged;
-    event.u.media_list_item_changed.item = p_md;
-
-    /* XXX: this is not good, but there is a solution in the pipeline */
-    event.u.media_list_item_changed.index =
-        libvlc_media_list_index_of_item( p_mlist, p_md, NULL );
-
-    /* Send the event */
-    libvlc_event_send( p_mlist->p_event_manager, &event );
-}
-
-/**************************************************************************
- *       install_media_descriptor_observer (private)
- *
- * Do the appropriate action when an item is deleted.
- **************************************************************************/
-static void
-install_media_descriptor_observer( libvlc_media_list_t * p_mlist,
-                                   libvlc_media_descriptor_t * p_md )
-{
-    libvlc_event_attach( p_md->p_event_manager,
-                         libvlc_MediaDescriptorMetaChanged,
-                         media_descriptor_changed,
-                         p_mlist, NULL );
-}
-
-/**************************************************************************
- *       uninstall_media_descriptor_observer (private)
- *
- * Do the appropriate action when an item is deleted.
- **************************************************************************/
-static void
-uninstall_media_descriptor_observer( libvlc_media_list_t * p_mlist,
-                                     libvlc_media_descriptor_t * p_md )
-{
-    libvlc_event_detach( p_md->p_event_manager,
-                         libvlc_MediaDescriptorMetaChanged,
-                         media_descriptor_changed,
-                         p_mlist, NULL );
-}
-
-/**************************************************************************
- *       dynamic_list_propose_item (private) (Event Callback)
- *
- * This is called if the dynamic sublist's data provider adds a new item.
- **************************************************************************/
-static void
-dynamic_list_propose_item( const libvlc_event_t * p_event, void * p_user_data )
-{
-    libvlc_media_list_t * p_submlist = p_user_data;
-    libvlc_media_descriptor_t * p_md = p_event->u.media_list_item_added.item;
-
-    //libvlc_media_descriptor_lock( p_md );
-    if( libvlc_tag_query_match( p_submlist->p_query, p_md, NULL ) )
-    {
-        libvlc_media_list_lock( p_submlist );
-        libvlc_media_list_add_media_descriptor( p_submlist, p_md, NULL );
-        libvlc_media_list_unlock( p_submlist );
-    }
-    //libvlc_media_descriptor_unlock( p_md );
-}
-
-/**************************************************************************
- *       dynamic_list_remove_item (private) (Event Callback)
- *
- * This is called if the dynamic sublist's data provider adds a new item.
- **************************************************************************/
-static void
-dynamic_list_remove_item( const libvlc_event_t * p_event, void * p_user_data )
-{
-    libvlc_media_list_t * p_submlist = p_user_data;
-    libvlc_media_descriptor_t * p_md = p_event->u.media_list_item_deleted.item;
-
-    //libvlc_media_descriptor_lock( p_md );
-    if( libvlc_tag_query_match( p_submlist->p_query, p_md, NULL ) )
-    {
-        int i;
-        libvlc_media_list_lock( p_submlist );        
-        i = libvlc_media_list_index_of_item( p_submlist, p_md, NULL );
-        if ( i < 0 )
-        {
-            /* We've missed one item addition, that could happen especially
-             * if we add item in a threaded maner, so we just ignore */
-            libvlc_media_list_unlock( p_submlist );
-            //libvlc_media_descriptor_unlock( p_md );           
-            return;
-        }
-        libvlc_media_list_remove_index( p_submlist, i, NULL );
-        libvlc_media_list_unlock( p_submlist );
-    }
-    //libvlc_media_descriptor_unlock( p_md );
-}
-
-/**************************************************************************
- *       dynamic_list_change_item (private) (Event Callback)
- *
- * This is called if the dynamic sublist's data provider adds a new item.
- **************************************************************************/
-static void
-dynamic_list_change_item( const libvlc_event_t * p_event , void * p_user_data)
-{
-    libvlc_media_list_t * p_submlist = p_user_data;
-    libvlc_media_descriptor_t * p_md = p_event->u.media_list_item_changed.item;
-    int index;
-
-    libvlc_media_list_lock( p_submlist );        
-    
-    index = libvlc_media_list_index_of_item( p_submlist, p_md, NULL );
-    if( index < 0 )
-    {
-        libvlc_media_list_unlock( p_submlist );     
-        return; /* Not found, no prob, just ignore */
-    }
-
-    //libvlc_media_descriptor_lock( p_md );
-    if( !libvlc_tag_query_match( p_submlist->p_query, p_md, NULL ) )
-        libvlc_media_list_remove_index( p_submlist, index, NULL );
-    //libvlc_media_descriptor_unlock( p_md );
-
-    libvlc_media_list_unlock( p_submlist );        
-}
-
 /*
  * Public libvlc functions
  */
@@ -228,14 +93,15 @@ libvlc_media_list_new( libvlc_instance_t * p_inst,
 
     if( !p_mlist )
         return NULL;
-    
     p_mlist->p_libvlc_instance = p_inst;
     p_mlist->p_event_manager = libvlc_event_manager_new( p_mlist, p_inst, p_e );
 
+    /* Code for that one should be handled in flat_media_list.c */
+    p_mlist->p_flat_mlist = NULL;
+
     libvlc_event_manager_register_event_type( p_mlist->p_event_manager,
             libvlc_MediaListItemAdded, p_e );
-    libvlc_event_manager_register_event_type( p_mlist->p_event_manager,
-            libvlc_MediaListItemChanged, p_e );
     libvlc_event_manager_register_event_type( p_mlist->p_event_manager,
             libvlc_MediaListItemDeleted, p_e );
 
@@ -247,10 +113,10 @@ libvlc_media_list_new( libvlc_instance_t * p_inst,
     }
 
     vlc_mutex_init( p_inst->p_libvlc_int, &p_mlist->object_lock );
-    
-    ARRAY_INIT(p_mlist->items);
+    vlc_array_init( &p_mlist->items );
     p_mlist->i_refcount = 1;
-    p_mlist->p_media_provider = NULL;
+    p_mlist->p_md = NULL;
 
     return p_mlist;
 }
@@ -263,32 +129,36 @@ libvlc_media_list_new( libvlc_instance_t * p_inst,
 void libvlc_media_list_release( libvlc_media_list_t * p_mlist )
 {
     libvlc_media_descriptor_t * p_md;
+    int i;
 
     vlc_mutex_lock( &p_mlist->object_lock );
     p_mlist->i_refcount--;
     if( p_mlist->i_refcount > 0 )
     {
-        vlc_mutex_unlock( &p_mlist->object_lock );        
+        vlc_mutex_unlock( &p_mlist->object_lock );
         return;
     }
-    vlc_mutex_unlock( &p_mlist->object_lock );        
+    vlc_mutex_unlock( &p_mlist->object_lock );
 
     /* Refcount null, time to free */
-    if( p_mlist->p_media_provider )
-        libvlc_media_list_release( p_mlist->p_media_provider );
-
-    if( p_mlist->p_query )
-        libvlc_tag_query_release( p_mlist->p_query );
 
     libvlc_event_manager_release( p_mlist->p_event_manager );
 
-    FOREACH_ARRAY( p_md, p_mlist->items )
-        uninstall_media_descriptor_observer( p_mlist, p_md );
+    if( p_mlist->p_md )
+        libvlc_media_descriptor_release( p_mlist->p_md );
+
+    for ( i = 0; i < vlc_array_count( &p_mlist->items ); i++ )
+    {
+        p_md = vlc_array_item_at_index( &p_mlist->items, i );
         libvlc_media_descriptor_release( p_md );
-    FOREACH_END()
+    }
+
+    vlc_mutex_destroy( &p_mlist->object_lock );
+    vlc_array_clear( &p_mlist->items );
+
     free( p_mlist );
 }
+
 /**************************************************************************
  *       libvlc_media_list_retain (Public)
  *
@@ -301,6 +171,88 @@ void libvlc_media_list_retain( libvlc_media_list_t * p_mlist )
     vlc_mutex_unlock( &p_mlist->object_lock );
 }
 
+
+/**************************************************************************
+ *       add_file_content (Public)
+ **************************************************************************/
+void
+libvlc_media_list_add_file_content( libvlc_media_list_t * p_mlist,
+                                    const char * psz_uri,
+                                    libvlc_exception_t * p_e )
+{
+    input_item_t * p_input_item;
+    libvlc_media_descriptor_t * p_md;
+
+    p_input_item = input_ItemNewExt( p_mlist->p_libvlc_instance->p_libvlc_int, psz_uri,
+                                _("Media Library"), 0, NULL, -1 );
+
+    if( !p_input_item )
+    {
+        libvlc_exception_raise( p_e, "Can't create an input item" );
+        return;
+    }
+
+    p_md = libvlc_media_descriptor_new_from_input_item(
+            p_mlist->p_libvlc_instance,
+            p_input_item, p_e );
+
+    if( !p_md )
+    {
+        vlc_gc_decref( p_input_item );
+        return;
+    }
+
+    libvlc_media_list_add_media_descriptor( p_mlist, p_md, p_e );
+    if( libvlc_exception_raised( p_e ) )
+        return;
+
+    input_Read( p_mlist->p_libvlc_instance->p_libvlc_int, p_input_item, VLC_TRUE );
+
+    return;
+}
+
+/**************************************************************************
+ *       set_media_descriptor (Public)
+ **************************************************************************/
+void libvlc_media_list_set_media_descriptor( libvlc_media_list_t * p_mlist,
+                                             libvlc_media_descriptor_t * p_md,
+                                             libvlc_exception_t * p_e)
+
+{
+    (void)p_e;
+    vlc_mutex_lock( &p_mlist->object_lock );
+    if( p_mlist->p_md )
+        libvlc_media_descriptor_release( p_mlist->p_md );
+    libvlc_media_descriptor_retain( p_md );
+    p_mlist->p_md = p_md;
+    vlc_mutex_unlock( &p_mlist->object_lock );
+}
+
+/**************************************************************************
+ *       media_descriptor (Public)
+ *
+ * If this media_list comes is a media_descriptor's subitems,
+ * This holds the corresponding media_descriptor.
+ * This md is also seen as the information holder for the media_list.
+ * Indeed a media_list can have meta information through this
+ * media_descriptor.
+ **************************************************************************/
+libvlc_media_descriptor_t *
+libvlc_media_list_media_descriptor( libvlc_media_list_t * p_mlist,
+                                    libvlc_exception_t * p_e)
+{
+    libvlc_media_descriptor_t *p_md;
+    (void)p_e;
+
+    vlc_mutex_lock( &p_mlist->object_lock );
+    p_md = p_mlist->p_md;
+    if( p_md )
+        libvlc_media_descriptor_retain( p_md );
+    vlc_mutex_unlock( &p_mlist->object_lock );
+
+    return p_md;
+}
+
 /**************************************************************************
  *       libvlc_media_list_count (Public)
  *
@@ -310,7 +262,7 @@ int libvlc_media_list_count( libvlc_media_list_t * p_mlist,
                              libvlc_exception_t * p_e )
 {
     (void)p_e;
-    return p_mlist->items.i_size;
+    return vlc_array_count( &p_mlist->items );
 }
 
 /**************************************************************************
@@ -318,16 +270,15 @@ int libvlc_media_list_count( libvlc_media_list_t * p_mlist,
  *
  * Lock should be hold when entering.
  **************************************************************************/
-void libvlc_media_list_add_media_descriptor( 
+void libvlc_media_list_add_media_descriptor(
                                    libvlc_media_list_t * p_mlist,
                                    libvlc_media_descriptor_t * p_md,
                                    libvlc_exception_t * p_e )
 {
     (void)p_e;
     libvlc_media_descriptor_retain( p_md );
-    ARRAY_APPEND( p_mlist->items, p_md );
-    notify_item_addition( p_mlist, p_md, p_mlist->items.i_size-1 );
-    install_media_descriptor_observer( p_mlist, p_md );
+    vlc_array_append( &p_mlist->items, p_md );
+    notify_item_addition( p_mlist, p_md, vlc_array_count( &p_mlist->items )-1 );
 }
 
 /**************************************************************************
@@ -335,7 +286,7 @@ void libvlc_media_list_add_media_descriptor(
  *
  * Lock should be hold when entering.
  **************************************************************************/
-void libvlc_media_list_insert_media_descriptor( 
+void libvlc_media_list_insert_media_descriptor(
                                    libvlc_media_list_t * p_mlist,
                                    libvlc_media_descriptor_t * p_md,
                                    int index,
@@ -344,9 +295,8 @@ void libvlc_media_list_insert_media_descriptor(
     (void)p_e;
     libvlc_media_descriptor_retain( p_md );
 
-    ARRAY_INSERT( p_mlist->items, p_md, index);
+    vlc_array_insert( &p_mlist->items, p_md, index );
     notify_item_addition( p_mlist, p_md, index );
-    install_media_descriptor_observer( p_mlist, p_md );
 }
 
 /**************************************************************************
@@ -360,11 +310,9 @@ void libvlc_media_list_remove_index( libvlc_media_list_t * p_mlist,
 {
     libvlc_media_descriptor_t * p_md;
 
-    p_md = ARRAY_VAL( p_mlist->items, index );
-
-    uninstall_media_descriptor_observer( p_mlist, p_md );
+    p_md = vlc_array_item_at_index( &p_mlist->items, index );
 
-    ARRAY_REMOVE( p_mlist->items, index )
+    vlc_array_remove( &p_mlist->items, index );
     notify_item_deletion( p_mlist, p_md, index );
 
     libvlc_media_descriptor_release( p_md );
@@ -380,7 +328,8 @@ libvlc_media_list_item_at_index( libvlc_media_list_t * p_mlist,
                                  int index,
                                  libvlc_exception_t * p_e )
 {
-    libvlc_media_descriptor_t * p_md =  ARRAY_VAL( p_mlist->items, index );
+    libvlc_media_descriptor_t * p_md;
+    p_md = vlc_array_item_at_index( &p_mlist->items, index );
     libvlc_media_descriptor_retain( p_md );
     return p_md;
 }
@@ -396,10 +345,13 @@ int libvlc_media_list_index_of_item( libvlc_media_list_t * p_mlist,
                                      libvlc_exception_t * p_e )
 {
     libvlc_media_descriptor_t * p_md;
-    FOREACH_ARRAY( p_md, p_mlist->items )
+    int i;
+    for ( i = 0; i < vlc_array_count( &p_mlist->items ); i++ )
+    {
+        p_md = vlc_array_item_at_index( &p_mlist->items, i );
         if( p_searched_md == p_md )
-            return fe_idx; /* Once more, we hate macro for that */
-    FOREACH_END()
+            return i;
+    }
     return -1;
 }
 
@@ -439,66 +391,3 @@ libvlc_media_list_event_manager( libvlc_media_list_t * p_mlist,
     (void)p_e;
     return p_mlist->p_event_manager;
 }
-
-/**************************************************************************
- *       libvlc_media_list_dynamic_sublist (Public)
- *
- * Lock should be hold when entering.
- **************************************************************************/
-libvlc_media_list_t *
-libvlc_media_list_dynamic_sublist( libvlc_media_list_t * p_mlist,
-                                   libvlc_tag_query_t * p_query,
-                                   libvlc_exception_t * p_e )
-{
-    libvlc_media_list_t * p_submlist;
-    libvlc_event_manager_t * p_em;
-    int count, i;
-
-    (void)p_e;
-
-    p_submlist = libvlc_media_list_new( p_mlist->p_libvlc_instance, p_e );
-    if( !p_submlist )
-    {
-        if( !libvlc_exception_raised( p_e ) )
-            libvlc_exception_raise( p_e, "Can't get the new media_list" );
-        return NULL;
-    }
-
-    /* We have a query */
-    libvlc_tag_query_retain( p_query );
-    p_submlist->p_query = p_query;
-
-    /* We have a media provider */
-    libvlc_media_list_retain( p_mlist );
-    p_submlist->p_media_provider = p_mlist;
-
-
-    libvlc_media_list_lock( p_submlist );        
-    
-    count = libvlc_media_list_count( p_mlist, p_e );
-
-    /* This should be running in a thread, a good plan to achieve that
-     * move all the dynamic code to libvlc_tag_query. */
-    for( i = 0; i < count; i++ )
-    {
-        libvlc_media_descriptor_t * p_md;
-        p_md = libvlc_media_list_item_at_index( p_mlist, i, p_e );
-        if( libvlc_tag_query_match( p_query, p_md, NULL ) )
-            libvlc_media_list_add_media_descriptor( p_submlist, p_md, p_e );
-    }
-
-    /* And we will listen to its event, so we can update p_submlist
-     * accordingly */
-    p_em = libvlc_media_list_event_manager( p_mlist, p_e );
-    libvlc_event_attach( p_em, libvlc_MediaListItemAdded,
-                         dynamic_list_propose_item, p_submlist, p_e );
-    libvlc_event_attach( p_em, libvlc_MediaListItemDeleted,
-                         dynamic_list_remove_item, p_submlist, p_e );
-    libvlc_event_attach( p_em, libvlc_MediaListItemChanged,
-                         dynamic_list_change_item, p_submlist, p_e );
-
-    libvlc_media_list_unlock( p_submlist );        
-
-    return p_submlist;
-}
-