X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Flibvlc-common.c;h=8ebb5979d6dccf9cfd5e4c32d9983fc5bee267cb;hb=234a17d087d4b5648adb9051a847db31bbc47149;hp=aa16cdddc2d443c5b5ca6a52987dacf8655e1520;hpb=82921f3c8dae23178b64089b22502bb8f528e7e6;p=vlc diff --git a/src/libvlc-common.c b/src/libvlc-common.c index aa16cdddc2..8ebb5979d6 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; @@ -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,7 +301,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, } /* Set the config file stuff */ - p_libvlc->psz_homedir = config_GetHomeDir(); priv->psz_configfile = config_GetCustomConfigFile( p_libvlc ); /* Check for plugins cache options */ @@ -426,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" )) ) @@ -801,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, false, 0, NULL ); free( psz_temp ); } } @@ -811,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, false, 0, NULL ); #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, false, 0, NULL ); /* 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, false, 0, NULL ); #endif /* @@ -832,13 +837,13 @@ 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, false, 0, NULL ); } #endif if( config_GetInt( p_libvlc, "file-logging" ) > 0 ) { - VLC_AddIntf( 0, "logger,none", false, false ); + libvlc_InternalAddIntf( p_libvlc, "logger,none", false, false, 0, NULL ); } #ifdef HAVE_SYSLOG_H if( config_GetInt( p_libvlc, "syslog" ) > 0 ) @@ -851,12 +856,12 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( config_GetInt( p_libvlc, "show-intf" ) > 0 ) { - VLC_AddIntf( 0, "showintf,none", false, false ); + libvlc_InternalAddIntf( p_libvlc, "showintf,none", false, false, 0, NULL ); } if( config_GetInt( p_libvlc, "network-synchronisation") > 0 ) { - VLC_AddIntf( 0, "netsync,none", false, false ); + libvlc_InternalAddIntf( p_libvlc, "netsync,none", false, false, 0, NULL ); } #ifdef WIN32 @@ -923,7 +928,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 */ @@ -932,15 +936,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( priv->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 )) ) @@ -950,25 +949,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 */ @@ -978,6 +975,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 ); @@ -1058,7 +1059,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( priv->psz_configfile ); var_DelCallback( p_libvlc, "key-pressed", vlc_key_to_action, p_libvlc->p_hotkeys ); @@ -1111,20 +1111,18 @@ 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", @@ -1143,24 +1141,18 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, /* 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_thread_join( p_intf ); vlc_object_detach( p_intf ); - intf_Destroy( p_intf ); + vlc_object_release( p_intf ); } return VLC_SUCCESS; @@ -1991,6 +1983,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; }