]> git.sesse.net Git - vlc/commitdiff
Handle sout-keep from the playlist engine
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Wed, 4 Jun 2008 18:13:47 +0000 (21:13 +0300)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Wed, 4 Jun 2008 18:14:30 +0000 (21:14 +0300)
src/libvlc.h
src/playlist/control.c
src/playlist/engine.c

index 7a7665036b65553f3d5b1274ec950d1eae17a065..936b75c1e06ed95aa08584703756c0077131638e 100644 (file)
@@ -237,6 +237,9 @@ typedef struct libvlc_priv_t
     vlm_t             *p_vlm;  ///< the VLM singleton (or NULL)
     vlc_object_t      *p_interaction;    ///< interface interaction object
     httpd_t           *p_httpd; ///< HTTP daemon (src/network/httpd.c)
+
+    /* Private playlist data (FIXME - playlist_t is too public...) */
+    sout_instance_t   *p_sout; ///< kept sout instance (for playlist)
 } libvlc_priv_t;
 
 static inline libvlc_priv_t *libvlc_priv (libvlc_int_t *libvlc)
index 24393b1ded9873f70d29c40751827a7fa1e372f3..9a0ba6de3bedac80051d331840c259555391be83 100644 (file)
@@ -464,6 +464,7 @@ playlist_item_t * playlist_NextItem( playlist_t *p_playlist )
 int playlist_PlayItem( playlist_t *p_playlist, playlist_item_t *p_item )
 {
     input_item_t *p_input = p_item->p_input;
+    sout_instance_t **pp_sout = &libvlc_priv(p_playlist->p_libvlc)->p_sout;
     int i_activity = var_GetInteger( p_playlist, "activity" ) ;
 
     msg_Dbg( p_playlist, "creating new input thread" );
@@ -475,7 +476,9 @@ int playlist_PlayItem( playlist_t *p_playlist, playlist_item_t *p_item )
 
     var_SetInteger( p_playlist, "activity", i_activity +
                     DEFAULT_INPUT_ACTIVITY );
-    p_playlist->p_input = input_CreateThread( p_playlist, p_input );
+    p_playlist->p_input =
+        input_CreateThreadExtended( p_playlist, p_input, NULL, *pp_sout );
+    *pp_sout = NULL;
 
     char *psz_uri = input_item_GetURI( p_item->p_input );
     if( psz_uri && ( !strncmp( psz_uri, "directory:", 10 ) ||
index 9c0475c2461104db7b2ae1cfa88c3bfb2d078822..35fc7d7ece88d2f19e8e832fc5a7394cc90c466d 100644 (file)
@@ -26,6 +26,7 @@
 # include "config.h"
 #endif
 
+#include <assert.h>
 #include <vlc_common.h>
 #include <vlc_vout.h>
 #include <vlc_sout.h>
@@ -263,10 +264,16 @@ check_input:
         {
             int i_activity;
             input_thread_t *p_input;
+            sout_instance_t **pp_sout =
+                &libvlc_priv(p_playlist->p_libvlc)->p_sout;
+
             PL_DEBUG( "dead input" );
 
             p_input = p_playlist->p_input;
             p_playlist->p_input = NULL;
+            assert( *pp_sout == NULL );
+            if( var_CreateGetBool( p_input, "sout-keep" ) )
+                *pp_sout = input_DetachSout( p_input );
 
             /* Release the playlist lock, because we may get stuck
              * in vlc_object_release() for some time. */
@@ -404,6 +411,9 @@ void playlist_LastLoop( playlist_t *p_playlist )
             p_playlist->p_input = NULL;
             PL_UNLOCK;
 
+            /* sout-keep: no need to anything here.
+             * The last input will destroy its sout, if any, by itself */
+
             /* Destroy input */
             vlc_object_release( p_input );
             continue;
@@ -429,14 +439,10 @@ void playlist_LastLoop( playlist_t *p_playlist )
     }
 
 #ifdef ENABLE_SOUT
-    /* close all remaining sout */
-    while( ( p_obj = vlc_object_find( p_playlist,
-                                      VLC_OBJECT_SOUT, FIND_CHILD ) ) )
-    {
-        vlc_object_detach( p_obj );
-        vlc_object_release( p_obj );
-        sout_DeleteInstance( (sout_instance_t*)p_obj );
-    }
+    /* close the remaining sout-keep (if there was no input atm) */
+    sout_instance_t *p_sout = libvlc_priv (p_playlist->p_libvlc)->p_sout;
+    if (p_sout)
+        sout_DeleteInstance( p_sout );
 #endif
 
     /* close all remaining vout */