X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Flibvlc-common.c;h=24d2290f870687f92440e796c014d9115c3b5e94;hb=119907171ba2165f0259e37baf19cdf9e9f595a5;hp=1c81ca79e5a41bdba3614c34fe29febff0885a55;hpb=04a4af73ffcb9602a697e5b2bd8df21c9e9b3c6d;p=vlc diff --git a/src/libvlc-common.c b/src/libvlc-common.c index 1c81ca79e5..24d2290f87 100644 --- a/src/libvlc-common.c +++ b/src/libvlc-common.c @@ -95,11 +95,13 @@ #include +#include + /***************************************************************************** * The evil global variables. We handle them with care, don't worry. *****************************************************************************/ static libvlc_int_t * p_static_vlc = NULL; -static volatile unsigned int i_instances = 0; +static unsigned i_instances = 0; static bool b_daemon = false; @@ -179,7 +181,7 @@ libvlc_int_t * libvlc_InternalCreate( void ) return NULL; priv = libvlc_priv (p_libvlc); - p_libvlc->p_playlist = NULL; + priv->p_playlist = NULL; priv->p_interaction = NULL; priv->p_vlm = NULL; p_libvlc->psz_object_name = strdup( "libvlc" ); @@ -206,9 +208,7 @@ libvlc_int_t * libvlc_InternalCreate( void ) /* Initialize mutexes */ vlc_mutex_init( &priv->timer_lock ); vlc_mutex_init( &priv->config_lock ); -#ifdef __APPLE__ - vlc_thread_set_priority( p_libvlc, VLC_THREAD_PRIORITY_LOW ); -#endif + /* Store data for the non-reentrant API */ p_static_vlc = p_libvlc; @@ -279,6 +279,12 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, return VLC_EGENERIC; } +#ifdef __APPLE__ + /* vlc_thread_set_priority needs to query the config, + * so this is the earliest moment where we can set this */ + vlc_thread_set_priority( p_libvlc, VLC_THREAD_PRIORITY_LOW ); +#endif + /* Check for short help option */ if( config_GetInt( p_libvlc, "help" ) > 0 ) { @@ -295,10 +301,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, } /* Set the config file stuff */ - p_libvlc->psz_homedir = config_GetHomeDir(); - p_libvlc->psz_configdir = config_GetConfigDir(); - p_libvlc->psz_datadir = config_GetUserDataDir(); - p_libvlc->psz_cachedir = config_GetCacheDir(); priv->psz_configfile = config_GetCustomConfigFile( p_libvlc ); /* Check for plugins cache options */ @@ -312,7 +314,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* Check for daemon mode */ #ifndef WIN32 - if( config_GetInt( p_libvlc, "daemon" ) ) + if( config_GetInt( p_libvlc, "daemon" ) > 0 ) { #ifdef HAVE_DAEMON char *psz_pidfile = NULL; @@ -429,7 +431,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, } msg_Dbg( p_libvlc, "module bank initialized, found %i modules", - p_libvlc_global->p_module_bank->i_children ); + vlc_internals( p_libvlc_global->p_module_bank )->i_children ); /* Check for help on modules */ if( (p_tmp = config_GetPsz( p_libvlc, "module" )) ) @@ -739,7 +741,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* Initialize playlist and get commandline files */ playlist_ThreadCreate( p_libvlc ); - if( !p_libvlc->p_playlist ) + if( !priv->p_playlist ) { msg_Err( p_libvlc, "playlist initialization failed" ); if( priv->p_memcpy_module != NULL ) @@ -749,7 +751,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, module_EndBank( p_libvlc ); return VLC_EGENERIC; } - p_playlist = p_libvlc->p_playlist; + p_playlist = priv->p_playlist; psz_modules = config_GetPsz( p_playlist, "services-discovery" ); if( psz_modules && *psz_modules ) @@ -804,7 +806,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( psz_temp ) { sprintf( psz_temp, "%s,none", psz_module ); - VLC_AddIntf( 0, psz_temp, false, false ); + libvlc_InternalAddIntf( p_libvlc, psz_temp, false ); free( psz_temp ); } } @@ -814,18 +816,18 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* * Always load the hotkeys interface if it exists */ - VLC_AddIntf( 0, "hotkeys,none", false, false ); + libvlc_InternalAddIntf( p_libvlc, "hotkeys,none", false ); #ifdef HAVE_DBUS_3 /* loads dbus control interface if in one-instance mode * we do it only when playlist exists, because dbus module needs it */ if( config_GetInt( p_libvlc, "one-instance" ) > 0 ) - VLC_AddIntf( 0, "dbus,none", false, false ); + libvlc_InternalAddIntf( p_libvlc, "dbus,none", false ); /* Prevents the power management daemon from suspending the system * when VLC is active */ if( config_GetInt( p_libvlc, "inhibit" ) > 0 ) - VLC_AddIntf( 0, "inhibit,none", false, false ); + libvlc_InternalAddIntf( p_libvlc, "inhibit,none", false ); #endif /* @@ -835,31 +837,39 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, #ifdef HAVE_X11_XLIB_H if( config_GetInt( p_libvlc, "disable-screensaver" ) ) { - VLC_AddIntf( 0, "screensaver,none", false, false ); + libvlc_InternalAddIntf( p_libvlc, "screensaver,none", false ); } #endif if( config_GetInt( p_libvlc, "file-logging" ) > 0 ) { - VLC_AddIntf( 0, "logger,none", false, false ); + libvlc_InternalAddIntf( p_libvlc, "logger,none", false ); } #ifdef HAVE_SYSLOG_H if( config_GetInt( p_libvlc, "syslog" ) > 0 ) { - const char *psz_logmode = "logmode=syslog"; - libvlc_InternalAddIntf( p_libvlc, "logger,none", false, false, - 1, &psz_logmode ); + char *logmode = var_CreateGetString( p_libvlc, "logmode" ); + var_SetString( p_libvlc, "logmode", "syslog" ); + libvlc_InternalAddIntf( p_libvlc, "logger,none", false ); + + if( logmode ) + { + var_SetString( p_libvlc, "logmode", logmode ); + free( logmode ); + } + else + var_Destroy( p_libvlc, "logmode" ); } #endif if( config_GetInt( p_libvlc, "show-intf" ) > 0 ) { - VLC_AddIntf( 0, "showintf,none", false, false ); + libvlc_InternalAddIntf( p_libvlc, "showintf,none", false ); } if( config_GetInt( p_libvlc, "network-synchronisation") > 0 ) { - VLC_AddIntf( 0, "netsync,none", false, false ); + libvlc_InternalAddIntf( p_libvlc, "netsync,none", false ); } #ifdef WIN32 @@ -926,7 +936,6 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) { intf_thread_t * p_intf = NULL; vout_thread_t * p_vout = NULL; - aout_instance_t * p_aout = NULL; libvlc_priv_t *priv = libvlc_priv (p_libvlc); /* Ask the interfaces to stop and destroy them */ @@ -935,15 +944,10 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) { intf_StopThread( p_intf ); vlc_object_detach( p_intf ); - vlc_object_release( p_intf ); - intf_Destroy( p_intf ); - p_intf = NULL; + vlc_object_release( p_intf ); /* for intf_Create() */ + vlc_object_release( p_intf ); /* for vlc_object_find() */ } - /* Free playlist */ - msg_Dbg( p_libvlc, "removing playlist" ); - playlist_ThreadDestroy( p_libvlc->p_playlist ); - /* Free video outputs */ msg_Dbg( p_libvlc, "removing all video outputs" ); while( (p_vout = vlc_object_find( p_libvlc, VLC_OBJECT_VOUT, FIND_CHILD )) ) @@ -953,25 +957,23 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) vout_Destroy( p_vout ); } - /* Free audio outputs */ - msg_Dbg( p_libvlc, "removing all audio outputs" ); - while( (p_aout = vlc_object_find( p_libvlc, VLC_OBJECT_AOUT, FIND_CHILD )) ) - { - vlc_object_detach( (vlc_object_t *)p_aout ); - vlc_object_release( (vlc_object_t *)p_aout ); - aout_Delete( p_aout ); - } - #ifdef ENABLE_SOUT + playlist_t * p_playlist; sout_instance_t * p_sout; - p_sout = vlc_object_find( p_libvlc, VLC_OBJECT_SOUT, FIND_CHILD ); - if( p_sout ) + p_playlist = vlc_object_find( p_libvlc, VLC_OBJECT_PLAYLIST, FIND_CHILD ); + if( p_playlist ) { - msg_Dbg( p_sout, "removing kept stream output" ); - vlc_object_detach( (vlc_object_t*)p_sout ); - vlc_object_release( (vlc_object_t*)p_sout ); - sout_DeleteInstance( p_sout ); + p_sout = vlc_object_find( p_playlist, VLC_OBJECT_SOUT, FIND_CHILD ); + if( p_sout ) + { + msg_Dbg( p_sout, "removing kept stream output" ); + vlc_object_detach( (vlc_object_t*)p_sout ); + vlc_object_release( (vlc_object_t*)p_sout ); + sout_DeleteInstance( p_sout ); + } + + vlc_object_release( p_playlist ); } /* Destroy VLM if created in libvlc_InternalInit */ @@ -981,6 +983,10 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) } #endif + /* Free playlist */ + msg_Dbg( p_libvlc, "removing playlist" ); + vlc_object_release( priv->p_playlist ); + /* Free interaction */ msg_Dbg( p_libvlc, "removing interaction" ); vlc_object_release( priv->p_interaction ); @@ -1036,7 +1042,7 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, bool b_release ) #ifndef WIN32 char* psz_pidfile = NULL; - if( config_GetInt( p_libvlc, "daemon" ) > 0 ) + if( b_daemon ) { psz_pidfile = config_GetPsz( p_libvlc, "pidfile" ); if( psz_pidfile != NULL ) @@ -1061,10 +1067,6 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, bool b_release ) /* Free module bank. It is refcounted, so we call this each time */ module_EndBank( p_libvlc ); - FREENULL( p_libvlc->psz_homedir ); - FREENULL( p_libvlc->psz_configdir ); - FREENULL( p_libvlc->psz_datadir ); - FREENULL( p_libvlc->psz_cachedir ); FREENULL( priv->psz_configfile ); var_DelCallback( p_libvlc, "key-pressed", vlc_key_to_action, p_libvlc->p_hotkeys ); @@ -1102,10 +1104,8 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, bool b_release ) /** * Add an interface plugin and run it */ -int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, - char const *psz_module, - bool b_block, bool b_play, - int i_options, const char *const *ppsz_options ) +int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module, + bool b_play ) { int i_err; intf_thread_t *p_intf = NULL; @@ -1117,24 +1117,21 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, { char *psz_interface = config_GetPsz( p_libvlc, "intf" ); if( !psz_interface || !*psz_interface ) /* "intf" has not been set */ - msg_Info( p_libvlc, _("Running vlc with the default interface. Use 'cvlc' to use vlc without interface.") ); - free( psz_interface ); - } - + { #ifndef WIN32 - if( b_daemon && b_block && !psz_module ) - { - /* Daemon mode hack. - * We prefer the dummy interface if none is specified. */ - char *psz_interface = config_GetPsz( p_libvlc, "intf" ); - if( !psz_interface || !*psz_interface ) psz_module = "dummy"; + if( b_daemon ) + /* Daemon mode hack. + * We prefer the dummy interface if none is specified. */ + psz_module = "dummy"; + else +#endif + msg_Info( p_libvlc, _("Running vlc with the default interface. Use 'cvlc' to use vlc without interface.") ); + } free( psz_interface ); } -#endif /* Try to create the interface */ - p_intf = intf_Create( p_libvlc, psz_module ? psz_module : "$intf", - i_options, ppsz_options ); + p_intf = intf_Create( p_libvlc, psz_module ? psz_module : "$intf" ); if( p_intf == NULL ) { msg_Err( p_libvlc, "interface \"%s\" initialization failed", @@ -1144,31 +1141,18 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, /* Interface doesn't handle play on start so do it ourselves */ if( !p_intf->b_play && b_play ) - playlist_Play( p_libvlc->p_playlist ); + playlist_Play( libvlc_priv(p_libvlc)->p_playlist ); /* Try to run the interface */ p_intf->b_play = b_play; i_err = intf_RunThread( p_intf ); - if( i_err || p_intf->b_should_run_on_first_thread ) + if( i_err ) { vlc_object_detach( p_intf ); - intf_Destroy( p_intf ); - p_intf = NULL; + vlc_object_release( p_intf ); return i_err; } - if( b_block ) - { - /* FIXME: should be moved to interface/interface.c */ - if( p_intf->pf_run ) - vlc_thread_join( p_intf ); - else - while( vlc_object_lock_and_wait( p_intf ) == 0 ); - - vlc_object_detach( p_intf ); - intf_Destroy( p_intf ); - } - return VLC_SUCCESS; }; @@ -1997,6 +1981,7 @@ static void InitDeviceValues( libvlc_int_t *p_vlc ) p_connection = dbus_bus_get ( DBUS_BUS_SYSTEM, &error ); if( dbus_error_is_set( &error ) || !p_connection ) { + libhal_ctx_free( ctx ); dbus_error_free( &error ); return; }