📄 media_list_view.c
字号:
libvlc_event_send( p_mlv->p_event_manager, &event );}/************************************************************************** * libvlc_media_list_view_will_add_item (Internal) **************************************************************************/voidlibvlc_media_list_view_will_add_item( libvlc_media_list_view_t * p_mlv, libvlc_media_t * p_item, int index ){ libvlc_event_t event; /* Construct the event */ event.type = libvlc_MediaListViewWillAddItem; event.u.media_list_view_will_add_item.item = p_item; event.u.media_list_view_will_add_item.index = index; /* Send the event */ libvlc_event_send( p_mlv->p_event_manager, &event );}/************************************************************************** * libvlc_media_list_view_item_added (Internal) **************************************************************************/voidlibvlc_media_list_view_item_added( libvlc_media_list_view_t * p_mlv, libvlc_media_t * p_item, int index ){ libvlc_event_t event; /* Construct the event */ event.type = libvlc_MediaListViewItemAdded; event.u.media_list_view_item_added.item = p_item; event.u.media_list_view_item_added.index = index; /* Send the event */ libvlc_event_send( p_mlv->p_event_manager, &event );}/************************************************************************** * libvlc_media_list_view_new (Internal) **************************************************************************/libvlc_media_list_view_t *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 ){ libvlc_media_list_view_t * p_mlv; p_mlv = calloc( 1, sizeof(libvlc_media_list_view_t) ); if( !p_mlv ) 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 ); libvlc_event_manager_register_event_type( p_mlv->p_event_manager, libvlc_MediaListViewItemAdded, p_e ); libvlc_event_manager_register_event_type( p_mlv->p_event_manager, libvlc_MediaListViewWillAddItem, p_e ); libvlc_event_manager_register_event_type( p_mlv->p_event_manager, libvlc_MediaListViewItemDeleted, p_e ); libvlc_event_manager_register_event_type( p_mlv->p_event_manager, libvlc_MediaListViewWillDeleteItem, p_e ); libvlc_media_list_retain( p_mlist ); p_mlv->p_mlist = 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->object_lock ); p_mlv->i_refcount = 1; return p_mlv;}/* * Public libvlc functions *//************************************************************************** * libvlc_media_list_view_retain (Public) **************************************************************************/voidlibvlc_media_list_view_retain( libvlc_media_list_view_t * p_mlv ){ vlc_mutex_lock( &p_mlv->object_lock ); p_mlv->i_refcount++; vlc_mutex_unlock( &p_mlv->object_lock );}/************************************************************************** * libvlc_media_list_view_release (Public) **************************************************************************/voidlibvlc_media_list_view_release( libvlc_media_list_view_t * p_mlv ){ vlc_mutex_lock( &p_mlv->object_lock ); p_mlv->i_refcount--; if( p_mlv->i_refcount > 0 ) { vlc_mutex_unlock( &p_mlv->object_lock ); return; } vlc_mutex_unlock( &p_mlv->object_lock ); /* Refcount null, time to free */ libvlc_media_list_lock( p_mlv->p_mlist ); if( p_mlv->pf_ml_item_added ) { libvlc_event_detach( p_mlv->p_mlist->p_event_manager, libvlc_MediaListItemAdded, media_list_item_added, p_mlv, NULL ); } 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 ); } int i, count = libvlc_media_list_count( p_mlv->p_mlist, NULL ); for( i = 0; i < count; i++) { 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_release( p_md ); } libvlc_media_list_unlock( p_mlv->p_mlist ); libvlc_event_manager_release( p_mlv->p_event_manager ); if( p_mlv->pf_release ) p_mlv->pf_release( p_mlv ); libvlc_media_list_release( p_mlv->p_mlist ); vlc_mutex_destroy( &p_mlv->object_lock );}/************************************************************************** * libvlc_media_list_view_event_manager (Public) **************************************************************************/libvlc_event_manager_t *libvlc_media_list_view_event_manager( libvlc_media_list_view_t * p_mlv ){ libvlc_event_manager_t * p_em; vlc_mutex_lock( &p_mlv->object_lock ); p_em = p_mlv->p_event_manager; vlc_mutex_unlock( &p_mlv->object_lock ); return p_em;}/************************************************************************** * libvlc_media_list_view_parent_media_list (Public) **************************************************************************/libvlc_media_list_t *libvlc_media_list_view_parent_media_list( libvlc_media_list_view_t * p_mlv, libvlc_exception_t * p_e){ (void)p_e; libvlc_media_list_t * p_mlist; vlc_mutex_lock( &p_mlv->object_lock ); p_mlist = p_mlv->p_mlist; libvlc_media_list_retain( p_mlv->p_mlist ); vlc_mutex_unlock( &p_mlv->object_lock ); 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, p_e); 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#define ARGS(...) AN_SELECT( collapser, ##__VA_ARGS__, \ (p_mlv, arg1, arg2, arg3, arg4, p_e), \ (p_mlv, arg1, arg2, arg3, p_e), \ (p_mlv, arg1, arg2, p_e), \ (p_mlv, arg1, p_e), (p_mlv, p_e) )#define MEDIA_LIST_VIEW_FUNCTION( name, ret_type, default_ret_value, /* Params */ ... ) \ ret_type \ libvlc_media_list_view_##name( libvlc_media_list_view_t * p_mlv, \ ##__VA_ARGS__, \ libvlc_exception_t * p_e ) \ { \ 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" ); \ return default_ret_value;\ }#define MEDIA_LIST_VIEW_FUNCTION_VOID_RET( name, /* Params */ ... ) \ void \ libvlc_media_list_view_##name( libvlc_media_list_view_t * p_mlv, \ ##__VA_ARGS__, \ libvlc_exception_t * p_e ) \ { \ if( p_mlv->pf_##name ) \ { \ p_mlv->pf_##name ARGS(__VA_ARGS__) ; \ return; \ } \ libvlc_exception_raise( p_e, "No '" #name "' method in this media_list_view" ); \ }MEDIA_LIST_VIEW_FUNCTION( count, int, 0 )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 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -