X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Flibvlc.c;h=75041c14d76d875a6f29734467fe7009543b6b8d;hb=f222f159c3fb5f256fb878aa900236945c41391c;hp=4ae289ff390045d7afee87b82cd96d97e01fb05d;hpb=edfdafc7f05c78d5995ff32cb9aae71074d119a9;p=vlc diff --git a/src/libvlc.c b/src/libvlc.c index 4ae289ff39..75041c14d7 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -42,7 +42,6 @@ #include "modules/modules.h" #include "config/configuration.h" -#include "interface/interface.h" #include /* ENOMEM */ #include /* sprintf() */ @@ -258,7 +257,7 @@ libvlc_int_t * libvlc_InternalCreate( void ) priv = libvlc_priv (p_libvlc); priv->p_playlist = NULL; - priv->p_interaction = NULL; + priv->p_dialog_provider = NULL; priv->p_vlm = NULL; p_libvlc->psz_object_name = strdup( "libvlc" ); @@ -329,7 +328,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; } @@ -429,7 +428,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( b_exit ) { free( priv->psz_configfile ); - module_EndBank( p_libvlc ); + module_EndBank( p_libvlc, false ); return i_ret; } @@ -443,6 +442,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" ); @@ -454,11 +454,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 @@ -470,7 +471,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,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( b_exit ) { free( priv->psz_configfile ); - module_EndBank( p_libvlc ); + module_EndBank( p_libvlc, true ); return i_ret; } @@ -568,9 +568,10 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, PauseConsole(); #endif free( priv->psz_configfile ); - module_EndBank( p_libvlc ); + module_EndBank( p_libvlc, true ); return VLC_EGENERIC; } + priv->i_verbose = config_GetInt( p_libvlc, "verbose" ); /* * System specific configuration @@ -718,7 +719,7 @@ 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; @@ -727,7 +728,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, free( psz_verbose_objects ); } - /* Last change to set the verbosity. Once we start interfaces and other + /* 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 ) @@ -789,16 +790,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, priv->i_timers = 0; priv->pp_timers = NULL; - /* Init stats */ - p_libvlc->p_stats = (global_stats_t *)malloc( sizeof( global_stats_t ) ); - if( !p_libvlc->p_stats ) - { - vlc_object_release( p_libvlc ); - return VLC_ENOMEM; /* FIXME: leaks */ - } - vlc_mutex_init( &p_libvlc->p_stats->lock ); - priv->p_stats_computer = NULL; - priv->i_last_input_id = 0; /* Not very safe, should be removed */ /* @@ -806,14 +797,25 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, */ var_Create( p_libvlc, "key-pressed", VLC_VAR_INTEGER ); var_Create( p_libvlc, "key-action", VLC_VAR_INTEGER ); - p_libvlc->p_hotkeys = malloc( libvlc_hotkeys_size ); - /* Do a copy (we don't need to modify the strings) */ - memcpy( p_libvlc->p_hotkeys, libvlc_hotkeys, libvlc_hotkeys_size ); - var_AddCallback( p_libvlc, "key-pressed", vlc_key_to_action, - p_libvlc->p_hotkeys ); + { + struct hotkey *p_keys = + malloc( (libvlc_actions_count + 1) * sizeof (*p_keys) ); - /* Initialize interaction */ - priv->p_interaction = interaction_Init( p_libvlc ); + /* Initialize from configuration */ + for( size_t i = 0; i < libvlc_actions_count; i++ ) + { + p_keys[i].psz_action = libvlc_actions[i].name; + p_keys[i].i_key = config_GetInt( p_libvlc, + libvlc_actions[i].name ); + p_keys[i].i_action = libvlc_actions[i].value; + } + p_keys[libvlc_actions_count].psz_action = NULL; + p_keys[libvlc_actions_count].i_key = 0; + p_keys[libvlc_actions_count].i_action = 0; + p_libvlc->p_hotkeys = p_keys; + var_AddCallback( p_libvlc, "key-pressed", vlc_key_to_action, + p_keys ); + } /* Initialize playlist and get commandline files */ p_playlist = playlist_Create( VLC_OBJECT(p_libvlc) ); @@ -824,7 +826,7 @@ 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; } @@ -982,9 +984,9 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, */ 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-agl", VLC_VAR_INTEGER ); + var_Create( p_libvlc, "drawable-gl", VLC_VAR_INTEGER ); + 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 ); @@ -1070,16 +1072,10 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) vlc_object_release( p_playlist ); - /* Free interaction */ - msg_Dbg( p_libvlc, "removing interaction" ); - interaction_Destroy( priv->p_interaction ); - stats_TimersDumpAll( p_libvlc ); stats_TimersCleanAll( p_libvlc ); msg_Dbg( p_libvlc, "removing stats" ); - vlc_mutex_destroy( &p_libvlc->p_stats->lock ); - FREENULL( p_libvlc->p_stats ); #ifndef WIN32 char* psz_pidfile = NULL; @@ -1107,12 +1103,12 @@ 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, - p_libvlc->p_hotkeys ); - FREENULL( p_libvlc->p_hotkeys ); + (void *)p_libvlc->p_hotkeys ); + free( (void *)p_libvlc->p_hotkeys ); } /** @@ -1143,6 +1139,13 @@ void libvlc_InternalDestroy( libvlc_int_t *p_libvlc ) vlc_mutex_destroy( &priv->config_lock ); vlc_mutex_destroy( &priv->timer_lock ); +#ifndef NDEBUG /* Hack to dump leaked objects tree */ + if( vlc_internals( p_libvlc )->i_refcount > 1 ) + while( vlc_internals( p_libvlc )->i_refcount > 0 ) + vlc_object_release( p_libvlc ); +#endif + + assert( vlc_internals( p_libvlc )->i_refcount == 1 ); vlc_object_release( p_libvlc ); } @@ -1169,7 +1172,9 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module ) psz_module = "dummy"; else #endif - msg_Info( p_libvlc, _("Running vlc with the default interface. Use 'cvlc' to use vlc without interface.") ); + msg_Info( p_libvlc, "%s", + _("Running vlc with the default interface. " + "Use 'cvlc' to use vlc without interface.") ); } free( psz_interface ); } @@ -1195,6 +1200,8 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module ) return VLC_SUCCESS; }; +static vlc_mutex_t exit_lock = VLC_STATIC_MUTEX; + /** * Waits until the LibVLC instance gets an exit signal. Normally, this happens * when the user "exits" an interface plugin. @@ -1202,12 +1209,11 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module ) 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 ); + vlc_mutex_lock( &exit_lock ); while( vlc_object_alive( p_libvlc ) ) - vlc_cond_wait( &priv->exiting, &internals->lock ); - vlc_object_unlock( p_libvlc ); + vlc_cond_wait( &priv->exiting, &exit_lock ); + vlc_mutex_unlock( &exit_lock ); } /** @@ -1218,8 +1224,10 @@ void libvlc_Quit( libvlc_int_t *p_libvlc ) { libvlc_priv_t *priv = libvlc_priv( p_libvlc ); + vlc_mutex_lock( &exit_lock ); vlc_object_kill( p_libvlc ); - vlc_cond_signal( &priv->exiting ); /* OK, kill took care of the lock */ + vlc_cond_signal( &priv->exiting ); + vlc_mutex_unlock( &exit_lock ); } #if defined( ENABLE_NLS ) && (defined (__APPLE__) || defined (WIN32)) && \ @@ -1982,10 +1990,7 @@ 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 ); + utf8_fprintf( stdout, "%s", LICENSE_MSG ); #ifdef WIN32 /* Pause the console because it's destroyed when we exit */ PauseConsole(); @@ -2141,3 +2146,15 @@ static void InitDeviceValues( libvlc_int_t *p_vlc ) (void)p_vlc; #endif /* HAVE_HAL */ } + +#include + +void vlc_avcodec_mutex (bool acquire) +{ + static vlc_mutex_t lock = VLC_STATIC_MUTEX; + + if (acquire) + vlc_mutex_lock (&lock); + else + vlc_mutex_unlock (&lock); +}