X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Flibvlc-common.c;h=2efc6c80d83e7c943c3ee5c77e00ec4658b2c923;hb=a2ad5ed16ce41045897dd3be5b7322ef9dd8856b;hp=89a5cde7efbcfd7a7a109da8721a3bdf63183840;hpb=b89d540af12211361bfaa82a200872b3ba4f0eb0;p=vlc diff --git a/src/libvlc-common.c b/src/libvlc-common.c index 89a5cde7ef..2efc6c80d8 100644 --- a/src/libvlc-common.c +++ b/src/libvlc-common.c @@ -99,7 +99,7 @@ * 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; @@ -146,7 +146,8 @@ libvlc_int_t * vlc_current_object( int i_object ) */ libvlc_int_t * libvlc_InternalCreate( void ) { - libvlc_int_t * p_libvlc = NULL; + libvlc_int_t *p_libvlc; + libvlc_priv_t *priv; char *psz_env = NULL; /* vlc_threads_init *must* be the first internal call! No other call is @@ -158,30 +159,29 @@ libvlc_int_t * libvlc_InternalCreate( void ) /* Now that the thread system is initialized, we don't have much, but * at least we have variables */ vlc_mutex_t *lock = var_AcquireMutex( "libvlc" ); - - i_instances++; - - if( !p_libvlc_global->b_ready ) + if( i_instances == 0 ) { /* Guess what CPU we have */ cpu_flags = CPUCapabilities(); /* The module bank will be initialized later */ p_libvlc_global->p_module_bank = NULL; - - p_libvlc_global->b_ready = true; } - vlc_mutex_unlock( lock ); /* Allocate a libvlc instance object */ - p_libvlc = vlc_object_create( p_libvlc_global, VLC_OBJECT_LIBVLC ); + p_libvlc = vlc_custom_create( VLC_OBJECT(p_libvlc_global), + sizeof (*p_libvlc) + sizeof (libvlc_priv_t), + VLC_OBJECT_LIBVLC, "libvlc" ); + if( p_libvlc != NULL ) + i_instances++; + vlc_mutex_unlock( lock ); + if( p_libvlc == NULL ) - { - i_instances--; return NULL; - } - p_libvlc->p_playlist = NULL; - p_libvlc->p_interaction = NULL; - p_libvlc->p_vlm = NULL; + + priv = libvlc_priv (p_libvlc); + priv->p_playlist = NULL; + priv->p_interaction = NULL; + priv->p_vlm = NULL; p_libvlc->psz_object_name = strdup( "libvlc" ); /* Initialize message queue */ @@ -190,13 +190,13 @@ libvlc_int_t * libvlc_InternalCreate( void ) /* Find verbosity from VLC_VERBOSE environment variable */ psz_env = getenv( "VLC_VERBOSE" ); if( psz_env != NULL ) - p_libvlc->i_verbose = atoi( psz_env ); + priv->i_verbose = atoi( psz_env ); else - p_libvlc->i_verbose = 3; + priv->i_verbose = 3; #if defined( HAVE_ISATTY ) && !defined( WIN32 ) - p_libvlc->b_color = isatty( 2 ); /* 2 is for stderr */ + priv->b_color = isatty( 2 ); /* 2 is for stderr */ #else - p_libvlc->b_color = false; + priv->b_color = false; #endif /* Announce who we are - Do it only for first instance ? */ @@ -204,8 +204,8 @@ libvlc_int_t * libvlc_InternalCreate( void ) msg_Dbg( p_libvlc, "libvlc was configured with %s", CONFIGURE_LINE ); /* Initialize mutexes */ - vlc_mutex_init( p_libvlc, &p_libvlc->timer_lock ); - vlc_mutex_init( p_libvlc, &p_libvlc->config_lock ); + 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 @@ -227,6 +227,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, const char *ppsz_argv[] ) { libvlc_global_data_t *p_libvlc_global = vlc_global(); + libvlc_priv_t *priv = libvlc_priv (p_libvlc); char p_capabilities[200]; char * p_tmp = NULL; char * psz_modules = NULL; @@ -247,20 +248,15 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, system_Init( p_libvlc, &i_argc, ppsz_argv ); /* Get the executable name (similar to the basename command) */ - if( i_argc > 0 ) - { - const char *exe = strdup( ppsz_argv[0] ); - const char *tmp = exe; - while( *exe ) - { - if( *exe++ == '/' ) - tmp = exe; - } - p_libvlc->psz_object_name = strdup( tmp ); - } - else + if( i_argc > 0 && ppsz_argv[0][0] ) { - p_libvlc->psz_object_name = strdup( "vlc" ); + free( p_libvlc->psz_object_name ); + + const char *psz_exe = strrchr( ppsz_argv[0], '/' ); + if( psz_exe && *(psz_exe + 1) ) + p_libvlc->psz_object_name = strdup( psz_exe + 1 ); + else + p_libvlc->psz_object_name = strdup( ppsz_argv[0] ); } /* @@ -300,10 +296,7 @@ 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 ); - p_libvlc->psz_datadir = config_GetUserDataDir( p_libvlc ); - p_libvlc->psz_cachedir = config_GetCacheDir( p_libvlc ); - p_libvlc->psz_configfile = config_GetCustomConfigFile( p_libvlc ); + priv->psz_configfile = config_GetCustomConfigFile( p_libvlc ); /* Check for plugins cache options */ if( config_GetInt( p_libvlc, "reset-plugins-cache" ) > 0 ) @@ -312,11 +305,11 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, } /* Will be re-done properly later on */ - p_libvlc->i_verbose = config_GetInt( p_libvlc, "verbose" ); + priv->i_verbose = config_GetInt( p_libvlc, "verbose" ); /* 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; @@ -433,7 +426,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" )) ) @@ -655,8 +648,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, var_AddCallback( p_libvlc, "verbose", VerboseCallback, NULL ); var_Change( p_libvlc, "verbose", VLC_VAR_TRIGGER_CALLBACKS, NULL, NULL ); - if( p_libvlc->b_color ) - p_libvlc->b_color = config_GetInt( p_libvlc, "color" ) > 0; + if( priv->b_color ) + priv->b_color = config_GetInt( p_libvlc, "color" ) > 0; /* * Output messages that may still be in the queue @@ -707,11 +700,11 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* * Choose the best memcpy module */ - p_libvlc->p_memcpy_module = module_Need( p_libvlc, "memcpy", "$memcpy", 0 ); + priv->p_memcpy_module = module_Need( p_libvlc, "memcpy", "$memcpy", 0 ); - p_libvlc->b_stats = config_GetInt( p_libvlc, "stats" ) > 0; - p_libvlc->i_timers = 0; - p_libvlc->pp_timers = NULL; + priv->b_stats = config_GetInt( p_libvlc, "stats" ) > 0; + priv->i_timers = 0; + priv->pp_timers = NULL; /* Init stats */ p_libvlc->p_stats = (global_stats_t *)malloc( sizeof( global_stats_t ) ); @@ -720,12 +713,12 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, vlc_object_release( p_libvlc ); return VLC_ENOMEM; } - vlc_mutex_init( p_libvlc, &p_libvlc->p_stats->lock ); - p_libvlc->p_stats_computer = NULL; + vlc_mutex_init( &p_libvlc->p_stats->lock ); + priv->p_stats_computer = NULL; /* Init the array that holds every input item */ - ARRAY_INIT( p_libvlc->input_items ); - p_libvlc->i_last_input_id = 0; + ARRAY_INIT( priv->input_items ); + priv->i_last_input_id = 0; /* * Initialize hotkey handling @@ -739,21 +732,21 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, p_libvlc->p_hotkeys ); /* Initialize interaction */ - p_libvlc->p_interaction = interaction_Init( p_libvlc ); + priv->p_interaction = interaction_Init( p_libvlc ); /* 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( p_libvlc->p_memcpy_module != NULL ) + if( priv->p_memcpy_module != NULL ) { - module_Unneed( p_libvlc, p_libvlc->p_memcpy_module ); + module_Unneed( p_libvlc, priv->p_memcpy_module ); } 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 ) @@ -768,8 +761,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, psz_parser = config_GetPsz( p_libvlc, "vlm-conf" ); if( psz_parser && *psz_parser ) { - p_libvlc->p_vlm = vlm_New( p_libvlc ); - if( !p_libvlc->p_vlm ) + priv->p_vlm = vlm_New( p_libvlc ); + if( !priv->p_vlm ) msg_Err( p_libvlc, "VLM initialization failed" ); } free( psz_parser ); @@ -808,7 +801,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 ); } } @@ -818,18 +811,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 to suspend the computer + /* 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 /* @@ -839,13 +832,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 ) @@ -858,12 +851,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 @@ -931,6 +924,7 @@ 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 */ msg_Dbg( p_libvlc, "removing all interfaces" ); @@ -943,10 +937,6 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) p_intf = NULL; } - /* 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 )) ) @@ -966,27 +956,38 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) } #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 */ - if( p_libvlc->p_vlm ) + if( priv->p_vlm ) { - vlm_Delete( p_libvlc->p_vlm ); + vlm_Delete( priv->p_vlm ); } #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( p_libvlc->p_interaction ); + vlc_object_release( priv->p_interaction ); stats_TimersDumpAll( p_libvlc ); stats_TimersCleanAll( p_libvlc ); @@ -1006,13 +1007,13 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) #endif bool b_clean = true; - FOREACH_ARRAY( input_item_t *p_del, p_libvlc->input_items ) + FOREACH_ARRAY( input_item_t *p_del, priv->input_items ) msg_Err( p_libvlc, "input item %p has not been deleted properly: refcount %d, name %s", p_del, p_del->i_gc_refcount, p_del->psz_name ? p_del->psz_name : "(null)" ); b_clean = false; FOREACH_END(); assert( b_clean ); - ARRAY_RESET( p_libvlc->input_items ); + ARRAY_RESET( priv->input_items ); msg_Dbg( p_libvlc, "removing stats" ); vlc_mutex_destroy( &p_libvlc->p_stats->lock ); @@ -1034,10 +1035,12 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, bool b_release ) if( !p_libvlc ) return VLC_EGENERIC; + libvlc_priv_t *priv = libvlc_priv (p_libvlc); + #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 ) @@ -1053,20 +1056,17 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, bool b_release ) } #endif - if( p_libvlc->p_memcpy_module ) + if( priv->p_memcpy_module ) { - module_Unneed( p_libvlc, p_libvlc->p_memcpy_module ); - p_libvlc->p_memcpy_module = NULL; + module_Unneed( p_libvlc, priv->p_memcpy_module ); + priv->p_memcpy_module = NULL; } /* 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( p_libvlc->psz_configfile ); + FREENULL( priv->psz_configfile ); var_DelCallback( p_libvlc, "key-pressed", vlc_key_to_action, p_libvlc->p_hotkeys ); FREENULL( p_libvlc->p_hotkeys ); @@ -1085,8 +1085,8 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, bool b_release ) msg_Destroy( p_libvlc ); /* Destroy mutexes */ - vlc_mutex_destroy( &p_libvlc->config_lock ); - vlc_mutex_destroy( &p_libvlc->timer_lock ); + vlc_mutex_destroy( &priv->config_lock ); + vlc_mutex_destroy( &priv->timer_lock ); if( b_release ) vlc_object_release( p_libvlc ); vlc_object_release( p_libvlc ); @@ -1145,7 +1145,7 @@ 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; @@ -1215,7 +1215,7 @@ static inline int LoadMessages (void) #else char psz_path[1024]; if (snprintf (psz_path, sizeof (psz_path), "%s/%s", - p_libvlc_global->psz_vlcpath, "locale") + vlc_global()->psz_vlcpath, "locale") >= (int)sizeof (psz_path)) return -1; @@ -1969,7 +1969,7 @@ static int VerboseCallback( vlc_object_t *p_this, const char *psz_variable, if( new_val.i_int >= -1 ) { - p_libvlc->i_verbose = __MIN( new_val.i_int, 2 ); + libvlc_priv (p_libvlc)->i_verbose = __MIN( new_val.i_int, 2 ); } return VLC_SUCCESS; } @@ -1998,6 +1998,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; }