vlc_object_release( pl );
}
+void playlist_Lock( playlist_t *pl )
+{
+ vlc_mutex_lock( &pl_priv(pl)->lock );
+}
+
+void playlist_Unlock( playlist_t *pl )
+{
+ vlc_mutex_unlock( &pl_priv(pl)->lock );
+}
+
+void playlist_AssertLocked( playlist_t *pl )
+{
+ vlc_assert_locked( &pl_priv(pl)->lock );
+}
+
int playlist_Control( playlist_t * p_playlist, int i_query,
bool b_locked, ... )
{
static int PlaylistVAControl( playlist_t * p_playlist, int i_query, va_list args )
{
playlist_item_t *p_item, *p_node;
- vlc_value_t val;
PL_ASSERT_LOCKED;
if( !vlc_object_alive( p_playlist ) )
return VLC_EGENERIC;
- if( playlist_IsEmpty( p_playlist ) )
+ if( playlist_IsEmpty( p_playlist ) && i_query != PLAYLIST_STOP )
return VLC_EGENERIC;
switch( i_query )
case PLAYLIST_PLAY:
if( pl_priv(p_playlist)->p_input )
{
- val.i_int = PLAYING_S;
- var_Set( pl_priv(p_playlist)->p_input, "state", val );
+ var_SetInteger( pl_priv(p_playlist)->p_input, "state", PLAYING_S );
break;
}
else
break;
case PLAYLIST_PAUSE:
- val.i_int = 0;
- if( pl_priv(p_playlist)->p_input )
- var_Get( pl_priv(p_playlist)->p_input, "state", &val );
+ if( !pl_priv(p_playlist)->p_input )
+ { /* FIXME: is this really useful without input? */
+ pl_priv(p_playlist)->status.i_status = PLAYLIST_PAUSED;
+ break;
+ }
- if( val.i_int == PAUSE_S )
+ if( var_GetInteger( pl_priv(p_playlist)->p_input, "state" ) == PAUSE_S )
{
pl_priv(p_playlist)->status.i_status = PLAYLIST_RUNNING;
- if( pl_priv(p_playlist)->p_input )
- {
- val.i_int = PLAYING_S;
- var_Set( pl_priv(p_playlist)->p_input, "state", val );
- }
+ var_SetInteger( pl_priv(p_playlist)->p_input, "state", PLAYING_S );
}
else
{
pl_priv(p_playlist)->status.i_status = PLAYLIST_PAUSED;
- if( pl_priv(p_playlist)->p_input )
- {
- val.i_int = PAUSE_S;
- var_Set( pl_priv(p_playlist)->p_input, "state", val );
- }
+ var_SetInteger( pl_priv(p_playlist)->p_input, "state", PAUSE_S );
}
break;
msg_Err( p_playlist, "unknown playlist query" );
return VLC_EBADVAR;
}
- vlc_object_signal_unlocked( p_playlist );
+ vlc_cond_signal( &pl_priv(p_playlist)->signal );
return VLC_SUCCESS;
}
*****************************************************************************/
/** Enqueue an item for preparsing */
int playlist_PreparseEnqueue( playlist_t *p_playlist,
- input_item_t *p_item )
+ input_item_t *p_item, bool b_locked )
{
playlist_private_t *p_sys = pl_priv(p_playlist);
- PL_LOCK;
+ PL_LOCK_IF( !b_locked );
if( p_sys->p_preparser )
playlist_preparser_Push( p_sys->p_preparser, p_item );
- PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return VLC_SUCCESS;
}
int playlist_AskForArtEnqueue( playlist_t *p_playlist,
- input_item_t *p_item )
+ input_item_t *p_item, bool b_locked )
{
playlist_private_t *p_sys = pl_priv(p_playlist);
- PL_LOCK;
+ PL_LOCK_IF( !b_locked );
if( p_sys->p_fetcher )
playlist_fetcher_Push( p_sys->p_fetcher, p_item );
- PL_UNLOCK;
+ PL_UNLOCK_IF( !b_locked );
return VLC_SUCCESS;
}