]> git.sesse.net Git - vlc/blobdiff - src/libvlc-common.c
libvlc_InternalAddIntf: remove useless options
[vlc] / src / libvlc-common.c
index bd432a96c927552ca1fe3c0352cea31f7766f784..47b0302569fd1b63fd7aad6d4dc175026bb9d807 100644 (file)
 
 #include <vlc_vlm.h>
 
+#include <assert.h>
+
 /*****************************************************************************
- * The evil global variable. We handle it with care, don't worry.
+ * The evil global variables. We handle them with care, don't worry.
  *****************************************************************************/
-static libvlc_global_data_t   libvlc_global;
-static libvlc_global_data_t *p_libvlc_global = &libvlc_global;
 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;
 
 /*****************************************************************************
  * Local prototypes
@@ -128,11 +130,6 @@ static int  VerboseCallback( vlc_object_t *, char const *,
 
 static void InitDeviceValues( libvlc_int_t * );
 
-libvlc_global_data_t *vlc_global( void )
-{
-    return p_libvlc_global;
-}
-
 /*****************************************************************************
  * vlc_current_object: return the current object.
  *****************************************************************************
@@ -151,43 +148,43 @@ libvlc_int_t * vlc_current_object( int i_object )
  */
 libvlc_int_t * libvlc_InternalCreate( void )
 {
-    int i_ret;
-    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
      * allowed before the thread system has been initialized. */
-    i_ret = vlc_threads_init( p_libvlc_global );
-    if( i_ret < 0 ) return NULL;
+    if (vlc_threads_init ())
+        return NULL;
 
+    libvlc_global_data_t *p_libvlc_global = vlc_global();
     /* 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;
-    p_libvlc->psz_object_name = "libvlc";
+
+    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 */
     msg_Create( p_libvlc );
@@ -195,13 +192,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 ? */
@@ -209,12 +206,9 @@ 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 );
-#ifdef __APPLE__
-    vlc_mutex_init( p_libvlc, &p_libvlc->quicktime_lock );
-    vlc_thread_set_priority( p_libvlc, VLC_THREAD_PRIORITY_LOW );
-#endif
+    vlc_mutex_init( &priv->timer_lock );
+    vlc_mutex_init( &priv->config_lock );
+
     /* Store data for the non-reentrant API */
     p_static_vlc = p_libvlc;
 
@@ -232,6 +226,8 @@ libvlc_int_t * libvlc_InternalCreate( void )
 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;
@@ -252,18 +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 )
+    if( i_argc > 0 && ppsz_argv[0][0] )
     {
-        const char *exe = p_libvlc->psz_object_name = ppsz_argv[0];
-        while( *exe )
-        {
-            if( *exe++ == '/' )
-                p_libvlc->psz_object_name = exe;
-        }
-    }
-    else
-    {
-        p_libvlc->psz_object_name = "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] );
     }
 
     /*
@@ -286,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 )
     {
@@ -302,11 +301,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 )
@@ -315,11 +310,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;
@@ -329,7 +324,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
             msg_Err( p_libvlc, "Unable to fork vlc to daemon mode" );
             b_exit = true;
         }
-        p_libvlc_global->b_daemon = true;
+        b_daemon = true;
 
         /* lets check if we need to write the pidfile */
         psz_pidfile = config_GetPsz( p_libvlc, "pidfile" );
@@ -376,7 +371,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
             close( STDOUT_FILENO );
             close( STDERR_FILENO );
 
-            p_libvlc_global->b_daemon = true;
+            b_daemon = true;
         }
 #endif
     }
@@ -436,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" )) )
@@ -658,8 +653,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
@@ -710,21 +705,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 );
 
-    if( p_libvlc->pf_memcpy == NULL )
-    {
-        p_libvlc->pf_memcpy = memcpy;
-    }
-
-    if( p_libvlc->pf_memset == NULL )
-    {
-        p_libvlc->pf_memset = memset;
-    }
-
-    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 ) );
@@ -733,12 +718,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
@@ -752,21 +737,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 )
@@ -776,15 +761,17 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
     }
     free( psz_modules );
 
+#ifdef ENABLE_SOUT
     /* Initialize VLM if vlm-conf is specified */
     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 );
+#endif
 
     /*
      * Load background interfaces
@@ -819,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 );
             free( psz_temp );
         }
     }
@@ -829,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 );
 
 #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 );
 
-    /* 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 );
 #endif
 
     /*
@@ -850,31 +837,39 @@ 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 );
     }
 #endif
 
     if( config_GetInt( p_libvlc, "file-logging" ) > 0 )
     {
-        VLC_AddIntf( 0, "logger,none", false, false );
+        libvlc_InternalAddIntf( p_libvlc, "logger,none", false );
     }
 #ifdef HAVE_SYSLOG_H
     if( config_GetInt( p_libvlc, "syslog" ) > 0 )
     {
-        const char *psz_logmode = "logmode=syslog";
-        libvlc_InternalAddIntf( p_libvlc, "logger,none", false, false,
-                                1, &psz_logmode );
+        char *logmode = var_CreateGetString( p_libvlc, "logmode" );
+        var_SetString( p_libvlc, "logmode", "syslog" );
+        libvlc_InternalAddIntf( p_libvlc, "logger,none", false );
+
+        if( logmode )
+        {
+            var_SetString( p_libvlc, "logmode", logmode );
+            free( logmode );
+        }
+        else
+            var_Destroy( p_libvlc, "logmode" );
     }
 #endif
 
     if( config_GetInt( p_libvlc, "show-intf" ) > 0 )
     {
-        VLC_AddIntf( 0, "showintf,none", false, false );
+        libvlc_InternalAddIntf( p_libvlc, "showintf,none", false );
     }
 
     if( config_GetInt( p_libvlc, "network-synchronisation") > 0 )
     {
-        VLC_AddIntf( 0, "netsync,none", false, false );
+        libvlc_InternalAddIntf( p_libvlc, "netsync,none", false );
     }
 
 #ifdef WIN32
@@ -941,9 +936,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;
-    announce_handler_t * p_announce = NULL;
-    sout_instance_t    * p_sout = NULL;
+    libvlc_priv_t      *priv = libvlc_priv (p_libvlc);
 
     /* Ask the interfaces to stop and destroy them */
     msg_Dbg( p_libvlc, "removing all interfaces" );
@@ -951,15 +944,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( 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 )) )
@@ -969,37 +957,46 @@ 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 */
-    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 );
 
+#ifdef ENABLE_SOUT
+    announce_handler_t * p_announce;
+
     /* Free announce handler(s?) */
     while( (p_announce = vlc_object_find( p_libvlc, VLC_OBJECT_ANNOUNCE,
                                                  FIND_CHILD ) ) )
@@ -1009,15 +1006,16 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc )
         vlc_object_release( p_announce );
         announce_HandlerDestroy( p_announce );
     }
+#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 );
@@ -1039,10 +1037,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 )
@@ -1058,20 +1058,16 @@ 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 );
@@ -1090,8 +1086,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 );
@@ -1100,7 +1096,7 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, bool b_release )
     /* Stop thread system: last one out please shut the door!
      * The number of initializations of the thread system is counted, we
      * can call this each time */
-    vlc_threads_end( p_libvlc_global );
+    vlc_threads_end ();
 
     return VLC_SUCCESS;
 }
@@ -1108,10 +1104,8 @@ 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_block, bool b_play,
-                            int i_options, const char *const *ppsz_options )
+int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module,
+                            bool b_play )
 {
     int i_err;
     intf_thread_t *p_intf = NULL;
@@ -1123,24 +1117,21 @@ 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( p_libvlc_global->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",
-                          i_options, ppsz_options );
+    p_intf = intf_Create( p_libvlc, psz_module ? psz_module : "$intf", 0, NULL );
     if( p_intf == NULL )
     {
         msg_Err( p_libvlc, "interface \"%s\" initialization failed",
@@ -1150,31 +1141,18 @@ 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;
     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_object_detach( p_intf );
-        intf_Destroy( p_intf );
-    }
-
     return VLC_SUCCESS;
 };
 
@@ -1220,7 +1198,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;
 
@@ -1974,7 +1952,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;
 }
@@ -2003,6 +1981,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;
     }