]> git.sesse.net Git - vlc/blobdiff - src/playlist/control.c
Use var_Inherit* instead of var_CreateGet*.
[vlc] / src / playlist / control.c
index 9d565bb9496bfc8c9e784d06148af9389826238d..38ddf485646668a97440732351a857bd6b2a64f0 100644 (file)
@@ -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,22 +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);
 
-    playlist_preparser_Push( p_sys->p_preparser, p_item );
+    if( p_sys->p_preparser )
+        playlist_preparser_Push( p_sys->p_preparser, p_item );
 
     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);
 
-    playlist_fetcher_Push( p_sys->p_fetcher, p_item );
+    if( p_sys->p_fetcher )
+        playlist_fetcher_Push( p_sys->p_fetcher, p_item );
 
     return VLC_SUCCESS;
 }