X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Flibvlc.c;h=fb7aa5257967965797b680513ca7e971eec2b113;hb=52422885b771f6e2893a1545970e0896476caef8;hp=8ae8005ca9feb45b001bf0a32fdc231b9224729b;hpb=6858023f094eb63c54607ad27b8f3e8a36a1e26d;p=vlc diff --git a/src/libvlc.c b/src/libvlc.c index 8ae8005ca9..fb7aa52579 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -222,9 +222,6 @@ static void PauseConsole ( void ); #endif static int ConsoleWidth ( void ); -static int VerboseCallback( vlc_object_t *, char const *, - vlc_value_t, vlc_value_t, void * ); - static void InitDeviceValues( libvlc_int_t * ); static vlc_mutex_t global_lock = VLC_STATIC_MUTEX; @@ -283,6 +280,7 @@ libvlc_int_t * libvlc_InternalCreate( void ) /* Initialize mutexes */ vlc_mutex_init( &priv->timer_lock ); vlc_mutex_init( &priv->config_lock ); + vlc_cond_init( &priv->exiting ); return p_libvlc; } @@ -331,7 +329,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( config_LoadCmdLine( p_libvlc, &i_argc, ppsz_argv, true ) ) { - module_EndBank( p_libvlc ); + module_EndBank( p_libvlc, false ); return VLC_EGENERIC; } @@ -430,7 +428,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( b_exit ) { - module_EndBank( p_libvlc ); + free( priv->psz_configfile ); + module_EndBank( p_libvlc, false ); return i_ret; } @@ -444,6 +443,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( !config_GetInt( p_libvlc, "ignore-config" ) ) config_LoadConfigFile( p_libvlc, "main" ); config_LoadCmdLine( p_libvlc, &i_argc, ppsz_argv, true ); + priv->i_verbose = config_GetInt( p_libvlc, "verbose" ); /* Check if the user specified a custom language */ psz_language = config_GetPsz( p_libvlc, "language" ); @@ -455,11 +455,12 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* Translate "C" to the language code: "fr", "en_GB", "nl", "ru"... */ msg_Dbg( p_libvlc, "translation test: code is \"%s\"", _("C") ); - module_EndBank( p_libvlc ); + module_EndBank( p_libvlc, false ); module_InitBank( p_libvlc ); if( !config_GetInt( p_libvlc, "ignore-config" ) ) config_LoadConfigFile( p_libvlc, "main" ); config_LoadCmdLine( p_libvlc, &i_argc, ppsz_argv, true ); + priv->i_verbose = config_GetInt( p_libvlc, "verbose" ); } free( psz_language ); # endif @@ -471,7 +472,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, * list of configuration options exported by each module and loads their * default values. */ - module_LoadBuiltins( p_libvlc ); module_LoadPlugins( p_libvlc, b_cache_delete ); if( p_libvlc->b_die ) { @@ -540,7 +540,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( b_exit ) { - module_EndBank( p_libvlc ); + free( priv->psz_configfile ); + module_EndBank( p_libvlc, true ); return i_ret; } @@ -567,9 +568,11 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, "that they are valid.\n" ); PauseConsole(); #endif - module_EndBank( p_libvlc ); + free( priv->psz_configfile ); + module_EndBank( p_libvlc, true ); return VLC_EGENERIC; } + priv->i_verbose = config_GetInt( p_libvlc, "verbose" ); /* * System specific configuration @@ -717,22 +720,23 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, msg_Err( p_libvlc, "verbose-objects usage: \n" "--verbose-objects=+printthatobject," "-dontprintthatone\n" - "(keyword 'all' to applies to all objects)\n"); + "(keyword 'all' to applies to all objects)"); free( psz_verbose_objects ); + /* FIXME: leaks!!!! */ return VLC_EGENERIC; } } free( psz_verbose_objects ); } + /* Last chance to set the verbosity. Once we start interfaces and other + * threads, verbosity becomes read-only. */ var_Create( p_libvlc, "verbose", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); if( config_GetInt( p_libvlc, "quiet" ) > 0 ) { - val.i_int = -1; - var_Set( p_libvlc, "verbose", val ); + var_SetInteger( p_libvlc, "verbose", -1 ); + priv->i_verbose = -1; } - var_AddCallback( p_libvlc, "verbose", VerboseCallback, NULL ); - var_TriggerCallback( p_libvlc, "verbose" ); if( priv->b_color ) priv->b_color = config_GetInt( p_libvlc, "color" ) > 0; @@ -792,7 +796,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( !p_libvlc->p_stats ) { vlc_object_release( p_libvlc ); - return VLC_ENOMEM; + return VLC_ENOMEM; /* FIXME: leaks */ } vlc_mutex_init( &p_libvlc->p_stats->lock ); priv->p_stats_computer = NULL; @@ -822,7 +826,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, { module_unneed( p_libvlc, priv->p_memcpy_module ); } - module_EndBank( p_libvlc ); + module_EndBank( p_libvlc, true ); + free( priv->psz_configfile ); return VLC_EGENERIC; } playlist_Activate( p_playlist ); @@ -858,9 +863,12 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( psz_modules && *psz_modules && psz_control && *psz_control ) { - psz_modules = (char *)realloc( psz_modules, strlen( psz_modules ) + - strlen( psz_control ) + 1 ); - sprintf( psz_modules, "%s:%s", psz_modules, psz_control ); + char* psz_tmp; + if( asprintf( &psz_tmp, "%s:%s", psz_modules, psz_control ) != -1 ) + { + free( psz_modules ); + psz_modules = psz_tmp; + } } else if( psz_control && *psz_control ) { @@ -892,9 +900,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, * Always load the hotkeys interface if it exists */ libvlc_InternalAddIntf( p_libvlc, "hotkeys,none" ); -#ifdef WIN32 - libvlc_InternalAddIntf( p_libvlc, "globalhotkeys,none" ); -#endif + if( module_exists( "globalhotkeys" ) ) + libvlc_InternalAddIntf( p_libvlc, "globalhotkeys,none" ); #ifdef HAVE_DBUS /* loads dbus control interface if in one-instance mode @@ -975,7 +982,11 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* * FIXME: kludge to use a p_libvlc-local variable for the Mozilla plugin */ + var_Create( p_libvlc, "drawable-xid", VLC_VAR_INTEGER ); + var_Create( p_libvlc, "drawable-hwnd", VLC_VAR_ADDRESS ); +#ifdef __APPLE__ var_Create( p_libvlc, "drawable", VLC_VAR_INTEGER ); +#endif var_Create( p_libvlc, "drawable-view-top", VLC_VAR_INTEGER ); var_Create( p_libvlc, "drawable-view-left", VLC_VAR_INTEGER ); var_Create( p_libvlc, "drawable-view-bottom", VLC_VAR_INTEGER ); @@ -1008,7 +1019,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, { playlist_t *p_playlist = pl_Hold( p_libvlc ); playlist_AddExt( p_playlist, val.psz_string, NULL, PLAYLIST_INSERT, 0, - -1, NULL, 0, true, pl_Unlocked ); + -1, 0, NULL, 0, true, pl_Unlocked ); pl_Release( p_libvlc ); } free( val.psz_string ); @@ -1098,7 +1109,7 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) } /* Free module bank. It is refcounted, so we call this each time */ - module_EndBank( p_libvlc ); + module_EndBank( p_libvlc, true ); FREENULL( priv->psz_configfile ); var_DelCallback( p_libvlc, "key-pressed", vlc_key_to_action, @@ -1130,6 +1141,7 @@ void libvlc_InternalDestroy( libvlc_int_t *p_libvlc ) msg_Destroy( p_libvlc ); /* Destroy mutexes */ + vlc_cond_destroy( &priv->exiting ); vlc_mutex_destroy( &priv->config_lock ); vlc_mutex_destroy( &priv->timer_lock ); @@ -1185,6 +1197,33 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module ) return VLC_SUCCESS; }; +/** + * Waits until the LibVLC instance gets an exit signal. Normally, this happens + * when the user "exits" an interface plugin. + */ +void libvlc_InternalWait( libvlc_int_t *p_libvlc ) +{ + libvlc_priv_t *priv = libvlc_priv( p_libvlc ); + vlc_object_internals_t *internals = vlc_internals( p_libvlc ); + + vlc_object_lock( p_libvlc ); + while( vlc_object_alive( p_libvlc ) ) + vlc_cond_wait( &priv->exiting, &internals->lock ); + vlc_object_unlock( p_libvlc ); +} + +/** + * Posts an exit signal to LibVLC instance. This will normally initiate the + * cleanup and destroy process. It should only be called on behalf of the user. + */ +void libvlc_Quit( libvlc_int_t *p_libvlc ) +{ + libvlc_priv_t *priv = libvlc_priv( p_libvlc ); + + vlc_object_kill( p_libvlc ); + vlc_cond_signal( &priv->exiting ); /* OK, kill took care of the lock */ +} + #if defined( ENABLE_NLS ) && (defined (__APPLE__) || defined (WIN32)) && \ ( defined( HAVE_GETTEXT ) || defined( HAVE_INCLUDED_GETTEXT ) ) /***************************************************************************** @@ -1288,8 +1327,9 @@ static int GetFilenames( libvlc_int_t *p_vlc, int i_argc, const char *ppsz_argv[ playlist_t *p_playlist = pl_Hold( p_vlc ); playlist_AddExt( p_playlist, ppsz_argv[i_opt], NULL, PLAYLIST_INSERT, - 0, -1, ( i_options ? &ppsz_argv[i_opt + 1] : NULL ), - i_options, true, pl_Unlocked ); + 0, -1, + i_options, ( i_options ? &ppsz_argv[i_opt + 1] : NULL ), VLC_INPUT_OPTION_TRUSTED, + true, pl_Unlocked ); pl_Release( p_vlc ); } @@ -1944,9 +1984,6 @@ static void Version( void ) utf8_fprintf( stdout, _("Compiled by %s@%s.%s\n"), VLC_CompileBy(), VLC_CompileHost(), VLC_CompileDomain() ); utf8_fprintf( stdout, _("Compiler: %s\n"), VLC_Compiler() ); - if( strcmp( VLC_Changeset(), "exported" ) ) - utf8_fprintf( stdout, _("Based upon Git commit [%s]\n"), - VLC_Changeset() ); utf8_fprintf( stdout, LICENSE_MSG ); #ifdef WIN32 /* Pause the console because it's destroyed when we exit */ @@ -2037,21 +2074,6 @@ static int ConsoleWidth( void ) return i_width; } -static int VerboseCallback( vlc_object_t *p_this, const char *psz_variable, - vlc_value_t old_val, vlc_value_t new_val, void *param) -{ - libvlc_int_t *p_libvlc = (libvlc_int_t *)p_this; - (void)psz_variable; - (void)old_val; - (void)param; - - if( new_val.i_int >= -1 ) - { - libvlc_priv (p_libvlc)->i_verbose = __MIN( new_val.i_int, 2 ); - } - return VLC_SUCCESS; -} - /***************************************************************************** * InitDeviceValues: initialize device values *****************************************************************************