X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_input.h;h=e185d4c40bd4f143bdc81cf0029a754303f35ff5;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=c8085ab54b4a33d0424525b9f232299078bfb3ed;hpb=d084716eb5081691858acc9b9539aaa9a30d55ba;p=vlc diff --git a/include/vlc_input.h b/include/vlc_input.h index c8085ab54b..e185d4c40b 100644 --- a/include/vlc_input.h +++ b/include/vlc_input.h @@ -33,6 +33,9 @@ #include #include #include +#include + +#include /* strcasestr() */ struct vlc_meta_t; @@ -79,21 +82,22 @@ struct input_item_t int i_nb_played; /**< Number of times played */ vlc_meta_t *p_meta; - + + vlc_event_manager_t event_manager; + vlc_mutex_t lock; /**< Lock for the item */ }; #define ITEM_TYPE_UNKNOWN 0 -#define ITEM_TYPE_AFILE 1 -#define ITEM_TYPE_VFILE 2 -#define ITEM_TYPE_DIRECTORY 3 -#define ITEM_TYPE_DISC 4 -#define ITEM_TYPE_CDDA 5 -#define ITEM_TYPE_CARD 6 -#define ITEM_TYPE_NET 7 -#define ITEM_TYPE_PLAYLIST 8 -#define ITEM_TYPE_NODE 9 -#define ITEM_TYPE_NUMBER 10 +#define ITEM_TYPE_FILE 1 +#define ITEM_TYPE_DIRECTORY 2 +#define ITEM_TYPE_DISC 3 +#define ITEM_TYPE_CDDA 4 +#define ITEM_TYPE_CARD 5 +#define ITEM_TYPE_NET 6 +#define ITEM_TYPE_PLAYLIST 7 +#define ITEM_TYPE_NODE 8 +#define ITEM_TYPE_NUMBER 9 static inline void input_ItemInit( vlc_object_t *p_o, input_item_t *p_i ) { @@ -111,6 +115,11 @@ static inline void input_ItemInit( vlc_object_t *p_o, input_item_t *p_i ) p_i->p_meta = NULL; vlc_mutex_init( p_o, &p_i->lock ); + vlc_event_manager_init( &p_i->event_manager, p_i, p_o ); + vlc_event_manager_register_event_type( &p_i->event_manager, + vlc_InputItemMetaChanged ); + vlc_event_manager_register_event_type( &p_i->event_manager, + vlc_InputItemSubItemAdded ); } static inline void input_ItemCopyOptions( input_item_t *p_parent, @@ -128,6 +137,29 @@ static inline void input_ItemCopyOptions( input_item_t *p_parent, } } +static inline void input_item_SetName( input_item_t *p_item, const char *psz_name ) +{ + if( p_item->psz_name ) free( p_item->psz_name ); + p_item->psz_name = strdup( psz_name ); +} + +/* This won't hold the item, but can tell to interested third parties + * Like the playlist, that there is a new sub item. With this design + * It is not the input item's responsability to keep all the ref of + * the input item children. */ +static inline void input_ItemAddSubItem( input_item_t *p_parent, + input_item_t *p_child ) +{ + vlc_event_t event; + + p_parent->i_type = ITEM_TYPE_PLAYLIST; + + /* Notify interested third parties */ + event.type = vlc_InputItemSubItemAdded; + event.u.input_item_subitem_added.p_new_child = p_child; + vlc_event_send( &p_parent->event_manager, &event ); +} + VLC_EXPORT( void, input_ItemAddOption,( input_item_t *, const char * ) ); VLC_EXPORT( void, input_ItemAddOptionNoDup,( input_item_t *, const char * ) ); @@ -135,6 +167,8 @@ static inline void input_ItemClean( input_item_t *p_i ) { int i; + vlc_event_manager_fini( &p_i->event_manager ); + free( p_i->psz_name ); free( p_i->psz_uri ); if( p_i->p_stats ) @@ -187,16 +221,91 @@ static inline void input_ItemClean( input_item_t *p_i ) static inline void input_item_SetMeta( input_item_t *p_i, vlc_meta_type_t meta_type, const char *psz_val ) { + vlc_event_t event; + + vlc_mutex_lock( &p_i->lock ); if( !p_i->p_meta ) p_i->p_meta = vlc_meta_New(); vlc_meta_Set( p_i->p_meta, meta_type, psz_val ); + vlc_mutex_unlock( &p_i->lock ); + + /* Notify interested third parties */ + event.type = vlc_InputItemMetaChanged; + event.u.input_item_meta_changed.meta_type = meta_type; + vlc_event_send( &p_i->event_manager, &event ); } -static inline const char * input_item_GetMeta( input_item_t *p_i, vlc_meta_type_t meta_type ) +static inline vlc_bool_t input_item_MetaMatch( input_item_t *p_i, vlc_meta_type_t meta_type, const char *psz ) { + vlc_mutex_lock( &p_i->lock ); if( !p_i->p_meta ) + { + vlc_mutex_unlock( &p_i->lock ); + return VLC_FALSE; + } + const char * meta = vlc_meta_Get( p_i->p_meta, meta_type ); + vlc_bool_t ret = meta && strcasestr( meta, psz ); + vlc_mutex_unlock( &p_i->lock ); + + return ret; +} + +static inline char * input_item_GetMeta( input_item_t *p_i, vlc_meta_type_t meta_type ) +{ + char * psz = NULL; + vlc_mutex_lock( &p_i->lock ); + + if( !p_i->p_meta ) + { + vlc_mutex_unlock( &p_i->lock ); return NULL; - return vlc_meta_Get( p_i->p_meta, meta_type ); + } + + if( vlc_meta_Get( p_i->p_meta, meta_type ) ) + psz = strdup( vlc_meta_Get( p_i->p_meta, meta_type ) ); + + vlc_mutex_unlock( &p_i->lock ); + return psz; +} + +static inline char * input_item_GetName( input_item_t * p_i ) +{ + vlc_mutex_lock( &p_i->lock ); + char *psz_s = p_i->psz_name ? strdup( p_i->psz_name ) : NULL; + vlc_mutex_unlock( &p_i->lock ); + return psz_s; +} + +static inline char * input_item_GetURI( input_item_t * p_i ) +{ + vlc_mutex_lock( &p_i->lock ); + char *psz_s = p_i->psz_uri ? strdup( p_i->psz_uri ) : NULL; + vlc_mutex_unlock( &p_i->lock ); + return psz_s; +} + +static inline void input_item_SetURI( input_item_t * p_i, char * psz_uri ) +{ + vlc_mutex_lock( &p_i->lock ); + if( p_i->psz_uri ) free( p_i->psz_uri ); + p_i->psz_uri = strdup( psz_uri ); + vlc_mutex_unlock( &p_i->lock ); +} + +static inline mtime_t input_item_GetDuration( input_item_t * p_i ) +{ + vlc_mutex_lock( &p_i->lock ); + mtime_t i_duration = p_i->i_duration; + vlc_mutex_unlock( &p_i->lock ); + return i_duration; +} + +static inline void input_item_SetDuration( input_item_t * p_i, mtime_t i_duration ) +{ + vlc_mutex_lock( &p_i->lock ); + p_i->i_duration = i_duration; + vlc_mutex_unlock( &p_i->lock ); + return; } static inline void input_item_SetPreparsed( input_item_t *p_i, vlc_bool_t preparsed )