]> git.sesse.net Git - vlc/blobdiff - src/playlist/thread.c
Some more (mostly) untested stuff:
[vlc] / src / playlist / thread.c
index 9e36aca173f9971b0785781c62f1dfacfdf5aee4..5efe4231ea7f2c85c15bba53a04288777b51cc64 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 #include <vlc/vlc.h>
+#include <vlc_es.h>
 #include <vlc_input.h>
 #include "vlc_playlist.h"
 #include "vlc_interaction.h"
+#include "playlist_internal.h"
 
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
 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 * );
@@ -55,12 +58,12 @@ static void DestroyInteraction( playlist_t * );
  * \param p_parent
  * \return an object with a started thread
  */
-playlist_t * __playlist_ThreadCreate( vlc_object_t *p_parent )
+void __playlist_ThreadCreate( vlc_object_t *p_parent )
 {
     playlist_t *p_playlist;
     p_playlist = CreatePlaylist( p_parent );
 
-    if( !p_playlist ) return NULL;
+    if( !p_playlist ) return;
 
     // Stats
     p_playlist->p_stats = (global_stats_t *)malloc( sizeof( global_stats_t ) );
@@ -76,7 +79,7 @@ playlist_t * __playlist_ThreadCreate( vlc_object_t *p_parent )
     {
         msg_Err( p_playlist, "unable to create preparser" );
         vlc_object_destroy( p_playlist );
-        return NULL;
+        return;
     }
     p_playlist->p_preparse->i_waiting = 0;
     p_playlist->p_preparse->pp_waiting = NULL;
@@ -88,7 +91,31 @@ playlist_t * __playlist_ThreadCreate( vlc_object_t *p_parent )
         msg_Err( p_playlist, "cannot spawn preparse thread" );
         vlc_object_detach( p_playlist->p_preparse );
         vlc_object_destroy( p_playlist->p_preparse );
-        return NULL;
+        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
@@ -97,13 +124,13 @@ playlist_t * __playlist_ThreadCreate( vlc_object_t *p_parent )
     {
         msg_Err( p_playlist, "cannot spawn playlist thread" );
         vlc_object_destroy( p_playlist );
-        return NULL;
+        return;
     }
 
     /* The object has been initialized, now attach it */
     vlc_object_attach( p_playlist, p_parent );
 
-    return p_playlist;
+    return;
 }
 
 /**
@@ -139,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 );
@@ -187,13 +204,29 @@ static void EndPlaylist( playlist_t *p_playlist )
  *****************************************************************************/
 static void RunPreparse ( playlist_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_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_PreparseLoop(  p_obj );
+        playlist_SecondaryPreparseLoop( p_obj );
         if( p_obj->i_waiting == 0 )
         {
             msleep( INTF_IDLE_SLEEP );
@@ -209,6 +242,8 @@ static void DestroyInteraction( playlist_t *p_playlist )
     if( p_playlist->p_interaction )
     {
         intf_InteractionDestroy( p_playlist->p_interaction );
+        fprintf( stderr, "NOW NULL ****\n" );
+        p_playlist->p_interaction = NULL;
     }
 }
 
@@ -229,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 )