X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_input.h;h=f9109883eaf32f4095cbe400dd9552679560db38;hb=9a7aec774cc24fdf558c08b812894658594d9830;hp=8088a3ecef9b0a606eaf9830850cf13c95aac455;hpb=4dbce8899a66f90b3ce9e76f58d9badd0bfb61c3;p=vlc diff --git a/include/vlc_input.h b/include/vlc_input.h index 8088a3ecef..f9109883ea 100644 --- a/include/vlc_input.h +++ b/include/vlc_input.h @@ -32,6 +32,10 @@ #include #include +#include +#include + +#include /* strcasestr() */ struct vlc_meta_t; @@ -79,20 +83,21 @@ struct input_item_t vlc_meta_t *p_meta; - vlc_mutex_t lock; /**< Lock for the item */ + 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 ) { @@ -110,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, @@ -127,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 * ) ); @@ -134,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 ) @@ -184,16 +219,254 @@ static inline void input_ItemClean( input_item_t *p_i ) vlc_mutex_destroy( &p_i->lock ); } +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 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; + } + + 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 ) +{ + if( !p_i->p_meta ) + p_i->p_meta = vlc_meta_New(); + + if( preparsed ) + p_i->p_meta->i_status |= ITEM_PREPARSED; + else + p_i->p_meta->i_status &= ~ITEM_PREPARSED; +} + +static inline vlc_bool_t input_item_IsPreparsed( input_item_t *p_i ) +{ + return p_i->p_meta ? p_i->p_meta->i_status & ITEM_PREPARSED : VLC_FALSE ; +} + +static inline void input_item_SetMetaFetched( input_item_t *p_i, vlc_bool_t metafetched ) +{ + if( !p_i->p_meta ) + p_i->p_meta = vlc_meta_New(); + + if( metafetched ) + p_i->p_meta->i_status |= ITEM_META_FETCHED; + else + p_i->p_meta->i_status &= ~ITEM_META_FETCHED; +} + +static inline vlc_bool_t input_item_IsMetaFetched( input_item_t *p_i ) +{ + return p_i->p_meta ? p_i->p_meta->i_status & ITEM_META_FETCHED : VLC_FALSE ; +} + + +static inline void input_item_SetArtNotFound( input_item_t *p_i, vlc_bool_t notfound ) +{ + if( !p_i->p_meta ) + p_i->p_meta = vlc_meta_New(); + + if( notfound ) + p_i->p_meta->i_status |= ITEM_ART_NOTFOUND; + else + p_i->p_meta->i_status &= ~ITEM_ART_NOTFOUND; +} + +static inline void input_item_SetArtFetched( input_item_t *p_i, vlc_bool_t artfetched ) +{ + if( !p_i->p_meta ) + p_i->p_meta = vlc_meta_New(); + + if( artfetched ) + p_i->p_meta->i_status |= ITEM_ART_FETCHED; + else + p_i->p_meta->i_status &= ~ITEM_ART_FETCHED; +} + +static inline vlc_bool_t input_item_IsArtFetched( input_item_t *p_i ) +{ + return p_i->p_meta ? p_i->p_meta->i_status & ITEM_ART_FETCHED : VLC_FALSE ; +} + +static inline const vlc_meta_t * input_item_GetMetaObject( input_item_t *p_i ) +{ + if( !p_i->p_meta ) + p_i->p_meta = vlc_meta_New(); + + return p_i->p_meta; +} + +static inline void input_item_MetaMerge( input_item_t *p_i, const vlc_meta_t * p_new_meta ) +{ + if( !p_i->p_meta ) + p_i->p_meta = vlc_meta_New(); + + vlc_meta_Merge( p_i->p_meta, p_new_meta ); +} + +#define input_item_SetTitle( item, b ) input_item_SetMeta( item, vlc_meta_Title, b ) +#define input_item_SetArtist( item, b ) input_item_SetMeta( item, vlc_meta_Artist, b ) +#define input_item_SetGenre( item, b ) input_item_SetMeta( item, vlc_meta_Genre, b ) +#define input_item_SetCopyright( item, b ) input_item_SetMeta( item, vlc_meta_Copyright, b ) +#define input_item_SetAlbum( item, b ) input_item_SetMeta( item, vlc_meta_Album, b ) +#define input_item_SetTrackNum( item, b ) input_item_SetMeta( item, vlc_meta_TrackNumber, b ) +#define input_item_SetDescription( item, b ) input_item_SetMeta( item, vlc_meta_Description, b ) +#define input_item_SetRating( item, b ) input_item_SetMeta( item, vlc_meta_Rating, b ) +#define input_item_SetDate( item, b ) input_item_SetMeta( item, vlc_meta_Date, b ) +#define input_item_SetSetting( item, b ) input_item_SetMeta( item, vlc_meta_Setting, b ) +#define input_item_SetURL( item, b ) input_item_SetMeta( item, vlc_meta_URL, b ) +#define input_item_SetLanguage( item, b ) input_item_SetMeta( item, vlc_meta_Language, b ) +#define input_item_SetNowPlaying( item, b ) input_item_SetMeta( item, vlc_meta_NowPlaying, b ) +#define input_item_SetPublisher( item, b ) input_item_SetMeta( item, vlc_meta_Publisher, b ) +#define input_item_SetEncodedBy( item, b ) input_item_SetMeta( item, vlc_meta_EncodedBy, b ) +#define input_item_SetArtURL( item, b ) input_item_SetMeta( item, vlc_meta_ArtworkURL, b ) +#define input_item_SetTrackID( item, b ) input_item_SetMeta( item, vlc_meta_TrackID, b ) + +#define input_item_GetTitle( item ) input_item_GetMeta( item, vlc_meta_Title ) +#define input_item_GetArtist( item ) input_item_GetMeta( item, vlc_meta_Artist ) +#define input_item_GetGenre( item ) input_item_GetMeta( item, vlc_meta_Genre ) +#define input_item_GetCopyright( item ) input_item_GetMeta( item, vlc_meta_Copyright ) +#define input_item_GetAlbum( item ) input_item_GetMeta( item, vlc_meta_Album ) +#define input_item_GetTrackNum( item ) input_item_GetMeta( item, vlc_meta_TrackNumber ) +#define input_item_GetDescription( item ) input_item_GetMeta( item, vlc_meta_Description ) +#define input_item_GetRating( item ) input_item_GetMeta( item, vlc_meta_Rating ) +#define input_item_GetDate( item ) input_item_GetMeta( item, vlc_meta_Date ) +#define input_item_GetGetting( item ) input_item_GetMeta( item, vlc_meta_Getting ) +#define input_item_GetURL( item ) input_item_GetMeta( item, vlc_meta_URL ) +#define input_item_GetLanguage( item ) input_item_GetMeta( item, vlc_meta_Language ) +#define input_item_GetNowPlaying( item ) input_item_GetMeta( item, vlc_meta_NowPlaying ) +#define input_item_GetPublisher( item ) input_item_GetMeta( item, vlc_meta_Publisher ) +#define input_item_GetEncodedBy( item ) input_item_GetMeta( item, vlc_meta_EncodedBy ) +#define input_item_GetArtURL( item ) input_item_GetMeta( item, vlc_meta_ArtworkURL ) +#define input_item_GetTrackID( item ) input_item_GetMeta( item, vlc_meta_TrackID ) +#define input_item_GetSetting( item ) input_item_GetMeta( item, vlc_meta_Setting ) + VLC_EXPORT( char *, input_ItemGetInfo, ( input_item_t *p_i, const char *psz_cat,const char *psz_name ) ); -VLC_EXPORT(int, input_ItemAddInfo, ( input_item_t *p_i, const char *psz_cat, const char *psz_name, const char *psz_format, ... ) ); +VLC_EXPORT(int, input_ItemAddInfo, ( input_item_t *p_i, const char *psz_cat, const char *psz_name, const char *psz_format, ... ) ATTRIBUTE_FORMAT( 4, 5 ) ); #define input_ItemNew( a,b,c ) input_ItemNewExt( a, b, c, 0, NULL, -1 ) #define input_ItemNewExt(a,b,c,d,e,f) __input_ItemNewExt( VLC_OBJECT(a),b,c,d,e,f) -VLC_EXPORT( input_item_t *, __input_ItemNewExt, (vlc_object_t *, const char *, const char*, int, const char *const *, int) ); -VLC_EXPORT( input_item_t *, input_ItemNewWithType, ( vlc_object_t *, const char *, const char *e, int, const char *const *, int, int ) ); +VLC_EXPORT( input_item_t *, __input_ItemNewExt, (vlc_object_t *, const char *, const char*, int, const char *const *, mtime_t i_duration ) ); +VLC_EXPORT( input_item_t *, input_ItemNewWithType, ( vlc_object_t *, const char *, const char *e, int, const char *const *, mtime_t i_duration, int ) ); VLC_EXPORT( input_item_t *, input_ItemGetById, (playlist_t *, int ) ); +/***************************************************************************** + * Meta data helpers + *****************************************************************************/ +static inline void vlc_audio_replay_gain_MergeFromMeta( audio_replay_gain_t *p_dst, + const vlc_meta_t *p_meta ) +{ + char * psz_value; + + if( !p_meta ) + return; + + if( (psz_value = (char *)vlc_dictionary_value_for_key( &p_meta->extra_tags, "REPLAYGAIN_TRACK_GAIN" )) || + (psz_value = (char *)vlc_dictionary_value_for_key( &p_meta->extra_tags, "RG_RADIO" )) ) + { + p_dst->pb_gain[AUDIO_REPLAY_GAIN_TRACK] = VLC_TRUE; + p_dst->pf_gain[AUDIO_REPLAY_GAIN_TRACK] = atof( psz_value ); + } + else if( (psz_value = (char *)vlc_dictionary_value_for_key( &p_meta->extra_tags, "REPLAYGAIN_TRACK_PEAK" )) || + (psz_value = (char *)vlc_dictionary_value_for_key( &p_meta->extra_tags, "RG_PEAK" )) ) + { + p_dst->pb_peak[AUDIO_REPLAY_GAIN_TRACK] = VLC_TRUE; + p_dst->pf_peak[AUDIO_REPLAY_GAIN_TRACK] = atof( psz_value ); + } + else if( (psz_value = (char *)vlc_dictionary_value_for_key( &p_meta->extra_tags, "REPLAYGAIN_ALBUM_GAIN" )) || + (psz_value = (char *)vlc_dictionary_value_for_key( &p_meta->extra_tags, "RG_AUDIOPHILE" )) ) + { + p_dst->pb_gain[AUDIO_REPLAY_GAIN_ALBUM] = VLC_TRUE; + p_dst->pf_gain[AUDIO_REPLAY_GAIN_ALBUM] = atof( psz_value ); + } + else if( (psz_value = (char *)vlc_dictionary_value_for_key( &p_meta->extra_tags, "REPLAYGAIN_ALBUM_PEAK" )) ) + { + p_dst->pb_peak[AUDIO_REPLAY_GAIN_ALBUM] = VLC_TRUE; + p_dst->pf_peak[AUDIO_REPLAY_GAIN_ALBUM] = atof( psz_value ); + } +} + /***************************************************************************** * Seek point: (generalisation of chapters) *****************************************************************************/ @@ -302,7 +575,57 @@ static inline input_title_t *vlc_input_title_Duplicate( input_title_t *t ) return dup; } +/***************************************************************************** + * Attachments + *****************************************************************************/ +struct input_attachment_t +{ + char *psz_name; + char *psz_mime; + char *psz_description; + int i_data; + void *p_data; +}; +static inline input_attachment_t *vlc_input_attachment_New( const char *psz_name, + const char *psz_mime, + const char *psz_description, + const void *p_data, + int i_data ) +{ + input_attachment_t *a = + (input_attachment_t*)malloc( sizeof(input_attachment_t) ); + if( !a ) + return NULL; + a->psz_name = strdup( psz_name ? psz_name : "" ); + a->psz_mime = strdup( psz_mime ? psz_mime : "" ); + a->psz_description = strdup( psz_description ? psz_description : "" ); + a->i_data = i_data; + a->p_data = NULL; + if( i_data > 0 ) + { + a->p_data = malloc( i_data ); + if( a->p_data && p_data ) + memcpy( a->p_data, p_data, i_data ); + } + return a; +} +static inline input_attachment_t *vlc_input_attachment_Duplicate( const input_attachment_t *a ) +{ + return vlc_input_attachment_New( a->psz_name, a->psz_mime, a->psz_description, + a->p_data, a->i_data ); +} +static inline void vlc_input_attachment_Delete( input_attachment_t *a ) +{ + if( !a ) + return; + free( a->psz_name ); + free( a->psz_mime ); + free( a->psz_description ); + if( a->p_data ) + free( a->p_data ); + free( a ); +} /***************************************************************************** * input defines/constants. *****************************************************************************/ @@ -427,6 +750,10 @@ enum input_query_e INPUT_DEL_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ INPUT_SET_BOOKMARK, /* arg1= int res=can fail */ + /* Attachments */ + INPUT_GET_ATTACHMENTS, /* arg1=input_attachment_t***, arg2=int* res=can fail */ + INPUT_GET_ATTACHMENT, /* arg1=input_attachment_t**, arg2=char* res=can fail */ + /* On the fly input slave */ INPUT_ADD_SLAVE /* arg1= char * */ };