X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Fmedia_list_view.c;h=4c830379fc5a8f6343c576482e8dec2a15bc3230;hb=b7e0d3cc4874d66dd0b2db433caa620664345eac;hp=8bd1e5a34b2ab41a9a9d241c0ab835af441e7124;hpb=ac88248aa3debe837c221de9632cacf6be9da3fc;p=vlc diff --git a/src/control/media_list_view.c b/src/control/media_list_view.c index 8bd1e5a34b..4c830379fc 100644 --- a/src/control/media_list_view.c +++ b/src/control/media_list_view.c @@ -3,7 +3,7 @@ * media_list.c). ***************************************************************************** * Copyright (C) 2007 the VideoLAN team - * $Id: flat_media_list.c 21287 2007-08-20 01:28:12Z pdherbemont $ + * $Id$ * * Authors: Pierre d'Herbemont * @@ -22,10 +22,21 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include "libvlc_internal.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include -#include -#include "vlc_arrays.h" +#include +#include +#include +#include + +#include "libvlc_internal.h" // Abuse, could and should be removed + +#include "media_internal.h" // Abuse, could and should be removed +#include "media_list_internal.h" // Abuse, could and should be removed +#include "media_list_view_internal.h" //#define DEBUG_FLAT_LIST @@ -47,17 +58,17 @@ media_list_subitem_added( const libvlc_event_t * p_event, void * p_user_data ); static void install_md_listener( libvlc_media_list_view_t * p_mlv, - libvlc_media_descriptor_t * p_md) + libvlc_media_t * p_md) { libvlc_media_list_t * p_mlist; - if((p_mlist = libvlc_media_descriptor_subitems( p_md, NULL ))) + if((p_mlist = libvlc_media_subitems( p_md ))) { libvlc_media_list_lock( p_mlist ); - int i, count = libvlc_media_list_count( p_mlist, NULL ); + int i, count = libvlc_media_list_count( p_mlist ); for( i = 0; i < count; i++) { libvlc_event_t added_event; - libvlc_media_descriptor_t * p_submd; + libvlc_media_t * p_submd; p_submd = libvlc_media_list_item_at_index( p_mlist, i, NULL ); /* Install our listeners */ @@ -67,14 +78,14 @@ install_md_listener( libvlc_media_list_view_t * p_mlv, added_event.u.media_list_item_added.item = p_submd; added_event.u.media_list_item_added.index = 0; if( p_mlv->pf_ml_item_added ) p_mlv->pf_ml_item_added( &added_event, p_mlv ); - libvlc_media_descriptor_release( p_submd ); + libvlc_media_release( p_submd ); } libvlc_event_attach( p_mlist->p_event_manager, libvlc_MediaListItemAdded, - media_list_item_added, p_mlv, NULL ); + media_list_item_added, p_mlv ); libvlc_event_attach( p_mlist->p_event_manager, libvlc_MediaListItemDeleted, - media_list_item_removed, p_mlv, NULL ); + media_list_item_removed, p_mlv ); libvlc_media_list_unlock( p_mlist ); libvlc_media_list_release( p_mlist ); } @@ -82,40 +93,36 @@ install_md_listener( libvlc_media_list_view_t * p_mlv, { /* No mlist, wait for a subitem added event */ libvlc_event_attach( p_md->p_event_manager, - libvlc_MediaDescriptorSubItemAdded, - media_list_subitem_added, p_mlv, NULL ); + libvlc_MediaSubItemAdded, + media_list_subitem_added, p_mlv ); } } static void uninstall_md_listener( libvlc_media_list_view_t * p_mlv, - libvlc_media_descriptor_t * p_md) + libvlc_media_t * p_md) { libvlc_media_list_t * p_mlist; - libvlc_exception_t ignored_exception; - libvlc_exception_init( &ignored_exception ); libvlc_event_detach( p_md->p_event_manager, - libvlc_MediaDescriptorSubItemAdded, - media_list_subitem_added, p_mlv, &ignored_exception ); - if( libvlc_exception_raised( &ignored_exception ) ) - libvlc_exception_clear( &ignored_exception ); /* We don't care if we encounter an exception */ - if((p_mlist = libvlc_media_descriptor_subitems( p_md, NULL ))) + libvlc_MediaSubItemAdded, + media_list_subitem_added, p_mlv ); + if((p_mlist = libvlc_media_subitems( p_md ))) { libvlc_media_list_lock( p_mlist ); libvlc_event_detach( p_mlist->p_event_manager, libvlc_MediaListItemAdded, - media_list_item_added, p_mlv, NULL ); + media_list_item_added, p_mlv ); libvlc_event_detach( p_mlist->p_event_manager, libvlc_MediaListItemDeleted, - media_list_item_removed, p_mlv, NULL ); + media_list_item_removed, p_mlv ); - int i, count = libvlc_media_list_count( p_mlist, NULL ); + int i, count = libvlc_media_list_count( p_mlist ); for( i = 0; i < count; i++) { - libvlc_media_descriptor_t * p_submd; + libvlc_media_t * p_submd; p_submd = libvlc_media_list_item_at_index( p_mlist,i, NULL ); uninstall_md_listener( p_mlv, p_submd ); - libvlc_media_descriptor_release( p_submd ); + libvlc_media_release( p_submd ); } libvlc_media_list_unlock( p_mlist ); libvlc_media_list_release( p_mlist ); @@ -126,7 +133,7 @@ static void media_list_item_added( const libvlc_event_t * p_event, void * p_user_data ) { libvlc_media_list_view_t * p_mlv = p_user_data; - libvlc_media_descriptor_t * p_md = p_event->u.media_list_item_added.item; + libvlc_media_t * p_md = p_event->u.media_list_item_added.item; install_md_listener( p_mlv, p_md ); if( p_mlv->pf_ml_item_added ) p_mlv->pf_ml_item_added( p_event, p_mlv ); } @@ -135,7 +142,7 @@ static void media_list_item_removed( const libvlc_event_t * p_event, void * p_user_data ) { libvlc_media_list_view_t * p_mlv = p_user_data; - libvlc_media_descriptor_t * p_md = p_event->u.media_list_item_added.item; + libvlc_media_t * p_md = p_event->u.media_list_item_added.item; uninstall_md_listener( p_mlv, p_md ); if( p_mlv->pf_ml_item_removed ) p_mlv->pf_ml_item_removed( p_event, p_mlv ); } @@ -146,24 +153,24 @@ media_list_subitem_added( const libvlc_event_t * p_event, void * p_user_data ) libvlc_media_list_t * p_mlist; libvlc_event_t added_event; libvlc_media_list_view_t * p_mlv = p_user_data; - libvlc_media_descriptor_t * p_submd = p_event->u.media_descriptor_subitem_added.new_child; - libvlc_media_descriptor_t * p_md = p_event->p_obj; + libvlc_media_t * p_submd = p_event->u.media_subitem_added.new_child; + libvlc_media_t * p_md = p_event->p_obj; - if((p_mlist = libvlc_media_descriptor_subitems( p_md, NULL ))) + if((p_mlist = libvlc_media_subitems( p_md ))) { /* We have a mlist to which we're going to listen to events * thus, no need to wait for SubItemAdded events */ libvlc_event_detach( p_md->p_event_manager, - libvlc_MediaDescriptorSubItemAdded, - media_list_subitem_added, p_mlv, NULL ); + libvlc_MediaSubItemAdded, + media_list_subitem_added, p_mlv ); libvlc_media_list_lock( p_mlist ); libvlc_event_attach( p_mlist->p_event_manager, libvlc_MediaListItemAdded, - media_list_item_added, p_mlv, NULL ); + media_list_item_added, p_mlv ); libvlc_event_attach( p_mlist->p_event_manager, libvlc_MediaListItemDeleted, - media_list_item_removed, p_mlv, NULL ); + media_list_item_removed, p_mlv ); libvlc_media_list_unlock( p_mlist ); libvlc_media_list_release( p_mlist ); } @@ -192,17 +199,17 @@ libvlc_media_list_view_set_ml_notification_callback( p_mlv->pf_ml_item_removed = item_removed; libvlc_event_attach( p_mlv->p_mlist->p_event_manager, libvlc_MediaListItemAdded, - media_list_item_added, p_mlv, NULL ); + media_list_item_added, p_mlv ); libvlc_event_attach( p_mlv->p_mlist->p_event_manager, libvlc_MediaListItemDeleted, - media_list_item_removed, p_mlv, NULL ); - int i, count = libvlc_media_list_count( p_mlv->p_mlist, NULL ); + media_list_item_removed, p_mlv ); + int i, count = libvlc_media_list_count( p_mlv->p_mlist ); for( i = 0; i < count; i++) { - libvlc_media_descriptor_t * p_md; + libvlc_media_t * p_md; p_md = libvlc_media_list_item_at_index( p_mlv->p_mlist, i, NULL ); install_md_listener( p_mlv, p_md ); - libvlc_media_descriptor_release( p_md ); + libvlc_media_release( p_md ); } } @@ -212,7 +219,7 @@ libvlc_media_list_view_set_ml_notification_callback( void libvlc_media_list_view_will_delete_item( libvlc_media_list_view_t * p_mlv, - libvlc_media_descriptor_t * p_item, + libvlc_media_t * p_item, int index ) { libvlc_event_t event; @@ -232,7 +239,7 @@ libvlc_media_list_view_will_delete_item( void libvlc_media_list_view_item_deleted( libvlc_media_list_view_t * p_mlv, - libvlc_media_descriptor_t * p_item, + libvlc_media_t * p_item, int index ) { libvlc_event_t event; @@ -252,7 +259,7 @@ libvlc_media_list_view_item_deleted( void libvlc_media_list_view_will_add_item( libvlc_media_list_view_t * p_mlv, - libvlc_media_descriptor_t * p_item, + libvlc_media_t * p_item, int index ) { libvlc_event_t event; @@ -272,7 +279,7 @@ libvlc_media_list_view_will_add_item( void libvlc_media_list_view_item_added( libvlc_media_list_view_t * p_mlv, - libvlc_media_descriptor_t * p_item, + libvlc_media_t * p_item, int index ) { libvlc_event_t event; @@ -294,27 +301,35 @@ libvlc_media_list_view_new( libvlc_media_list_t * p_mlist, libvlc_media_list_view_count_func_t pf_count, libvlc_media_list_view_item_at_index_func_t pf_item_at_index, libvlc_media_list_view_children_at_index_func_t pf_children_at_index, + libvlc_media_list_view_constructor_func_t pf_constructor, libvlc_media_list_view_release_func_t pf_release, - void * this_view_data, - libvlc_exception_t * p_e ) + void * this_view_data ) { libvlc_media_list_view_t * p_mlv; p_mlv = calloc( 1, sizeof(libvlc_media_list_view_t) ); - if( !p_mlv ) + if( unlikely(p_mlv == NULL) ) + { + libvlc_printerr( "Not enough memory" ); return NULL; + } p_mlv->p_libvlc_instance = p_mlist->p_libvlc_instance; p_mlv->p_event_manager = libvlc_event_manager_new( p_mlist, - p_mlv->p_libvlc_instance, p_e ); + p_mlv->p_libvlc_instance ); + if( unlikely(p_mlv->p_event_manager == NULL) ) + { + free(p_mlv); + return NULL; + } libvlc_event_manager_register_event_type( p_mlv->p_event_manager, - libvlc_MediaListViewItemAdded, p_e ); + libvlc_MediaListViewItemAdded ); libvlc_event_manager_register_event_type( p_mlv->p_event_manager, - libvlc_MediaListViewWillAddItem, p_e ); + libvlc_MediaListViewWillAddItem ); libvlc_event_manager_register_event_type( p_mlv->p_event_manager, - libvlc_MediaListViewItemDeleted, p_e ); + libvlc_MediaListViewItemDeleted ); libvlc_event_manager_register_event_type( p_mlv->p_event_manager, - libvlc_MediaListViewWillDeleteItem, p_e ); + libvlc_MediaListViewWillDeleteItem ); libvlc_media_list_retain( p_mlist ); p_mlv->p_mlist = p_mlist; @@ -322,11 +337,12 @@ libvlc_media_list_view_new( libvlc_media_list_t * p_mlist, p_mlv->pf_count = pf_count; p_mlv->pf_item_at_index = pf_item_at_index; p_mlv->pf_children_at_index = pf_children_at_index; + p_mlv->pf_constructor = pf_constructor; p_mlv->pf_release = pf_release; p_mlv->p_this_view_data = this_view_data; - vlc_mutex_init( p_mlv->p_libvlc_instance->p_libvlc_int, &p_mlv->object_lock ); + vlc_mutex_init( &p_mlv->object_lock ); p_mlv->i_refcount = 1; return p_mlv; @@ -370,21 +386,21 @@ libvlc_media_list_view_release( libvlc_media_list_view_t * p_mlv ) { libvlc_event_detach( p_mlv->p_mlist->p_event_manager, libvlc_MediaListItemAdded, - media_list_item_added, p_mlv, NULL ); + media_list_item_added, p_mlv ); } if( p_mlv->pf_ml_item_removed ) { libvlc_event_detach( p_mlv->p_mlist->p_event_manager, libvlc_MediaListItemDeleted, - media_list_item_removed, p_mlv, NULL ); + media_list_item_removed, p_mlv ); } - int i, count = libvlc_media_list_count( p_mlv->p_mlist, NULL ); + int i, count = libvlc_media_list_count( p_mlv->p_mlist ); for( i = 0; i < count; i++) { - libvlc_media_descriptor_t * p_md; + libvlc_media_t * p_md; p_md = libvlc_media_list_item_at_index( p_mlv->p_mlist, i, NULL ); uninstall_md_listener( p_mlv, p_md ); - libvlc_media_descriptor_release( p_md ); + libvlc_media_release( p_md ); } libvlc_media_list_unlock( p_mlv->p_mlist ); @@ -424,6 +440,27 @@ libvlc_media_list_view_parent_media_list( libvlc_media_list_view_t * p_mlv, return p_mlist; } +/************************************************************************** + * libvlc_media_list_view_children_for_item (Public) + **************************************************************************/ +libvlc_media_list_view_t * +libvlc_media_list_view_children_for_item( libvlc_media_list_view_t * p_mlv, + libvlc_media_t * p_md, + libvlc_exception_t * p_e) +{ + (void)p_e; + libvlc_media_list_t * p_mlist; + libvlc_media_list_view_t * ret; + + p_mlist = libvlc_media_subitems(p_md); + if(!p_mlist) return NULL; + + ret = p_mlv->pf_constructor( p_mlist, p_e ); + libvlc_media_list_release( p_mlist ); + + return ret; +} + /* Limited to four args, because it should be enough */ #define AN_SELECT( collapser, dec1, dec2, dec3, dec4, p, ...) p @@ -441,7 +478,8 @@ libvlc_media_list_view_parent_media_list( libvlc_media_list_view_t * p_mlv, { \ if( p_mlv->pf_##name ) \ return p_mlv->pf_##name ARGS(__VA_ARGS__) ; \ - libvlc_exception_raise( p_e, "No '" #name "' method in this media_list_view" ); \ + libvlc_exception_raise( p_e ); \ + libvlc_printerr( "No '" #name "' method in this media_list_view" ); \ return default_ret_value;\ } @@ -456,11 +494,12 @@ libvlc_media_list_view_parent_media_list( libvlc_media_list_view_t * p_mlv, p_mlv->pf_##name ARGS(__VA_ARGS__) ; \ return; \ } \ - libvlc_exception_raise( p_e, "No '" #name "' method in this media_list_view" ); \ + libvlc_exception_raise( p_e ); \ + libvlc_printerr( "No '" #name "' method in this media_list_view" ); \ } MEDIA_LIST_VIEW_FUNCTION( count, int, 0 ) -MEDIA_LIST_VIEW_FUNCTION( item_at_index, libvlc_media_descriptor_t *, NULL, int arg1 ) +MEDIA_LIST_VIEW_FUNCTION( item_at_index, libvlc_media_t *, NULL, int arg1 ) MEDIA_LIST_VIEW_FUNCTION( children_at_index, libvlc_media_list_view_t *, NULL, int arg1 )