]> git.sesse.net Git - vlc/blobdiff - src/playlist/control.c
Don't loop preparse threads when idle
[vlc] / src / playlist / control.c
index 7cc468d9f508af962450d62f6721b804186e5dac..aa84a184af88b4494121b40a440437f572685d41 100644 (file)
@@ -24,6 +24,7 @@
 #include <vlc/vlc.h>
 #include <vlc/input.h>
 #include "vlc_playlist.h"
+#include "playlist_internal.h"
 #include <assert.h>
 
 /*****************************************************************************
@@ -197,6 +198,7 @@ int playlist_PreparseEnqueue( playlist_t *p_playlist,
                  p_playlist->p_preparse->i_waiting,
                  p_item );
     vlc_mutex_unlock( &p_playlist->p_preparse->object_lock );
+    vlc_cond_signal( &p_playlist->p_preparse->object_wait );
     return VLC_SUCCESS;
 }
 
@@ -213,6 +215,27 @@ int playlist_PreparseEnqueueItem( playlist_t *p_playlist,
     return VLC_SUCCESS;
 }
 
+int playlist_AskForArtEnqueue( playlist_t *p_playlist,
+                              input_item_t *p_item )
+{
+    int i;
+    preparse_item_t p;
+    p.p_item = p_item;
+    p.b_fetch_art = VLC_TRUE;
+
+    vlc_mutex_lock( &p_playlist->p_secondary_preparse->object_lock );
+    for( i = 0; i < p_playlist->p_secondary_preparse->i_waiting &&
+         p_playlist->p_secondary_preparse->p_waiting->b_fetch_art == VLC_TRUE;
+         i++ );
+    vlc_gc_incref( p_item );
+    INSERT_ELEM( p_playlist->p_secondary_preparse->p_waiting,
+                 p_playlist->p_secondary_preparse->i_waiting,
+                 i, p );
+    vlc_mutex_unlock( &p_playlist->p_secondary_preparse->object_lock );
+    vlc_cond_signal( &p_playlist->p_secondary_preparse->object_lock );
+    return VLC_SUCCESS;
+}
+
 void PreparseEnqueueItemSub( playlist_t *p_playlist,
                              playlist_item_t *p_item )
 {
@@ -229,8 +252,7 @@ void PreparseEnqueueItemSub( playlist_t *p_playlist,
     {
         for( i = 0; i < p_item->i_children; i++)
         {
-            PreparseEnqueueItemSub( p_playlist,
-                                             p_item->pp_children[i] );
+            PreparseEnqueueItemSub( p_playlist, p_item->pp_children[i] );
         }
     }
 }
@@ -272,11 +294,18 @@ playlist_item_t * playlist_NextItem( playlist_t *p_playlist )
         return NULL;
     }
 
-    if( !p_playlist->request.b_request && p_playlist->status.p_item &&
-         p_playlist->status.p_item->i_flags & PLAYLIST_SKIP_FLAG )
+    if( !p_playlist->request.b_request && p_playlist->status.p_item )
     {
-        msg_Dbg( p_playlist, "blocking item, stopping") ;
-        return NULL;
+        playlist_item_t *p_parent = p_playlist->status.p_item;
+        while( p_parent )
+        {
+            if( p_parent->i_flags & PLAYLIST_SKIP_FLAG )
+            {
+                msg_Dbg( p_playlist, "blocking item, stopping") ;
+                return NULL;
+            }
+            p_parent = p_parent->p_parent;
+        }
     }
 
     /* Random case. This is an exception: if request, but request is skip +- 1
@@ -315,6 +344,7 @@ playlist_item_t * playlist_NextItem( playlist_t *p_playlist )
                 p_playlist->pp_random[j] = p_tmp;
             }
             p_playlist->b_reset_random = VLC_FALSE;
+            PL_DEBUG( "random rebuilt, have %i items", p_playlist->i_random );
         }
         else
         {
@@ -349,11 +379,11 @@ end:
     /* Start the real work */
     if( p_playlist->request.b_request )
     {
-        PL_DEBUG( "processing request node %s item %s skip %i",
-                        PLI_NAME( p_playlist->request.p_item ),
-                        PLI_NAME( p_playlist->request.p_node ), i_skip );
         p_new = p_playlist->request.p_item;
         i_skip = p_playlist->request.i_skip;
+        PL_DEBUG( "processing request item %s node %s skip %i",
+                        PLI_NAME( p_playlist->request.p_item ),
+                        PLI_NAME( p_playlist->request.p_node ), i_skip );
 
         if( p_playlist->request.p_node )
             p_playlist->status.p_node = p_playlist->request.p_node;