Commit 69a38c56 authored by Laurent Aimar's avatar Laurent Aimar

Clean up a bit unused playlist functions and added lock asserts.

Some interfaces may assert because of missing playlist lock.
parent 5aa33f1f
......@@ -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
......
......@@ -253,6 +253,5 @@ void InteractionDialog::Finish( int i_ret )
hide();
vlc_object_unlock( p_dialog->p_interaction );
playlist_Signal( THEPL );
}
......@@ -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
......
......@@ -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
*****************************************************************************/
......
......@@ -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;
}
......
......@@ -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)
*****************************************************************************/
......
......@@ -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 )
{
......
......@@ -90,6 +90,7 @@ playlist_item_t * playlist_ItemGetByInput( playlist_t * p_playlist ,
return NULL;
}
/**
* Get input by item id
*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment