From: RĂ©mi Denis-Courmont Date: Wed, 4 Jun 2008 18:13:47 +0000 (+0300) Subject: Handle sout-keep from the playlist engine X-Git-Tag: 0.9.0-test0~372 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=65892ac8249cd60f0f2ae25e138a76c76436e9e3;p=vlc Handle sout-keep from the playlist engine --- 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 */