X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fplaylist%2Fcontrol.c;h=38ddf485646668a97440732351a857bd6b2a64f0;hb=7e4d50ac4297d445b46075b0dd87d11a951d5a3e;hp=1f10fb71d7dee518cb2638bd95c1d862c4decc81;hpb=0f9541fa5ba1bd7adf75eda3e0eb185f8cb0e3b4;p=vlc diff --git a/src/playlist/control.c b/src/playlist/control.c index 1f10fb71d7..38ddf48564 100644 --- a/src/playlist/control.c +++ b/src/playlist/control.c @@ -39,31 +39,37 @@ 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 ) @@ -192,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; }