]> git.sesse.net Git - vlc/blobdiff - src/playlist/thread.c
Some more (mostly) untested stuff:
[vlc] / src / playlist / thread.c
index 78fb70a57521f1a753a2f44df379a603f6cd1323..5efe4231ea7f2c85c15bba53a04288777b51cc64 100644 (file)
@@ -33,6 +33,7 @@
  *****************************************************************************/
 static void RunControlThread ( playlist_t * );
 static void RunPreparse( playlist_preparse_t * );
+static void RunSecondaryPreparse( playlist_secondary_preparse_t * );
 
 static playlist_t * CreatePlaylist( vlc_object_t *p_parent );
 static void HandlePlaylist( playlist_t * );
@@ -93,6 +94,30 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent )
         return;
     }
 
+    // Secondary Preparse
+    p_playlist->p_secondary_preparse = vlc_object_create( p_playlist,
+                              sizeof( playlist_secondary_preparse_t ) );
+    if( !p_playlist->p_secondary_preparse )
+    {
+        msg_Err( p_playlist, "unable to create secondary preparser" );
+        vlc_object_destroy( p_playlist );
+        return;
+    }
+    p_playlist->p_secondary_preparse->i_waiting = 0;
+    p_playlist->p_secondary_preparse->p_waiting = NULL;
+
+    vlc_object_attach( p_playlist->p_secondary_preparse, p_playlist );
+    if( vlc_thread_create( p_playlist->p_secondary_preparse,
+                           "secondary preparser",
+                           RunSecondaryPreparse,
+                           VLC_THREAD_PRIORITY_LOW, VLC_TRUE ) )
+    {
+        msg_Err( p_playlist, "cannot spawn secondary preparse thread" );
+        vlc_object_detach( p_playlist->p_secondary_preparse );
+        vlc_object_destroy( p_playlist->p_secondary_preparse );
+        return;
+    }
+
     // Start the thread
     if( vlc_thread_create( p_playlist, "playlist", RunControlThread,
                            VLC_THREAD_PRIORITY_LOW, VLC_TRUE ) )
@@ -141,20 +166,10 @@ static void RunControlThread ( playlist_t *p_playlist )
 
         HandleInteraction( p_playlist );
         HandleStats( p_playlist, i_loops );
-
         HandlePlaylist( p_playlist );
 
-        msleep( INTF_IDLE_SLEEP / 2 );
-
-        /* Stop sleeping earlier if we have work */
-        /* TODO : statistics about this */
-        if ( p_playlist->request.b_request &&
-                        p_playlist->status.i_status == PLAYLIST_RUNNING )
-        {
-            continue;
-        }
-
-        msleep( INTF_IDLE_SLEEP / 2 );
+        /* 100 ms is an acceptable delay for playlist operations */
+        msleep( INTF_IDLE_SLEEP*2 );
     }
 
     EndPlaylist( p_playlist );
@@ -195,7 +210,23 @@ static void RunPreparse ( playlist_preparse_t *p_obj )
 
     while( !p_playlist->b_die )
     {
-        playlist_PreparseLoop(  p_obj );
+        playlist_PreparseLoop( p_obj );
+        if( p_obj->i_waiting == 0 )
+        {
+            msleep( INTF_IDLE_SLEEP );
+        }
+    }
+}
+
+static void RunSecondaryPreparse( playlist_secondary_preparse_t *p_obj )
+{
+    playlist_t *p_playlist = (playlist_t *)p_obj->p_parent;
+    /* Tell above that we're ready */
+    vlc_thread_ready( p_obj );
+
+    while( !p_playlist->b_die )
+    {
+        playlist_SecondaryPreparseLoop( p_obj );
         if( p_obj->i_waiting == 0 )
         {
             msleep( INTF_IDLE_SLEEP );
@@ -233,7 +264,7 @@ static void HandleInteraction( playlist_t *p_playlist )
  *****************************************************************************/
 static void HandleStats( playlist_t *p_playlist, int i_loops )
 {
-    if( i_loops %5 == 0 && p_playlist->p_stats )
+    if( i_loops % 5 == 0 && p_playlist->p_stats )
     {
         stats_ComputeGlobalStats( p_playlist, p_playlist->p_stats );
         if( p_playlist->p_input )