From 65892ac8249cd60f0f2ae25e138a76c76436e9e3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Wed, 4 Jun 2008 21:13:47 +0300 Subject: [PATCH] Handle sout-keep from the playlist engine --- src/libvlc.h | 3 +++ src/playlist/control.c | 5 ++++- src/playlist/engine.c | 22 ++++++++++++++-------- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/libvlc.h b/src/libvlc.h index 7a7665036b..936b75c1e0 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -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) diff --git a/src/playlist/control.c b/src/playlist/control.c index 24393b1ded..9a0ba6de3b 100644 --- a/src/playlist/control.c +++ b/src/playlist/control.c @@ -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 ) || diff --git a/src/playlist/engine.c b/src/playlist/engine.c index 9c0475c246..35fc7d7ece 100644 --- a/src/playlist/engine.c +++ b/src/playlist/engine.c @@ -26,6 +26,7 @@ # include "config.h" #endif +#include #include #include #include @@ -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 */ -- 2.39.2