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
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
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 * ) );
}
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 */
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 */
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;
}
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;
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;
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 );
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;
* \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;
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
break;
}
- vlc_mutex_unlock( &p_playlist->object_lock );
return VLC_SUCCESS;
}
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 )
{
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 );