assert( offsetof( playlist_private_t, public_data ) == 0 );
p_playlist = &p->public_data;
- TAB_INIT( p_playlist->i_sds, p_playlist->pp_sds );
+ TAB_INIT( pl_priv(p_playlist)->i_sds, pl_priv(p_playlist)->pp_sds );
libvlc_priv(p_parent->p_libvlc)->p_playlist = p_playlist;
/* Initialise data structures */
p_playlist->i_last_playlist_id = 0;
- p_playlist->p_input = NULL;
+ pl_priv(p_playlist)->p_input = NULL;
p_playlist->gc_date = 0;
p_playlist->b_cant_sleep = false;
}
/* Initial status */
- p_playlist->status.p_item = NULL;
- p_playlist->status.p_node = p_playlist->p_local_onelevel;
- p_playlist->request.b_request = false;
- p_playlist->status.i_status = PLAYLIST_STOPPED;
+ pl_priv(p_playlist)->status.p_item = NULL;
+ pl_priv(p_playlist)->status.p_node = p_playlist->p_local_onelevel;
+ pl_priv(p_playlist)->request.b_request = false;
+ pl_priv(p_playlist)->status.i_status = PLAYLIST_STOPPED;
p_playlist->i_sort = SORT_ID;
p_playlist->i_order = ORDER_NORMAL;
{
PL_ASSERT_LOCKED;
- if( !p_playlist->p_input ) return;
+ if( !pl_priv(p_playlist)->p_input ) return;
- input_thread_t * p_input = p_playlist->p_input;
+ input_thread_t * p_input = pl_priv(p_playlist)->p_input;
vlc_event_manager_t * p_em = input_get_event_manager( p_input );
vlc_event_detach( p_em, vlc_InputStateChanged,
input_state_changed, p_playlist );
vlc_event_detach( p_em, vlc_InputSelectedStreamChanged,
input_selected_stream_changed, p_playlist );
- p_playlist->p_input = NULL;
+ pl_priv(p_playlist)->p_input = NULL;
/* Release the playlist lock, because we may get stuck
* in vlc_object_release() for some time. */
if( p_input )
{
vlc_object_hold( p_input );
- p_playlist->p_input = p_input;
+ pl_priv(p_playlist)->p_input = p_input;
vlc_event_manager_t * p_em = input_get_event_manager( p_input );
vlc_event_attach( p_em, vlc_InputStateChanged,
input_state_changed, p_playlist );
{
input_thread_t * p_input;
PL_LOCK;
- p_input = p_playlist->p_input;
+ p_input = pl_priv(p_playlist)->p_input;
if( p_input ) vlc_object_hold( p_input );
PL_UNLOCK;
return p_input;
{
PL_ASSERT_LOCKED;
- return p_playlist->status.p_item;
+ return pl_priv(p_playlist)->status.p_item;
}
playlist_item_t * get_current_status_node( playlist_t * p_playlist )
{
PL_ASSERT_LOCKED;
- return p_playlist->status.p_node;
+ return pl_priv(p_playlist)->status.p_node;
}
void set_current_status_item( playlist_t * p_playlist,
{
PL_ASSERT_LOCKED;
- if( p_playlist->status.p_item &&
- p_playlist->status.p_item->i_flags & PLAYLIST_REMOVE_FLAG &&
- p_playlist->status.p_item != p_item )
+ if( pl_priv(p_playlist)->status.p_item &&
+ pl_priv(p_playlist)->status.p_item->i_flags & PLAYLIST_REMOVE_FLAG &&
+ pl_priv(p_playlist)->status.p_item != p_item )
{
/* It's unsafe given current design to delete a playlist item :(
- playlist_ItemDelete( p_playlist->status.p_item ); */
+ playlist_ItemDelete( pl_priv(p_playlist)->status.p_item ); */
}
- p_playlist->status.p_item = p_item;
+ pl_priv(p_playlist)->status.p_item = p_item;
}
void set_current_status_node( playlist_t * p_playlist,
{
PL_ASSERT_LOCKED;
- if( p_playlist->status.p_node &&
- p_playlist->status.p_node->i_flags & PLAYLIST_REMOVE_FLAG &&
- p_playlist->status.p_node != p_node )
+ if( pl_priv(p_playlist)->status.p_node &&
+ pl_priv(p_playlist)->status.p_node->i_flags & PLAYLIST_REMOVE_FLAG &&
+ pl_priv(p_playlist)->status.p_node != p_node )
{
/* It's unsafe given current design to delete a playlist item :(
- playlist_ItemDelete( p_playlist->status.p_node ); */
+ playlist_ItemDelete( pl_priv(p_playlist)->status.p_node ); */
}
- p_playlist->status.p_node = p_node;
+ pl_priv(p_playlist)->status.p_node = p_node;
}
/**
check_input:
/* If there is an input, check that it doesn't need to die. */
- if( p_playlist->p_input )
+ if( pl_priv(p_playlist)->p_input )
{
- if( p_playlist->request.b_request && !p_playlist->p_input->b_die )
+ if( pl_priv(p_playlist)->request.b_request && !pl_priv(p_playlist)->p_input->b_die )
{
PL_DEBUG( "incoming request - stopping current input" );
- input_StopThread( p_playlist->p_input );
+ input_StopThread( pl_priv(p_playlist)->p_input );
}
/* This input is dead. Remove it ! */
- if( p_playlist->p_input->b_dead )
+ if( pl_priv(p_playlist)->p_input->b_dead )
{
int i_activity;
input_thread_t *p_input;
PL_DEBUG( "dead input" );
- p_input = p_playlist->p_input;
+ p_input = pl_priv(p_playlist)->p_input;
assert( *pp_sout == NULL );
if( var_CreateGetBool( p_input, "sout-keep" ) )
goto check_input;
}
/* This input is dying, let it do */
- else if( p_playlist->p_input->b_die )
+ else if( pl_priv(p_playlist)->p_input->b_die )
{
PL_DEBUG( "dying input" );
PL_UNLOCK;
goto check_input;
}
/* This input has finished, ask it to die ! */
- else if( p_playlist->p_input->b_error
- || p_playlist->p_input->b_eof )
+ else if( pl_priv(p_playlist)->p_input->b_error
+ || pl_priv(p_playlist)->p_input->b_eof )
{
PL_DEBUG( "finished input" );
- input_StopThread( p_playlist->p_input );
+ input_StopThread( pl_priv(p_playlist)->p_input );
/* No need to wait here, we'll wait in the p_input->b_die case */
goto check_input;
}
- else if( p_playlist->p_input->i_state != INIT_S )
+ else if( pl_priv(p_playlist)->p_input->i_state != INIT_S )
{
ObjectGarbageCollector( p_playlist, false );
}
* - Request, running requested -> start new item
* - Request, stopped requested -> collect garbage
*/
- int i_status = p_playlist->request.b_request ?
- p_playlist->request.i_status : p_playlist->status.i_status;
+ int i_status = pl_priv(p_playlist)->request.b_request ?
+ pl_priv(p_playlist)->request.i_status : pl_priv(p_playlist)->status.i_status;
if( i_status != PLAYLIST_STOPPED )
{
msg_Dbg( p_playlist, "starting new item" );
if( p_item == NULL )
{
msg_Dbg( p_playlist, "nothing to play" );
- p_playlist->status.i_status = PLAYLIST_STOPPED;
+ pl_priv(p_playlist)->status.i_status = PLAYLIST_STOPPED;
if( b_playexit == true )
{
}
else
{
- const bool b_gc_forced = p_playlist->status.i_status != PLAYLIST_STOPPED;
+ const bool b_gc_forced = pl_priv(p_playlist)->status.i_status != PLAYLIST_STOPPED;
- p_playlist->status.i_status = PLAYLIST_STOPPED;
+ pl_priv(p_playlist)->status.i_status = PLAYLIST_STOPPED;
/* Collect garbage */
ObjectGarbageCollector( p_playlist, b_gc_forced );
while( 1 )
{
PL_LOCK;
- if( p_playlist->p_input == NULL )
+ if( pl_priv(p_playlist)->p_input == NULL )
{
PL_UNLOCK;
break;
}
- if( p_playlist->p_input->b_dead )
+ if( pl_priv(p_playlist)->p_input->b_dead )
{
/* remove input */
playlist_release_current_input( p_playlist );
PL_UNLOCK;
continue;
}
- else if( p_playlist->p_input->b_die )
+ else if( pl_priv(p_playlist)->p_input->b_die )
{
/* This input is dying, leave it alone */
;
}
- else if( p_playlist->p_input->b_error || p_playlist->p_input->b_eof )
+ else if( pl_priv(p_playlist)->p_input->b_error || pl_priv(p_playlist)->p_input->b_eof )
{
- input_StopThread( p_playlist->p_input );
+ input_StopThread( pl_priv(p_playlist)->p_input );
PL_UNLOCK;
continue;
}
else
{
- p_playlist->p_input->b_eof = 1;
+ pl_priv(p_playlist)->p_input->b_eof = 1;
}
PL_UNLOCK;
{
bool b_break;
PL_LOCK;
- b_break = ( !p_playlist->p_input || input_GetItem(p_playlist->p_input) != p_item ||
- p_playlist->p_input->b_die || p_playlist->p_input->b_eof || p_playlist->p_input->b_error );
+ b_break = ( !pl_priv(p_playlist)->p_input || input_GetItem(pl_priv(p_playlist)->p_input) != p_item ||
+ pl_priv(p_playlist)->p_input->b_die || pl_priv(p_playlist)->p_input->b_eof || pl_priv(p_playlist)->p_input->b_error );
PL_UNLOCK;
if( b_break )
break;
var_AddCallback( p_playlist, "random", RandomCallback, NULL );
}
+
+int playlist_CurrentId( playlist_t * p_playlist )
+{
+ return pl_priv(p_playlist)->status.p_item->i_id;
+}
+
+bool playlist_IsPlaying( playlist_t * p_playlist )
+{
+ return ( pl_priv(p_playlist)->status.i_status == PLAYLIST_RUNNING &&
+ !(pl_priv(p_playlist)->request.b_request && pl_priv(p_playlist)->request.i_status == PLAYLIST_STOPPED) );
+}
+
+playlist_item_t * playlist_CurrentPlayingItem( playlist_t * p_playlist )
+{
+ return pl_priv(p_playlist)->status.p_item;
+}
+
+int playlist_Status( playlist_t * p_playlist )
+{
+ return pl_priv(p_playlist)->status.i_status;
+}