Commit 65892ac8 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Handle sout-keep from the playlist engine

parent bed1fe1b
...@@ -237,6 +237,9 @@ typedef struct libvlc_priv_t ...@@ -237,6 +237,9 @@ typedef struct libvlc_priv_t
vlm_t *p_vlm; ///< the VLM singleton (or NULL) vlm_t *p_vlm; ///< the VLM singleton (or NULL)
vlc_object_t *p_interaction; ///< interface interaction object vlc_object_t *p_interaction; ///< interface interaction object
httpd_t *p_httpd; ///< HTTP daemon (src/network/httpd.c) 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; } libvlc_priv_t;
static inline libvlc_priv_t *libvlc_priv (libvlc_int_t *libvlc) static inline libvlc_priv_t *libvlc_priv (libvlc_int_t *libvlc)
......
...@@ -464,6 +464,7 @@ playlist_item_t * playlist_NextItem( playlist_t *p_playlist ) ...@@ -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 ) int playlist_PlayItem( playlist_t *p_playlist, playlist_item_t *p_item )
{ {
input_item_t *p_input = p_item->p_input; 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" ) ; int i_activity = var_GetInteger( p_playlist, "activity" ) ;
msg_Dbg( p_playlist, "creating new input thread" ); msg_Dbg( p_playlist, "creating new input thread" );
...@@ -475,7 +476,9 @@ int playlist_PlayItem( playlist_t *p_playlist, playlist_item_t *p_item ) ...@@ -475,7 +476,9 @@ int playlist_PlayItem( playlist_t *p_playlist, playlist_item_t *p_item )
var_SetInteger( p_playlist, "activity", i_activity + var_SetInteger( p_playlist, "activity", i_activity +
DEFAULT_INPUT_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 ); char *psz_uri = input_item_GetURI( p_item->p_input );
if( psz_uri && ( !strncmp( psz_uri, "directory:", 10 ) || if( psz_uri && ( !strncmp( psz_uri, "directory:", 10 ) ||
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
# include "config.h" # include "config.h"
#endif #endif
#include <assert.h>
#include <vlc_common.h> #include <vlc_common.h>
#include <vlc_vout.h> #include <vlc_vout.h>
#include <vlc_sout.h> #include <vlc_sout.h>
...@@ -263,10 +264,16 @@ check_input: ...@@ -263,10 +264,16 @@ check_input:
{ {
int i_activity; int i_activity;
input_thread_t *p_input; input_thread_t *p_input;
sout_instance_t **pp_sout =
&libvlc_priv(p_playlist->p_libvlc)->p_sout;
PL_DEBUG( "dead input" ); PL_DEBUG( "dead input" );
p_input = p_playlist->p_input; p_input = p_playlist->p_input;
p_playlist->p_input = NULL; 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 /* Release the playlist lock, because we may get stuck
* in vlc_object_release() for some time. */ * in vlc_object_release() for some time. */
...@@ -404,6 +411,9 @@ void playlist_LastLoop( playlist_t *p_playlist ) ...@@ -404,6 +411,9 @@ void playlist_LastLoop( playlist_t *p_playlist )
p_playlist->p_input = NULL; p_playlist->p_input = NULL;
PL_UNLOCK; PL_UNLOCK;
/* sout-keep: no need to anything here.
* The last input will destroy its sout, if any, by itself */
/* Destroy input */ /* Destroy input */
vlc_object_release( p_input ); vlc_object_release( p_input );
continue; continue;
...@@ -429,14 +439,10 @@ void playlist_LastLoop( playlist_t *p_playlist ) ...@@ -429,14 +439,10 @@ void playlist_LastLoop( playlist_t *p_playlist )
} }
#ifdef ENABLE_SOUT #ifdef ENABLE_SOUT
/* close all remaining sout */ /* close the remaining sout-keep (if there was no input atm) */
while( ( p_obj = vlc_object_find( p_playlist, sout_instance_t *p_sout = libvlc_priv (p_playlist->p_libvlc)->p_sout;
VLC_OBJECT_SOUT, FIND_CHILD ) ) ) if (p_sout)
{ sout_DeleteInstance( p_sout );
vlc_object_detach( p_obj );
vlc_object_release( p_obj );
sout_DeleteInstance( (sout_instance_t*)p_obj );
}
#endif #endif
/* close all remaining vout */ /* close all remaining vout */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment