X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fplaylist%2Fcontrol.c;h=38ddf485646668a97440732351a857bd6b2a64f0;hb=470ce70b69e1530173950a8dfd6d274a70caa7bc;hp=8aa576029b0fd6ea4d4280ecceb4645dfcc955a8;hpb=8f0f6c745c2a00f3c59bd5e19d094a5627e4be7d;p=vlc diff --git a/src/playlist/control.c b/src/playlist/control.c index 8aa576029b..38ddf48564 100644 --- a/src/playlist/control.c +++ b/src/playlist/control.c @@ -39,31 +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_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, @@ -83,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 ) @@ -123,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 @@ -138,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; @@ -176,7 +189,7 @@ static int PlaylistVAControl( playlist_t * p_playlist, int i_query, va_list args 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; } @@ -185,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 ) +int playlist_PreparseEnqueue( playlist_t *p_playlist, input_item_t *p_item ) { playlist_private_t *p_sys = pl_priv(p_playlist); - PL_LOCK; if( p_sys->p_preparser ) playlist_preparser_Push( p_sys->p_preparser, p_item ); - PL_UNLOCK; return VLC_SUCCESS; } -int playlist_AskForArtEnqueue( playlist_t *p_playlist, - input_item_t *p_item ) +int playlist_AskForArtEnqueue( playlist_t *p_playlist, input_item_t *p_item ) { playlist_private_t *p_sys = pl_priv(p_playlist); - PL_LOCK; if( p_sys->p_fetcher ) playlist_fetcher_Push( p_sys->p_fetcher, p_item ); - PL_UNLOCK; return VLC_SUCCESS; }