From 984febc09a32f30b1acad5c2e825ae4499656169 Mon Sep 17 00:00:00 2001 From: Sigmund Augdal Helberg Date: Sat, 9 Apr 2005 14:53:38 +0000 Subject: [PATCH] playlist: added a pp_all_items to playlist_t allowing GetItemById to return nodes as well as items. made playlist_Control not take the playlist lock, and created a playlist_LockControl that does the same but takes the lock --- include/vlc_playlist.h | 18 +++++++++++------- src/playlist/item-ext.c | 16 +++++++++++----- src/playlist/playlist.c | 32 ++++++++++++++++++++++++++++---- src/playlist/view.c | 7 ++++++- 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/include/vlc_playlist.h b/include/vlc_playlist.h index ca864aa36c..1e85dc763e 100644 --- a/include/vlc_playlist.h +++ b/include/vlc_playlist.h @@ -154,6 +154,9 @@ struct playlist_t int i_size; /**< total size of the list */ playlist_item_t ** pp_items; /**< array of pointers to the * playlist items */ + int i_all_size; /**< size of list of items and nodes */ + playlist_item_t ** pp_all_items; /**< array of pointers to the + * playlist items and nodes */ int i_views; /**< Number of views */ playlist_view_t ** pp_views; /**< array of pointers to the @@ -237,15 +240,16 @@ playlist_t * __playlist_Create ( vlc_object_t * ); int playlist_Destroy ( playlist_t * ); /* Playlist control */ -#define playlist_Play(p) playlist_Control(p,PLAYLIST_PLAY ) -#define playlist_Pause(p) playlist_Control(p,PLAYLIST_PAUSE ) -#define playlist_Stop(p) playlist_Control(p,PLAYLIST_STOP ) -#define playlist_Next(p) playlist_Control(p,PLAYLIST_SKIP , 1) -#define playlist_Prev(p) playlist_Control(p,PLAYLIST_SKIP , -1) -#define playlist_Skip(p,i) playlist_Control(p,PLAYLIST_SKIP,i) -#define playlist_Goto(p,i) playlist_Control(p,PLAYLIST_GOTO,i) +#define playlist_Play(p) playlist_LockControl(p,PLAYLIST_PLAY ) +#define playlist_Pause(p) playlist_LockControl(p,PLAYLIST_PAUSE ) +#define playlist_Stop(p) playlist_LockControl(p,PLAYLIST_STOP ) +#define playlist_Next(p) playlist_LockControl(p,PLAYLIST_SKIP, 1) +#define playlist_Prev(p) playlist_LockControl(p,PLAYLIST_SKIP, -1) +#define playlist_Skip(p,i) playlist_LockControl(p,PLAYLIST_SKIP, i) +#define playlist_Goto(p,i) playlist_LockControl(p,PLAYLIST_GOTO, i) VLC_EXPORT( int, playlist_Control, ( playlist_t *, int, ... ) ); +VLC_EXPORT( int, playlist_LockControl, ( playlist_t *, int, ... ) ); VLC_EXPORT( int, playlist_Clear, ( playlist_t * ) ); VLC_EXPORT( int, playlist_LockClear, ( playlist_t * ) ); diff --git a/src/playlist/item-ext.c b/src/playlist/item-ext.c index 7d690982bc..b41077df96 100644 --- a/src/playlist/item-ext.c +++ b/src/playlist/item-ext.c @@ -188,6 +188,8 @@ int playlist_AddItem( playlist_t *p_playlist, playlist_item_t *p_item, } INSERT_ELEM( p_playlist->pp_items, p_playlist->i_size, i_pos, p_item ); + INSERT_ELEM( p_playlist->pp_all_items, p_playlist->i_all_size, + p_playlist->i_all_size, p_item ); p_playlist->i_enabled ++; /* We update the ALL view directly */ @@ -345,6 +347,10 @@ int playlist_NodeAddItem( playlist_t *p_playlist, playlist_item_t *p_item, p_playlist->i_size, i_position, p_item ); + INSERT_ELEM( p_playlist->pp_all_items, + p_playlist->i_all_size, + p_playlist->i_all_size, + p_item ); p_playlist->i_enabled ++; /* TODO: Handle modes */ @@ -401,9 +407,9 @@ int playlist_NodeAddItem( playlist_t *p_playlist, playlist_item_t *p_item, int playlist_GetPositionById( playlist_t * p_playlist , int i_id ) { int i; - for( i = 0 ; i < p_playlist->i_size ; i++ ) + for( i = 0 ; i < p_playlist->i_all_size ; i++ ) { - if( p_playlist->pp_items[i]->input.i_id == i_id ) + if( p_playlist->pp_all_items[i]->input.i_id == i_id ) { return i; } @@ -455,11 +461,11 @@ playlist_item_t *playlist_LockItemGetByPos( playlist_t *p_playlist, int i_pos ) playlist_item_t * playlist_ItemGetById( playlist_t * p_playlist , int i_id ) { int i; - for( i = 0 ; i < p_playlist->i_size ; i++ ) + for( i = 0 ; i < p_playlist->i_all_size ; i++ ) { - if( p_playlist->pp_items[i]->input.i_id == i_id ) + if( p_playlist->pp_all_items[i]->input.i_id == i_id ) { - return p_playlist->pp_items[i]; + return p_playlist->pp_all_items[i]; } } return NULL; diff --git a/src/playlist/playlist.c b/src/playlist/playlist.c index e76d28677e..0d7e843251 100644 --- a/src/playlist/playlist.c +++ b/src/playlist/playlist.c @@ -107,6 +107,7 @@ playlist_t * __playlist_Create ( vlc_object_t *p_parent ) var_CreateGetBool( p_playlist, "loop" ); /* Initialise data structures */ + p_playlist->i_last_id = 0; p_playlist->b_go_next = VLC_TRUE; p_playlist->p_input = NULL; @@ -118,6 +119,8 @@ playlist_t * __playlist_Create ( vlc_object_t *p_parent ) p_playlist->i_index = -1; p_playlist->i_size = 0; p_playlist->pp_items = NULL; + p_playlist->i_all_size = 0; + p_playlist->pp_all_items = malloc(sizeof(playlist_item_t*)); playlist_ViewInsert( p_playlist, VIEW_CATEGORY, TITLE_CATEGORY ); playlist_ViewInsert( p_playlist, VIEW_SIMPLE, TITLE_SIMPLE ); @@ -140,7 +143,6 @@ playlist_t * __playlist_Create ( vlc_object_t *p_parent ) p_playlist->status.i_status = PLAYLIST_STOPPED; - p_playlist->i_last_id = 0; p_playlist->i_sort = SORT_ID; p_playlist->i_order = ORDER_NORMAL; @@ -246,6 +248,31 @@ int playlist_Destroy( playlist_t * p_playlist ) * \param variable number of arguments * \return VLC_SUCCESS or an error */ +int playlist_LockControl( playlist_t * p_playlist, int i_query, ... ) +{ + va_list args; + int i_result; + va_start( args, i_query ); + vlc_mutex_lock( &p_playlist->object_lock ); + i_result = playlist_vaControl( p_playlist, i_query, args ); + va_end( args ); + vlc_mutex_unlock( &p_playlist->object_lock ); + return i_result; + +} + +/** + * Do a playlist action. + * + * If there is something in the playlist then you can do playlist actions. + * + * Playlist lock must be taken when calling this function + * + * \param p_playlist the playlist to do the command on + * \param i_query the command to do + * \param variable number of arguments + * \return VLC_SUCCESS or an error + */ int playlist_Control( playlist_t * p_playlist, int i_query, ... ) { va_list args; @@ -262,8 +289,6 @@ int playlist_vaControl( playlist_t * p_playlist, int i_query, va_list args ) playlist_view_t *p_view; vlc_value_t val; - vlc_mutex_lock( &p_playlist->object_lock ); - #ifdef PLAYLIST_PROFILE p_playlist->request_date = mdate(); #endif @@ -397,7 +422,6 @@ int playlist_vaControl( playlist_t * p_playlist, int i_query, va_list args ) break; } - vlc_mutex_unlock( &p_playlist->object_lock ); return VLC_SUCCESS; } diff --git a/src/playlist/view.c b/src/playlist/view.c index 2950dfbb08..e822b1bb49 100644 --- a/src/playlist/view.c +++ b/src/playlist/view.c @@ -251,11 +251,11 @@ playlist_item_t * playlist_NodeCreate( playlist_t *p_playlist, int i_view, vlc_value_t val; playlist_add_t *p_add = (playlist_add_t*)malloc( sizeof(playlist_add_t)); - vlc_input_item_Init( VLC_OBJECT(p_playlist), &p_item->input ); if( p_item == NULL ) { return NULL; } + vlc_input_item_Init( VLC_OBJECT(p_playlist), &p_item->input ); if( psz_name != NULL ) { @@ -292,6 +292,11 @@ playlist_item_t * playlist_NodeCreate( playlist_t *p_playlist, int i_view, vlc_mutex_init( p_playlist, &p_item->input.lock ); + INSERT_ELEM( p_playlist->pp_all_items, + p_playlist->i_all_size, + p_playlist->i_all_size, + p_item ); + if( p_parent != NULL ) { playlist_NodeAppend( p_playlist, i_view, p_item, p_parent ); -- 2.39.5