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
/* 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) )
#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.
/** 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 *) );
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 * ) );
*/
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 */
/***********************************************************************
* 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 )
}
/** 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
*****************************************************************************/
static int PlaylistVAControl( playlist_t * p_playlist, int i_query, va_list args );
-static void PreparseEnqueueItemSub( playlist_t *, playlist_item_t * );
-
/*****************************************************************************
* Playlist control
*****************************************************************************/
{
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
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 );
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 )
{
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
*****************************************************************************/
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;
}
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;
}