From: Laurent Aimar Date: Mon, 22 Dec 2008 09:21:28 +0000 (+0100) Subject: Clean up a bit unused playlist functions and added lock asserts. X-Git-Tag: 1.0.0-pre1~1522 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=69a38c569e6f79e0a9200f7e8a0696c0b50823fe;p=vlc Clean up a bit unused playlist functions and added lock asserts. Some interfaces may assert because of missing playlist lock. --- diff --git a/include/vlc_playlist.h b/include/vlc_playlist.h index 49372b2889..11cf3e6d0a 100644 --- a/include/vlc_playlist.h +++ b/include/vlc_playlist.h @@ -181,22 +181,27 @@ struct playlist_add_t int i_position; }; -#define SORT_ID 0 -#define SORT_TITLE 1 -#define SORT_TITLE_NODES_FIRST 2 -#define SORT_ARTIST 3 -#define SORT_GENRE 4 -#define SORT_RANDOM 5 -#define SORT_DURATION 6 -#define SORT_TITLE_NUMERIC 7 -#define SORT_ALBUM 8 -#define SORT_TRACK_NUMBER 9 -#define SORT_DESCRIPTION 10 -#define SORT_RATING 11 -#define SORT_URI 12 - -#define ORDER_NORMAL 0 -#define ORDER_REVERSE 1 +enum +{ + SORT_ID = 0, + SORT_TITLE = 1, + SORT_TITLE_NODES_FIRST = 2, + SORT_ARTIST = 3, + SORT_GENRE = 4, + SORT_RANDOM = 5, + SORT_DURATION = 6, + SORT_TITLE_NUMERIC = 7, + SORT_ALBUM = 8, + SORT_TRACK_NUMBER = 9, + SORT_DESCRIPTION = 10, + SORT_RATING = 11, + SORT_URI = 12, +}; +enum +{ + ORDER_NORMAL = 0, + ORDER_REVERSE = 1, +}; /* Used by playlist_Import */ #define PLAYLIST_INSERT 0x0001 @@ -221,6 +226,7 @@ enum pl_locked_state /* Helpers */ #define PL_LOCK vlc_object_lock( p_playlist ) #define PL_UNLOCK vlc_object_unlock( p_playlist ) +#define PL_ASSERT_LOCKED vlc_object_assert_locked( p_playlist ) VLC_EXPORT( playlist_t *, __pl_Hold, ( vlc_object_t * ) ); #define pl_Hold( a ) __pl_Hold( VLC_OBJECT(a) ) @@ -234,7 +240,7 @@ VLC_EXPORT( void, __pl_Release, ( vlc_object_t * ) ); #define playlist_Stop(p) playlist_Control(p,PLAYLIST_STOP, pl_Unlocked ) #define playlist_Next(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, 1) #define playlist_Prev(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, -1) -#define playlist_Skip(p,i) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, i) +#define playlist_Skip(p,i) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, (i) ) /** * Do a playlist action. @@ -260,8 +266,6 @@ VLC_EXPORT( void, playlist_Clear, ( playlist_t *, bool ) ); /** Enqueue an input item for preparsing */ VLC_EXPORT( int, playlist_PreparseEnqueue, (playlist_t *, input_item_t *) ); -/** Enqueue a playlist item and all of its children if any for preparsing */ -VLC_EXPORT( int, playlist_PreparseEnqueueItem, (playlist_t *, playlist_item_t *) ); /** Request the art for an input item to be fetched */ VLC_EXPORT( int, playlist_AskForArtEnqueue, (playlist_t *, input_item_t *) ); @@ -269,8 +273,8 @@ VLC_EXPORT( int, playlist_AskForArtEnqueue, (playlist_t *, input_item_t *) ); VLC_EXPORT( int, playlist_TreeMove, ( playlist_t *, playlist_item_t *, playlist_item_t *, int ) ); VLC_EXPORT( int, playlist_RecursiveNodeSort, ( playlist_t *, playlist_item_t *,int, int ) ); -VLC_EXPORT( playlist_item_t *, playlist_CurrentPlayingItem, ( playlist_t * ) ); VLC_EXPORT( int, playlist_CurrentId, ( playlist_t * ) ); +VLC_EXPORT( playlist_item_t *, playlist_CurrentPlayingItem, ( playlist_t * ) ); VLC_EXPORT( bool, playlist_IsPlaying, ( playlist_t * ) ); VLC_EXPORT( int, playlist_Status, ( playlist_t * ) ); @@ -284,6 +288,11 @@ VLC_EXPORT( int, playlist_Status, ( playlist_t * ) ); */ VLC_EXPORT( int, playlist_Export, ( playlist_t *p_playlist, const char *psz_name, playlist_item_t *p_export_root, const char *psz_type ) ); +/** + * Open a playlist file, add its content to the current playlist + */ +VLC_EXPORT( int, playlist_Import, ( playlist_t *p_playlist, const char *psz_file ) ); + /********************** Services discovery ***********************/ /** Add a list of comma-separated service discovery modules */ @@ -354,21 +363,6 @@ VLC_EXPORT( playlist_item_t *, playlist_GetLastLeaf, ( playlist_t *p_playlist, p /*********************************************************************** * Inline functions ***********************************************************************/ -/** Open a playlist file, add its content to the current playlist */ -static inline int playlist_Import( playlist_t *p_playlist, const char *psz_file) -{ - char psz_uri[256+10]; - input_item_t *p_input; - snprintf( psz_uri, 256+9, "file/://%s", psz_file ); - const char *const psz_option = "meta-file"; - p_input = input_item_NewExt( p_playlist, psz_uri, psz_file, - 1, &psz_option, -1 ); - playlist_AddInput( p_playlist, p_input, PLAYLIST_APPEND, PLAYLIST_END, - true, false ); - input_Read( p_playlist, p_input, true ); - return VLC_SUCCESS; -} - /** Small helper tp get current playing input or NULL. Release the input after use. */ #define pl_CurrentInput(a) __pl_CurrentInput( VLC_OBJECT(a) ) static inline input_thread_t * __pl_CurrentInput( vlc_object_t * p_this ) @@ -381,13 +375,18 @@ static inline input_thread_t * __pl_CurrentInput( vlc_object_t * p_this ) } /** Tell if the playlist is empty */ -#define playlist_IsEmpty( pl ) ( pl->items.i_size == 0 ) +static inline bool playlist_IsEmpty( playlist_t *p_playlist ) +{ + PL_ASSERT_LOCKED; + return p_playlist->items.i_size == 0; +} /** Tell the number of items in the current playing context */ -#define playlist_CurrentSize( pl ) pl->current.i_size - -/** Ask the playlist to do some work */ -VLC_EXPORT( void, playlist_Signal, ( playlist_t * ) ); +static inline int playlist_CurrentSize( playlist_t *p_playlist ) +{ + PL_ASSERT_LOCKED; + return p_playlist->current.i_size; +} /** @} */ # ifdef __cplusplus diff --git a/modules/gui/qt4/dialogs/interaction.cpp b/modules/gui/qt4/dialogs/interaction.cpp index 447d0afb99..7c5920f36d 100644 --- a/modules/gui/qt4/dialogs/interaction.cpp +++ b/modules/gui/qt4/dialogs/interaction.cpp @@ -253,6 +253,5 @@ void InteractionDialog::Finish( int i_ret ) hide(); vlc_object_unlock( p_dialog->p_interaction ); - playlist_Signal( THEPL ); } diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 7ec2be26b4..8ce3e76217 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -288,6 +288,7 @@ playlist_GetNextLeaf playlist_GetPreferredNode playlist_GetPrevLeaf playlist_IsPlaying +playlist_Import playlist_IsServicesDiscoveryLoaded playlist_ItemGetById playlist_ItemGetByInput @@ -304,11 +305,9 @@ playlist_NodeInsert playlist_NodeRemoveItem playlist_NodesPairCreate playlist_PreparseEnqueue -playlist_PreparseEnqueueItem playlist_RecursiveNodeSort playlist_ServicesDiscoveryAdd playlist_ServicesDiscoveryRemove -playlist_Signal playlist_Status playlist_TreeMove __pl_Hold diff --git a/src/playlist/control.c b/src/playlist/control.c index 5930b7750c..04ca864e02 100644 --- a/src/playlist/control.c +++ b/src/playlist/control.c @@ -35,8 +35,6 @@ *****************************************************************************/ static int PlaylistVAControl( playlist_t * p_playlist, int i_query, va_list args ); -static void PreparseEnqueueItemSub( playlist_t *, playlist_item_t * ); - /***************************************************************************** * Playlist control *****************************************************************************/ @@ -45,7 +43,7 @@ playlist_t *__pl_Hold( vlc_object_t *p_this ) { playlist_t *pl; - barrier (); + barrier(); pl = libvlc_priv (p_this->p_libvlc)->p_playlist; assert( VLC_OBJECT(pl) != p_this /* This does not make sense to hold the playlist @@ -68,19 +66,13 @@ void __pl_Release( vlc_object_t *p_this ) vlc_object_release( pl ); } -void playlist_Signal( playlist_t *p_playlist ) -{ - /* TODO: assert playlist lock? */ - vlc_object_signal( p_playlist ); -} - int playlist_Control( playlist_t * p_playlist, int i_query, bool b_locked, ... ) { va_list args; int i_result; - va_start( args, b_locked ); PL_LOCK_IF( !b_locked ); + va_start( args, b_locked ); i_result = PlaylistVAControl( p_playlist, i_query, args ); va_end( args ); PL_UNLOCK_IF( !b_locked ); @@ -208,21 +200,6 @@ int playlist_PreparseEnqueue( playlist_t *p_playlist, return VLC_SUCCESS; } -/** Enqueue a playlist item or a node for preparsing. - * This function shall be called without playlist and preparser locks */ -int playlist_PreparseEnqueueItem( playlist_t *p_playlist, - playlist_item_t *p_item ) -{ - playlist_preparse_t *p_preparse = &pl_priv(p_playlist)->preparse; - - vlc_object_lock( p_playlist ); - vlc_mutex_lock( &p_preparse->lock ); - PreparseEnqueueItemSub( p_playlist, p_item ); - vlc_mutex_unlock( &p_preparse->lock ); - vlc_object_unlock( p_playlist ); - return VLC_SUCCESS; -} - int playlist_AskForArtEnqueue( playlist_t *p_playlist, input_item_t *p_item ) { @@ -238,30 +215,6 @@ int playlist_AskForArtEnqueue( playlist_t *p_playlist, return VLC_SUCCESS; } -static void PreparseEnqueueItemSub( playlist_t *p_playlist, - playlist_item_t *p_item ) -{ - playlist_preparse_t *p_preparse = &pl_priv(p_playlist)->preparse; - - if( p_item->i_children == -1 ) - { - /* Leaf item */ - vlc_gc_incref( p_item->p_input ); - INSERT_ELEM( p_preparse->pp_waiting, - p_preparse->i_waiting, - p_preparse->i_waiting, - p_item->p_input ); - } - else - { - /* Non-leaf item: recurse */ - for( int i = 0; i < p_item->i_children; i++) - { - PreparseEnqueueItemSub( p_playlist, p_item->pp_children[i] ); - } - } -} - /***************************************************************************** * Playback logic *****************************************************************************/ diff --git a/src/playlist/engine.c b/src/playlist/engine.c index e0392a5beb..14a62437ca 100644 --- a/src/playlist/engine.c +++ b/src/playlist/engine.c @@ -44,9 +44,14 @@ static int RandomCallback( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *a ) { (void)psz_cmd; (void)oldval; (void)newval; (void)a; + playlist_t *p_playlist = (playlist_t*)p_this; - pl_priv((playlist_t*)p_this)->b_reset_currently_playing = true; - playlist_Signal( ((playlist_t*)p_this) ); + PL_LOCK; + + pl_priv(p_playlist)->b_reset_currently_playing = true; + vlc_object_signal_unlocked( p_playlist ); + + PL_UNLOCK; return VLC_SUCCESS; } @@ -228,17 +233,18 @@ static int InputEvent( vlc_object_t *p_this, char const *psz_cmd, VLC_UNUSED(p_this); VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); playlist_t *p_playlist = p_data; - if( newval.i_int == INPUT_EVENT_STATE ) - { - playlist_Signal( p_playlist ); - } - else if( newval.i_int == INPUT_EVENT_ES ) - { - PL_LOCK; + if( newval.i_int != INPUT_EVENT_STATE && + newval.i_int != INPUT_EVENT_ES ) + return VLC_SUCCESS; + + PL_LOCK; + + if( newval.i_int == INPUT_EVENT_ES ) pl_priv(p_playlist)->gc_date = mdate(); - vlc_object_signal_unlocked( p_playlist ); - PL_UNLOCK; - } + + vlc_object_signal_unlocked( p_playlist ); + + PL_UNLOCK; return VLC_SUCCESS; } diff --git a/src/playlist/loadsave.c b/src/playlist/loadsave.c index 537a3de06c..bdde7dd855 100644 --- a/src/playlist/loadsave.c +++ b/src/playlist/loadsave.c @@ -92,6 +92,24 @@ int playlist_Export( playlist_t * p_playlist, const char *psz_filename , return i_ret; } +int playlist_Import( playlist_t *p_playlist, const char *psz_file ) +{ + input_item_t *p_input; + char *psz_uri; + const char *const psz_option = "meta-file"; + + if( asprintf( &psz_uri, "file/://%s", psz_file ) < 0 ) + return VLC_EGENERIC; + + p_input = input_item_NewExt( p_playlist, psz_uri, psz_file, + 1, &psz_option, -1 ); + free( psz_uri ); + + playlist_AddInput( p_playlist, p_input, PLAYLIST_APPEND, PLAYLIST_END, + true, false ); + return input_Read( p_playlist, p_input, true ); +} + /***************************************************************************** * A subitem has been added to the Media Library (Event Callback) *****************************************************************************/ diff --git a/src/playlist/playlist_internal.h b/src/playlist/playlist_internal.h index 90174d9f44..f3d05b1926 100644 --- a/src/playlist/playlist_internal.h +++ b/src/playlist/playlist_internal.h @@ -172,6 +172,7 @@ void playlist_release_current_input( playlist_t * p_playlist ); void playlist_set_current_input( playlist_t * p_playlist, input_thread_t * p_input ); + /** * @} */ @@ -193,8 +194,6 @@ void playlist_set_current_input( #define PLI_NAME( p ) p && p->p_input ? p->p_input->psz_name : "null" -#define PL_ASSERT_LOCKED vlc_assert_locked( &(vlc_internals(p_playlist)->lock) ) - #define PL_LOCK_IF( cond ) pl_lock_if( p_playlist, cond ) static inline void pl_lock_if( playlist_t * p_playlist, bool cond ) { diff --git a/src/playlist/search.c b/src/playlist/search.c index 462e26a6c3..5851effec2 100644 --- a/src/playlist/search.c +++ b/src/playlist/search.c @@ -90,6 +90,7 @@ playlist_item_t * playlist_ItemGetByInput( playlist_t * p_playlist , return NULL; } + /** * Get input by item id *