X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fplaylist%2Fcontrol.c;h=38ddf485646668a97440732351a857bd6b2a64f0;hb=86205b1ee926a25d788a31c3d92f9114009193db;hp=f9260e072a92ba636e1ec6740abdb16ff1c38fd0;hpb=4ca1e354903dcaa4452ceda2378d3a56e228b28f;p=vlc diff --git a/src/playlist/control.c b/src/playlist/control.c index f9260e072a..38ddf48564 100644 --- a/src/playlist/control.c +++ b/src/playlist/control.c @@ -39,46 +39,52 @@ static int PlaylistVAControl( playlist_t * p_playlist, int i_query, va_list args * Playlist control *****************************************************************************/ -playlist_t *__pl_Hold( vlc_object_t *p_this ) +static vlc_mutex_t global_lock = VLC_STATIC_MUTEX; + +#undef pl_Get +playlist_t *pl_Get (vlc_object_t *obj) { playlist_t *pl; + libvlc_int_t *p_libvlc = obj->p_libvlc; - 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 - using pl_Hold. use vlc_object_hold in this case */ ); + vlc_mutex_lock (&global_lock); + pl = libvlc_priv (p_libvlc)->p_playlist; + assert (pl != NULL); - if (pl) - vlc_object_hold (pl); + if (!libvlc_priv (p_libvlc)->playlist_active) + { + playlist_Activate (pl); + libvlc_priv (p_libvlc)->playlist_active = true; + } + vlc_mutex_unlock (&global_lock); return pl; } -void __pl_Release( vlc_object_t *p_this ) +void pl_Deactivate (libvlc_int_t *p_libvlc) { - playlist_t *pl = libvlc_priv (p_this->p_libvlc)->p_playlist; - assert( pl != NULL ); + bool deactivate; - /* The rule is that pl_Release() should act on - the same object than pl_Hold() */ - assert( VLC_OBJECT(pl) != p_this); + vlc_mutex_lock (&global_lock); + deactivate = libvlc_priv (p_libvlc)->playlist_active; + vlc_mutex_unlock (&global_lock); - vlc_object_release( pl ); + if (deactivate) + playlist_Deactivate (libvlc_priv (p_libvlc)->p_playlist); } void playlist_Lock( playlist_t *pl ) { - vlc_object_lock( pl ); + vlc_mutex_lock( &pl_priv(pl)->lock ); } void playlist_Unlock( playlist_t *pl ) { - vlc_object_unlock( pl ); + vlc_mutex_unlock( &pl_priv(pl)->lock ); } void playlist_AssertLocked( playlist_t *pl ) { - vlc_object_assert_locked( pl ); + vlc_assert_locked( &pl_priv(pl)->lock ); } int playlist_Control( playlist_t * p_playlist, int i_query, @@ -98,14 +104,13 @@ int playlist_Control( playlist_t * p_playlist, int i_query, 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 ) @@ -138,8 +143,7 @@ static int PlaylistVAControl( playlist_t * p_playlist, int i_query, va_list args 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 @@ -153,27 +157,21 @@ static int PlaylistVAControl( playlist_t * p_playlist, int i_query, va_list args 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; @@ -200,28 +198,22 @@ static int PlaylistVAControl( playlist_t * p_playlist, int i_query, va_list args * Preparse control *****************************************************************************/ /** Enqueue an item for preparsing */ -int playlist_PreparseEnqueue( playlist_t *p_playlist, - input_item_t *p_item, bool b_locked ) +int playlist_PreparseEnqueue( playlist_t *p_playlist, input_item_t *p_item ) { playlist_private_t *p_sys = pl_priv(p_playlist); - PL_LOCK_IF( !b_locked ); if( p_sys->p_preparser ) playlist_preparser_Push( p_sys->p_preparser, p_item ); - PL_UNLOCK_IF( !b_locked ); return VLC_SUCCESS; } -int playlist_AskForArtEnqueue( playlist_t *p_playlist, - input_item_t *p_item, bool b_locked ) +int playlist_AskForArtEnqueue( playlist_t *p_playlist, input_item_t *p_item ) { playlist_private_t *p_sys = pl_priv(p_playlist); - PL_LOCK_IF( !b_locked ); if( p_sys->p_fetcher ) playlist_fetcher_Push( p_sys->p_fetcher, p_item ); - PL_UNLOCK_IF( !b_locked ); return VLC_SUCCESS; }