vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Mon Nov 26 23:53:36 2012 +0200| [f2b9c723187fcdb1b24285771cc6f7d580be2ba1] | committer: Rémi Denis-Courmont
playlist: create the playlist when needed (refs #5460) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f2b9c723187fcdb1b24285771cc6f7d580be2ba1 --- src/libvlc.c | 24 +++++++++--------------- src/libvlc.h | 2 -- src/playlist/engine.c | 22 ++++++++++++++-------- src/playlist/playlist_internal.h | 3 --- src/playlist/thread.c | 18 ++---------------- 5 files changed, 25 insertions(+), 44 deletions(-) diff --git a/src/libvlc.c b/src/libvlc.c index bf5ae78..9a3d03c 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -145,7 +145,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char * psz_modules = NULL; char * psz_parser = NULL; char * psz_control = NULL; - playlist_t *p_playlist = NULL; char *psz_val; /* System specific initialization code */ @@ -433,15 +432,6 @@ dbus_out: var_Create( p_libvlc, "user-agent", VLC_VAR_STRING ); var_SetString( p_libvlc, "user-agent", "(LibVLC "VERSION")" ); - /* Initialize playlist and get commandline files */ - p_playlist = playlist_Create( VLC_OBJECT(p_libvlc) ); - if( !p_playlist ) - { - msg_Err( p_libvlc, "playlist initialization failed" ); - module_EndBank (true); - return VLC_EGENERIC; - } - /* System specific configuration */ system_Configure( p_libvlc, i_argc - vlc_optind, ppsz_argv + vlc_optind ); @@ -468,7 +458,7 @@ dbus_out: { char *p = psz_modules, *m; while( ( m = strsep( &p, " :," ) ) != NULL ) - playlist_ServicesDiscoveryAdd( p_playlist, m ); + playlist_ServicesDiscoveryAdd( pl_Get(p_libvlc), m ); free( psz_modules ); } @@ -582,7 +572,7 @@ dbus_out: psz_val = var_InheritString( p_libvlc, "open" ); if ( psz_val != NULL ) { - playlist_AddExt( p_playlist, psz_val, NULL, PLAYLIST_INSERT, 0, + playlist_AddExt( pl_Get(p_libvlc), psz_val, NULL, PLAYLIST_INSERT, 0, -1, 0, NULL, 0, true, pl_Unlocked ); free( psz_val ); } @@ -600,8 +590,11 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) playlist_t *p_playlist = libvlc_priv (p_libvlc)->p_playlist; /* Remove all services discovery */ - msg_Dbg( p_libvlc, "removing all services discovery tasks" ); - playlist_ServicesDiscoveryKillAll( p_playlist ); + if( p_playlist != NULL ) + { + msg_Dbg( p_libvlc, "removing all services discovery tasks" ); + playlist_ServicesDiscoveryKillAll( p_playlist ); + } /* Ask the interfaces to stop and destroy them */ msg_Dbg( p_libvlc, "removing all interfaces" ); @@ -627,7 +620,8 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) #endif /* Free playlist now, all threads are gone */ - playlist_Destroy( p_playlist ); + if( p_playlist != NULL ) + playlist_Destroy( p_playlist ); msg_Dbg( p_libvlc, "removing stats" ); diff --git a/src/libvlc.h b/src/libvlc.h index 4392f48..ebc68c9 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -141,8 +141,6 @@ typedef struct libvlc_priv_t { libvlc_int_t public_data; - bool playlist_active; - /* Messages */ signed char i_verbose; ///< info messages bool b_color; ///< color messages? diff --git a/src/playlist/engine.c b/src/playlist/engine.c index 3a72621..dc5b0e9 100644 --- a/src/playlist/engine.c +++ b/src/playlist/engine.c @@ -195,7 +195,7 @@ static int VideoSplitterCallback( vlc_object_t *p_this, char const *psz_cmd, * \param p_parent the vlc object that is to be the parent of this playlist * \return a pointer to the created playlist, or NULL on error */ -playlist_t * playlist_Create( vlc_object_t *p_parent ) +static playlist_t *playlist_Create( vlc_object_t *p_parent ) { playlist_t *p_playlist; playlist_private_t *p; @@ -209,8 +209,6 @@ playlist_t * playlist_Create( vlc_object_t *p_parent ) p_playlist = &p->public_data; TAB_INIT( pl_priv(p_playlist)->i_sds, pl_priv(p_playlist)->pp_sds ); - libvlc_priv(p_parent->p_libvlc)->p_playlist = p_playlist; - VariablesInit( p_playlist ); vlc_mutex_init( &p->lock ); vlc_cond_init( &p->signal ); @@ -298,6 +296,14 @@ playlist_t * playlist_Create( vlc_object_t *p_parent ) pl_priv(p_playlist)->b_auto_preparse = b_auto_preparse; } + /* Input resources */ + p->p_input_resource = input_resource_New( VLC_OBJECT( p_playlist ) ); + if( unlikely(p->p_input_resource == NULL) ) + abort(); + + /* Thread */ + playlist_Activate (p_playlist); + return p_playlist; } @@ -366,12 +372,12 @@ playlist_t *pl_Get (vlc_object_t *obj) vlc_mutex_lock (&lock); pl = libvlc_priv (p_libvlc)->p_playlist; - assert (pl != NULL); - - if (!libvlc_priv (p_libvlc)->playlist_active) + if (unlikely(pl == NULL)) { - playlist_Activate (pl); - libvlc_priv (p_libvlc)->playlist_active = true; + pl = playlist_Create (VLC_OBJECT(p_libvlc)); + if (unlikely(pl == NULL)) + abort(); + libvlc_priv (p_libvlc)->p_playlist = pl; } vlc_mutex_unlock (&lock); return pl; diff --git a/src/playlist/playlist_internal.h b/src/playlist/playlist_internal.h index 7e6bede..9b6c000 100644 --- a/src/playlist/playlist_internal.h +++ b/src/playlist/playlist_internal.h @@ -99,10 +99,7 @@ typedef struct playlist_private_t *****************************************************************************/ /* Creation/Deletion */ -playlist_t *playlist_Create( vlc_object_t * ); void playlist_Destroy( playlist_t * ); - -/* */ void playlist_Activate( playlist_t * ); /* */ diff --git a/src/playlist/thread.c b/src/playlist/thread.c index 5f22924..9bfbc3c 100644 --- a/src/playlist/thread.c +++ b/src/playlist/thread.c @@ -46,29 +46,18 @@ static void *Thread ( void * ); *****************************************************************************/ /** - * Create the main playlist threads. - * Additionally to the playlist, this thread controls : - * - Statistics - * - VLM - * \param p_parent - * \return an object with a started thread + * Creates the main playlist thread. */ void playlist_Activate( playlist_t *p_playlist ) { - /* */ playlist_private_t *p_sys = pl_priv(p_playlist); - p_sys->p_input_resource = input_resource_New( VLC_OBJECT( p_playlist ) ); - if( unlikely(p_sys->p_input_resource == NULL) ) - abort(); - - /* Start the playlist thread */ if( vlc_clone( &p_sys->thread, Thread, p_playlist, VLC_THREAD_PRIORITY_LOW ) ) { msg_Err( p_playlist, "cannot spawn playlist thread" ); + abort(); } - msg_Dbg( p_playlist, "playlist threads correctly activated" ); } /** @@ -80,9 +69,6 @@ void playlist_Deactivate( playlist_t *p_playlist ) { playlist_private_t *p_sys = pl_priv(p_playlist); - if( p_sys->p_input_resource == NULL ) - return; /* playlist was never activated... */ - PL_LOCK; /* WARNING: There is a latent bug. It is assumed that only one thread will * be waiting for playlist deactivation at a time. So far, that works _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
