X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Flibvlc.c;h=842aa7270b95c376e8dec51088184c9f8476348d;hb=10a6bde56813620846826fed6979b2548a6457ea;hp=90e2a791b204d7471ce73d8347e729235e76bdc6;hpb=a717f3bb306a96e04a1ef0993a4f379d307ffa49;p=vlc diff --git a/src/libvlc.c b/src/libvlc.c index 90e2a791b2..842aa7270b 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -67,7 +67,7 @@ # include #endif -#ifdef HAVE_DBUS_3 +#ifdef HAVE_DBUS /* used for one-instance mode */ # include #endif @@ -105,6 +105,41 @@ static unsigned i_instances = 0; static bool b_daemon = false; +/***************************************************************************** + * vlc_gc_*. + *****************************************************************************/ +void __vlc_gc_incref( gc_object_t * p_gc ) +{ + assert( p_gc->i_gc_refcount > 0 ); + + /* FIXME: atomic version needed! */ + p_gc->i_gc_refcount ++; +} + +void __vlc_gc_decref( gc_object_t *p_gc ) +{ + assert( p_gc ); + assert( p_gc->i_gc_refcount > 0 ); + + /* FIXME: atomic version needed! */ + p_gc->i_gc_refcount -- ; + + if( p_gc->i_gc_refcount == 0 ) + { + p_gc->pf_destructor( p_gc ); + /* Do not use the p_gc pointer from now on ! */ + } +} + +void +__vlc_gc_init( gc_object_t * p_gc, void (*pf_destructor)( gc_object_t * ), + void * arg) +{ + p_gc->i_gc_refcount = 1; + p_gc->pf_destructor = pf_destructor; + p_gc->p_destructor_arg = arg; +} + /***************************************************************************** * Local prototypes *****************************************************************************/ @@ -197,6 +232,10 @@ libvlc_int_t * libvlc_InternalCreate( void ) vlc_mutex_init( &priv->timer_lock ); vlc_mutex_init( &priv->config_lock ); + priv->threads_count = 0; + vlc_mutex_init (&priv->threads_lock); + vlc_cond_init (NULL, &priv->threads_wait); + /* Store data for the non-reentrant API */ p_static_vlc = p_libvlc; @@ -267,12 +306,6 @@ 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 ) { @@ -429,6 +462,15 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, b_exit = true; i_ret = VLC_EEXITSUCCESS; } + /* Check for full help option */ + else if( config_GetInt( p_libvlc, "full-help" ) > 0 ) + { + config_PutInt( p_libvlc, "advanced", 1); + config_PutInt( p_libvlc, "help-verbose", 1); + Help( p_libvlc, "full-help" ); + b_exit = true; + i_ret = VLC_EEXITSUCCESS; + } /* Check for long help option */ else if( config_GetInt( p_libvlc, "longhelp" ) > 0 ) { @@ -506,7 +548,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, system_Configure( p_libvlc, &i_argc, ppsz_argv ); /* FIXME: could be replaced by using Unix sockets */ -#ifdef HAVE_DBUS_3 +#ifdef HAVE_DBUS dbus_threads_init_default(); if( config_GetInt( p_libvlc, "one-instance" ) > 0 ) @@ -577,7 +619,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if ( !dbus_message_iter_append_basic( &dbus_args, DBUS_TYPE_STRING, &ppsz_argv[i_input] ) ) { - msg_Err( p_libvlc, "Out of memory" ); dbus_message_unref( p_dbus_msg ); system_End( p_libvlc ); exit( VLC_ENOMEM ); @@ -588,7 +629,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if ( !dbus_message_iter_append_basic( &dbus_args, DBUS_TYPE_BOOLEAN, &b_play ) ) { - msg_Err( p_libvlc, "Out of memory" ); dbus_message_unref( p_dbus_msg ); system_End( p_libvlc ); exit( VLC_ENOMEM ); @@ -749,7 +789,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, } free( psz_modules ); -#ifdef ENABLE_SOUT +#ifdef ENABLE_VLM /* Initialize VLM if vlm-conf is specified */ psz_parser = config_GetPsz( p_libvlc, "vlm-conf" ); if( psz_parser && *psz_parser ) @@ -794,7 +834,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( psz_temp ) { sprintf( psz_temp, "%s,none", psz_module ); - libvlc_InternalAddIntf( p_libvlc, psz_temp, false ); + libvlc_InternalAddIntf( p_libvlc, psz_temp ); free( psz_temp ); } } @@ -804,18 +844,18 @@ 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", false ); + libvlc_InternalAddIntf( p_libvlc, "hotkeys,none" ); -#ifdef HAVE_DBUS_3 +#ifdef HAVE_DBUS /* 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 ) - libvlc_InternalAddIntf( p_libvlc, "dbus,none", false ); + libvlc_InternalAddIntf( p_libvlc, "dbus,none" ); /* Prevents the power management daemon from suspending the system * when VLC is active */ if( config_GetInt( p_libvlc, "inhibit" ) > 0 ) - libvlc_InternalAddIntf( p_libvlc, "inhibit,none", false ); + libvlc_InternalAddIntf( p_libvlc, "inhibit,none" ); #endif /* @@ -825,20 +865,20 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, #ifdef HAVE_X11_XLIB_H if( config_GetInt( p_libvlc, "disable-screensaver" ) ) { - libvlc_InternalAddIntf( p_libvlc, "screensaver,none", false ); + libvlc_InternalAddIntf( p_libvlc, "screensaver,none" ); } #endif if( config_GetInt( p_libvlc, "file-logging" ) > 0 ) { - libvlc_InternalAddIntf( p_libvlc, "logger,none", false ); + libvlc_InternalAddIntf( p_libvlc, "logger,none" ); } #ifdef HAVE_SYSLOG_H if( config_GetInt( p_libvlc, "syslog" ) > 0 ) { char *logmode = var_CreateGetString( p_libvlc, "logmode" ); var_SetString( p_libvlc, "logmode", "syslog" ); - libvlc_InternalAddIntf( p_libvlc, "logger,none", false ); + libvlc_InternalAddIntf( p_libvlc, "logger,none" ); if( logmode ) { @@ -852,12 +892,12 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( config_GetInt( p_libvlc, "show-intf" ) > 0 ) { - libvlc_InternalAddIntf( p_libvlc, "showintf,none", false ); + libvlc_InternalAddIntf( p_libvlc, "showintf,none" ); } if( config_GetInt( p_libvlc, "network-synchronisation") > 0 ) { - libvlc_InternalAddIntf( p_libvlc, "netsync,none", false ); + libvlc_InternalAddIntf( p_libvlc, "netsync,none" ); } #ifdef WIN32 @@ -896,6 +936,12 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* Create volume callback system. */ var_Create( p_libvlc, "volume-change", VLC_VAR_BOOL ); + /* Create a variable for showing the interface (moved from playlist). */ + var_Create( p_libvlc, "intf-show", VLC_VAR_BOOL ); + var_SetBool( p_libvlc, "intf-show", true ); + + var_Create( p_libvlc, "intf-popupmenu", VLC_VAR_BOOL ); + /* * Get input filenames given as commandline arguments */ @@ -910,7 +956,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, { playlist_t *p_playlist = pl_Yield( p_libvlc ); playlist_AddExt( p_playlist, val.psz_string, NULL, PLAYLIST_INSERT, 0, - -1, NULL, 0, true, false ); + -1, NULL, 0, true, pl_Unlocked ); pl_Release( p_libvlc ); } free( val.psz_string ); @@ -925,7 +971,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) { intf_thread_t * p_intf = NULL; - vout_thread_t * p_vout = NULL; libvlc_priv_t *priv = libvlc_priv (p_libvlc); /* Ask the interfaces to stop and destroy them */ @@ -938,25 +983,7 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) vlc_object_release( p_intf ); /* for vlc_object_find() */ } -#ifdef ENABLE_SOUT - playlist_t * p_playlist; - sout_instance_t * p_sout; - - p_playlist = vlc_object_find( p_libvlc, VLC_OBJECT_PLAYLIST, FIND_CHILD ); - if( p_playlist ) - { - 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 ); - } - +#ifdef ENABLE_VLM /* Destroy VLM if created in libvlc_InternalInit */ if( priv->p_vlm ) { @@ -964,22 +991,29 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) } #endif + playlist_t *p_playlist = priv->p_playlist; + /* Remove all services discovery */ + msg_Dbg( p_libvlc, "removing all services discovery tasks" ); + playlist_ServicesDiscoveryKillAll( p_playlist ); + /* Free playlist */ + /* Any thread still running must not assume pl_Yield() succeeds. */ msg_Dbg( p_libvlc, "removing playlist" ); - vlc_object_release( priv->p_playlist ); + priv->p_playlist = NULL; + vlc_object_kill( p_playlist ); /* <-- memory barrier for pl_Yield() */ + vlc_thread_join( p_playlist ); + vlc_object_release( p_playlist ); /* Free interaction */ msg_Dbg( p_libvlc, "removing interaction" ); - vlc_object_release( priv->p_interaction ); + interaction_Destroy( priv->p_interaction ); /* Free video outputs */ msg_Dbg( p_libvlc, "removing all video outputs" ); - while( (p_vout = vlc_object_find( p_libvlc, VLC_OBJECT_VOUT, FIND_CHILD )) ) - { - vlc_object_detach( p_vout ); - vlc_object_release( p_vout ); - vout_Destroy( p_vout ); - } + vlc_list_t *list = vlc_list_find (p_libvlc, VLC_OBJECT_VOUT, FIND_CHILD); + for (int i = 0; i < list->i_count; i++) + vlc_object_release (list->p_values[i].p_object); + vlc_list_release (list); stats_TimersDumpAll( p_libvlc ); stats_TimersCleanAll( p_libvlc ); @@ -998,6 +1032,17 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) } #endif + /* Make sure all threads are completed before we start looking for + * reference leaks and deinitializing core LibVLC subsytems. */ + vlc_mutex_lock (&priv->threads_lock); + while (priv->threads_count) + { + msg_Dbg (p_libvlc, "waiting for %u remaining threads", + priv->threads_count); + vlc_cond_wait (&priv->threads_wait, &priv->threads_lock); + } + vlc_mutex_unlock (&priv->threads_lock); + bool b_clean = true; 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", @@ -1020,9 +1065,8 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) * termination, and destroys their structure. * It stops the thread systems: no instance can run after this has run * \param p_libvlc the instance to destroy - * \param b_release whether we should do a release on the instance */ -int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, bool b_release ) +int libvlc_InternalDestroy( libvlc_int_t *p_libvlc ) { if( !p_libvlc ) return VLC_EGENERIC; @@ -1078,8 +1122,9 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, bool b_release ) /* Destroy mutexes */ vlc_mutex_destroy( &priv->config_lock ); vlc_mutex_destroy( &priv->timer_lock ); + vlc_cond_destroy (&priv->threads_wait); + vlc_mutex_destroy (&priv->threads_lock); - if( b_release ) vlc_object_release( p_libvlc ); vlc_object_release( p_libvlc ); p_libvlc = NULL; @@ -1094,8 +1139,7 @@ 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_play ) +int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module ) { int i_err; intf_thread_t *p_intf = NULL; @@ -1129,12 +1173,7 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module, return VLC_EGENERIC; } - /* Interface doesn't handle play on start so do it ourselves */ - if( !p_intf->b_play && b_play ) - 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 ) { @@ -1167,10 +1206,7 @@ static void SetLanguage ( const char *psz_lang ) * the language at runtime under eg. Windows. Beware that this * makes the environment unconsistent when libvlc is unloaded and * should probably be moved to a safer place like vlc.c. */ - static char psz_lcall[20]; - snprintf( psz_lcall, 19, "LC_ALL=%s", psz_lang ); - psz_lcall[19] = '\0'; - putenv( psz_lcall ); + setenv( "LC_ALL", psz_lang, 1 ); #endif setlocale( LC_ALL, psz_lang ); @@ -1187,8 +1223,8 @@ static inline int LoadMessages (void) static const char psz_path[] = LOCALEDIR; #else char psz_path[1024]; - if (snprintf (psz_path, sizeof (psz_path), "%s/%s", - vlc_global()->psz_vlcpath, "locale") + if (snprintf (psz_path, sizeof (psz_path), "%s" DIR_SEP "%s", + config_GetDataDir(), "locale") >= (int)sizeof (psz_path)) return -1; @@ -1250,7 +1286,7 @@ static int GetFilenames( libvlc_int_t *p_vlc, int i_argc, const char *ppsz_argv[ playlist_t *p_playlist = pl_Yield( 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, false ); + i_options, true, pl_Unlocked ); pl_Release( p_vlc ); } @@ -1262,6 +1298,12 @@ static int GetFilenames( libvlc_int_t *p_vlc, int i_argc, const char *ppsz_argv[ ***************************************************************************** * Print a short inline help. Message interface is initialized at this stage. *****************************************************************************/ +static inline void print_help_on_full_help( void ) +{ + utf8_fprintf( stdout, "\n" ); + utf8_fprintf( stdout, "%s\n", _("To get exhaustive help, use '-H'.") ); +} + static void Help( libvlc_int_t *p_this, char const *psz_help_name ) { #ifdef WIN32 @@ -1273,8 +1315,15 @@ static void Help( libvlc_int_t *p_this, char const *psz_help_name ) utf8_fprintf( stdout, vlc_usage, p_this->psz_object_name ); Usage( p_this, "help" ); Usage( p_this, "main" ); + print_help_on_full_help(); } else if( psz_help_name && !strcmp( psz_help_name, "longhelp" ) ) + { + utf8_fprintf( stdout, vlc_usage, p_this->psz_object_name ); + Usage( p_this, NULL ); + print_help_on_full_help(); + } + else if( psz_help_name && !strcmp( psz_help_name, "full-help" ) ) { utf8_fprintf( stdout, vlc_usage, p_this->psz_object_name ); Usage( p_this, NULL ); @@ -1294,6 +1343,34 @@ static void Help( libvlc_int_t *p_this, char const *psz_help_name ) ***************************************************************************** * Print a short inline help. Message interface is initialized at this stage. *****************************************************************************/ +# define COL(x) "\033[" #x ";1m" +# define RED COL(31) +# define GREEN COL(32) +# define YELLOW COL(33) +# define BLUE COL(34) +# define MAGENTA COL(35) +# define CYAN COL(36) +# define WHITE COL(0) +# define GRAY "\033[0m" +static void print_help_section( module_config_t *p_item, bool b_color, bool b_description ) +{ + if( !p_item ) return; + if( b_color ) + { + utf8_fprintf( stdout, RED" %s:\n"GRAY, + p_item->psz_text ); + if( b_description && p_item->psz_longtext ) + utf8_fprintf( stdout, MAGENTA" %s\n"GRAY, + p_item->psz_longtext ); + } + else + { + utf8_fprintf( stdout, " %s:\n", p_item->psz_text ); + if( b_description && p_item->psz_longtext ) + utf8_fprintf( stdout, " %s\n", p_item->psz_longtext ); + } +} + static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) { #define FORMAT_STRING " %s --%s%s%s%s%s%s%s " @@ -1309,15 +1386,6 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) * The purpose of having bra and ket is that we might i18n them as well. */ -# define COL(x) "\033[" #x ";1m" -# define RED COL(31) -# define GREEN COL(32) -# define YELLOW COL(33) -# define BLUE COL(34) -# define MAGENTA COL(35) -# define CYAN COL(36) -# define WHITE COL(0) -# define GRAY "\033[0m" #define COLOR_FORMAT_STRING (WHITE" %s --%s"YELLOW"%s%s%s%s%s%s "GRAY) #define COLOR_FORMAT_STRING_BOOL (WHITE" %s --%s%s%s%s%s%s%s "GRAY) @@ -1348,9 +1416,10 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) psz_spaces_text[PADDING_SPACES+LINE_START] = '\0'; memset( psz_spaces_longtext, ' ', LINE_START+2 ); psz_spaces_longtext[LINE_START+2] = '\0'; -#ifdef WIN32 - b_color = false; // don't put color control codes in a .txt file +#ifndef WIN32 + if( !isatty( 1 ) ) #endif + b_color = false; // don't put color control codes in a .txt file if( b_color ) { @@ -1377,12 +1446,13 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) bool b_help_module; module_t *p_parser = (module_t *)p_list->p_values[i_index].p_object; module_config_t *p_item = NULL; + module_config_t *p_section = NULL; module_config_t *p_end = p_parser->p_config + p_parser->confsize; if( psz_module_name && strcmp( psz_module_name, p_parser->psz_object_name ) ) { - const char *const *pp_shortcut = p_parser->pp_shortcuts; + char *const *pp_shortcut = p_parser->pp_shortcuts; while( *pp_shortcut ) { if( !strcmp( psz_module_name, *pp_shortcut ) ) @@ -1481,22 +1551,9 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) case CONFIG_HINT_SUBCATEGORY: if( strcmp( "main", p_parser->psz_object_name ) ) - break; + break; case CONFIG_SECTION: - if( b_color ) - { - utf8_fprintf( stdout, RED" %s:\n"GRAY, - p_item->psz_text ); - if( b_description && p_item->psz_longtext ) - utf8_fprintf( stdout, MAGENTA" %s\n"GRAY, - p_item->psz_longtext ); - } - else - { - utf8_fprintf( stdout, " %s:\n", p_item->psz_text ); - if( b_description && p_item->psz_longtext ) - utf8_fprintf( stdout, " %s\n", p_item->psz_longtext ); - } + p_section = p_item; break; case CONFIG_ITEM_STRING: @@ -1508,6 +1565,8 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) case CONFIG_ITEM_MODULE_LIST_CAT: case CONFIG_ITEM_FONT: case CONFIG_ITEM_PASSWORD: + print_help_section( p_section, b_color, b_description ); + p_section = NULL; psz_bra = OPTION_VALUE_SEP "<"; psz_type = _("string"); psz_ket = ">"; @@ -1527,6 +1586,8 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) break; case CONFIG_ITEM_INTEGER: case CONFIG_ITEM_KEY: /* FIXME: do something a bit more clever */ + print_help_section( p_section, b_color, b_description ); + p_section = NULL; psz_bra = OPTION_VALUE_SEP "<"; psz_type = _("integer"); psz_ket = ">"; @@ -1554,6 +1615,8 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) } break; case CONFIG_ITEM_FLOAT: + print_help_section( p_section, b_color, b_description ); + p_section = NULL; psz_bra = OPTION_VALUE_SEP "<"; psz_type = _("float"); psz_ket = ">"; @@ -1565,6 +1628,8 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) } break; case CONFIG_ITEM_BOOL: + print_help_section( p_section, b_color, b_description ); + p_section = NULL; psz_bra = ""; psz_type = ""; psz_ket = ""; if( !b_help_module ) { @@ -1788,7 +1853,7 @@ static void ListModules( libvlc_int_t *p_this, bool b_verbose ) if( b_verbose ) { - const char *const *pp_shortcut = p_parser->pp_shortcuts; + char *const *pp_shortcut = p_parser->pp_shortcuts; while( *pp_shortcut ) { if( strcmp( *pp_shortcut, p_parser->psz_object_name ) ) @@ -1962,7 +2027,6 @@ static void InitDeviceValues( libvlc_int_t *p_vlc ) char *block_dev = NULL; dbus_bool_t b_dvd; -#ifdef HAVE_HAL_1 DBusConnection *p_connection = NULL; DBusError error; @@ -1978,41 +2042,20 @@ static void InitDeviceValues( libvlc_int_t *p_vlc ) } libhal_ctx_set_dbus_connection( ctx, p_connection ); if( libhal_ctx_init( ctx, &error ) ) -#else - ctx = hal_initialize( NULL, FALSE ); - if( ctx ) -#endif - { -#ifdef HAVE_HAL_1 if( ( devices = libhal_get_all_devices( ctx, &i_devices, NULL ) ) ) -#else - if( ( devices = hal_get_all_devices( ctx, &i_devices ) ) ) -#endif { for( i = 0; i < i_devices; i++ ) { -#ifdef HAVE_HAL_1 if( !libhal_device_property_exists( ctx, devices[i], "storage.cdrom.dvd", NULL ) ) -#else - if( !hal_device_property_exists( ctx, devices[ i ], - "storage.cdrom.dvd" ) ) -#endif { continue; } -#ifdef HAVE_HAL_1 b_dvd = libhal_device_get_property_bool( ctx, devices[ i ], "storage.cdrom.dvd", NULL ); block_dev = libhal_device_get_property_string( ctx, devices[ i ], "block.device" , NULL ); -#else - b_dvd = hal_device_get_property_bool( ctx, devices[ i ], - "storage.cdrom.dvd" ); - block_dev = hal_device_get_property_string( ctx, devices[ i ], - "block.device" ); -#endif if( b_dvd ) { config_PutPsz( p_vlc, "dvd", block_dev ); @@ -2020,26 +2063,13 @@ static void InitDeviceValues( libvlc_int_t *p_vlc ) config_PutPsz( p_vlc, "vcd", block_dev ); config_PutPsz( p_vlc, "cd-audio", block_dev ); -#ifdef HAVE_HAL_1 libhal_free_string( block_dev ); -#else - hal_free_string( block_dev ); -#endif } -#ifdef HAVE_HAL_1 libhal_free_string_array( devices ); -#else - hal_free_string_array( devices ); -#endif } - -#ifdef HAVE_HAL_1 libhal_ctx_shutdown( ctx, NULL ); dbus_connection_unref( p_connection ); libhal_ctx_free( ctx ); -#else - hal_shutdown( ctx ); -#endif } else {