]> git.sesse.net Git - vlc/blobdiff - src/libvlc.c
* ffmpeg/audio : removed an old error (anyway it was harmless).
[vlc] / src / libvlc.c
index bf1ca9182e81cc8bc1ee87d5a974e748f81f1cfb..177ce6980e4314185b3f4380d0b9eea59e6b1ad7 100644 (file)
@@ -2,7 +2,7 @@
  * libvlc.c: main libvlc source
  *****************************************************************************
  * Copyright (C) 1998-2002 VideoLAN
- * $Id: libvlc.c,v 1.47 2002/11/14 15:07:49 sigmunau Exp $
+ * $Id: libvlc.c,v 1.63 2003/02/06 23:59:40 sam Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -167,12 +167,8 @@ int VLC_Create( void )
         msg_Dbg( &libvlc, COPYRIGHT_MESSAGE );
         msg_Dbg( &libvlc, "libvlc was configured with %s", CONFIGURE_LINE );
 
-        /* Initialize the module bank and load the configuration of the
-         * main module. We need to do this at this stage to be able to display
-         * a short help if required by the user. (short help == main module
-         * options) */
-        module_InitBank( &libvlc );
-        module_LoadMain( &libvlc );
+        /* The module bank will be initialized later */
+        libvlc.p_module_bank = NULL;
 
         libvlc.b_ready = VLC_TRUE;
     }
@@ -213,10 +209,13 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
 {
     char         p_capabilities[200];
     char *       p_tmp;
-    vlc_bool_t   b_exit;
+    char *       psz_modules;
+    char *       psz_parser;
+    vlc_bool_t   b_exit = VLC_FALSE;
     vlc_t *      p_vlc;
     module_t    *p_help_module;
     playlist_t  *p_playlist;
+    vlc_value_t  lockval;
 
     p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc;
 
@@ -225,11 +224,6 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
         return VLC_ENOOBJ;
     }
 
-    /*
-     * Support for gettext
-     */
-    SetLanguage( "" );
-
     /*
      * System specific initialization code
      */
@@ -250,11 +244,35 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
         p_vlc->psz_object_name = "vlc";
     }
 
+    /*
+     * Support for gettext
+     */
+    SetLanguage( "" );
+
+    /* Translate "C" to the language code: "fr", "en_GB", "nl", "ru"... */
+    msg_Dbg( p_vlc, "translation test: code is \"%s\"", _("C") );
+
+    /* Initialize the module bank and load the configuration of the
+     * main module. We need to do this at this stage to be able to display
+     * a short help if required by the user. (short help == main module
+     * options) */
+    var_Create( &libvlc, "libvlc", VLC_VAR_MUTEX );
+    var_Get( &libvlc, "libvlc", &lockval );
+    vlc_mutex_lock( lockval.p_address );
+    if( libvlc.p_module_bank == NULL )
+    {
+        module_InitBank( &libvlc );
+        module_LoadMain( &libvlc );
+    }
+    vlc_mutex_unlock( lockval.p_address );
+    var_Destroy( &libvlc, "libvlc" );
+
     /* Hack: insert the help module here */
     p_help_module = vlc_object_create( p_vlc, VLC_OBJECT_MODULE );
     if( p_help_module == NULL )
     {
         //module_EndBank( p_vlc );
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_EGENERIC;
     }
     p_help_module->psz_object_name = "help";
@@ -268,11 +286,10 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
         config_Free( p_help_module );
         vlc_object_destroy( p_help_module );
         //module_EndBank( p_vlc );
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_EGENERIC;
     }
 
-    b_exit = VLC_FALSE;
-
     /* Check for short help option */
     if( config_GetInt( p_vlc, "help" ) )
     {
@@ -298,6 +315,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
         config_Free( p_help_module );
         vlc_object_destroy( p_help_module );
         //module_EndBank( p_vlc );
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_EEXIT;
     }
 
@@ -345,6 +363,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
     if( b_exit )
     {
         //module_EndBank( p_vlc );
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_EEXIT;
     }
 
@@ -367,6 +386,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
         getchar();
 #endif
         //module_EndBank( p_vlc );
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_EGENERIC;
     }
 
@@ -474,14 +494,43 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
             module_Unneed( p_vlc, p_vlc->p_memcpy_module );
         }
         //module_EndBank( p_vlc );
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_EGENERIC;
     }
 
+    /*
+     * Load background interfaces
+     */
+    psz_modules = config_GetPsz( p_vlc, "extraintf" );
+    psz_parser = psz_modules;
+    while ( psz_parser && *psz_parser )
+    {
+        char *psz_module;
+        psz_module = psz_parser;
+        psz_parser = strchr( psz_module, ',' );
+        if ( psz_parser )
+        {
+            *psz_parser = '\0';
+            psz_parser++;
+        }
+        VLC_AddIntf( 0, psz_module, VLC_FALSE );
+    }
+    if ( psz_modules )
+    {
+        free( psz_modules );
+    }
+
+    /*
+     * FIXME: kludge to use a p_vlc-local variable for the Mozilla plugin
+     */
+    var_Create( p_vlc, "drawable", VLC_VAR_INTEGER );
+
     /*
      * Get input filenames given as commandline arguments
      */
     GetFilenames( p_vlc, i_argc, ppsz_argv );
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -498,7 +547,6 @@ int VLC_AddIntf( int i_object, char const *psz_module, vlc_bool_t b_block )
     int i_err;
     intf_thread_t *p_intf;
     vlc_t *p_vlc;
-    char *psz_oldmodule = NULL;
 
     p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc;
 
@@ -507,27 +555,13 @@ int VLC_AddIntf( int i_object, char const *psz_module, vlc_bool_t b_block )
         return VLC_ENOOBJ;
     }
 
-    if( psz_module )
-    {
-        psz_oldmodule = config_GetPsz( p_vlc, "intf" );
-        config_PutPsz( p_vlc, "intf", psz_module );
-    }
-
     /* Try to create the interface */
-    p_intf = intf_Create( p_vlc );
-
-    if( psz_module )
-    {
-        config_PutPsz( p_vlc, "intf", psz_oldmodule );
-        if( psz_oldmodule )
-        {
-            free( psz_oldmodule );
-        }
-    }
+    p_intf = intf_Create( p_vlc, psz_module ? psz_module : "$intf" );
 
     if( p_intf == NULL )
     {
         msg_Err( p_vlc, "interface initialization failed" );
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_EGENERIC;
     }
 
@@ -538,9 +572,11 @@ int VLC_AddIntf( int i_object, char const *psz_module, vlc_bool_t b_block )
     {
         vlc_object_detach( p_intf );
         intf_Destroy( p_intf );
+        if( i_object ) vlc_object_release( p_vlc );
         return i_err;
     }
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -568,7 +604,7 @@ int VLC_Destroy( int i_object )
     {
         network_ChannelJoin( p_vlc, COMMON_CHANNEL );
     }
-    
+
     /*
      * Free allocated memory
      */
@@ -588,17 +624,20 @@ int VLC_Destroy( int i_object )
      * XXX: Free module bank !
      */
     //module_EndBank( p_vlc );
-    
+
     /*
      * System specific cleaning code
      */
     system_End( p_vlc );
-    
+
     /* Destroy mutexes */
     vlc_mutex_destroy( &p_vlc->config_lock );
 
     vlc_object_detach( p_vlc );
 
+    /* Release object before destroying it */
+    if( i_object ) vlc_object_release( p_vlc );
+
     vlc_object_destroy( p_vlc );
 
     /* Stop thread system: last one out please shut the door! */
@@ -626,6 +665,7 @@ int VLC_Die( int i_object )
 
     p_vlc->b_die = VLC_TRUE;
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -657,6 +697,7 @@ int VLC_AddTarget( int i_object, char const *psz_target, int i_mode, int i_pos )
 
         if( p_playlist == NULL )
         {
+            if( i_object ) vlc_object_release( p_vlc );
             return VLC_EGENERIC;
         }
 
@@ -667,6 +708,7 @@ int VLC_AddTarget( int i_object, char const *psz_target, int i_mode, int i_pos )
 
     vlc_object_release( p_playlist );
 
+    if( i_object ) vlc_object_release( p_vlc );
     return i_err;
 }
 
@@ -678,6 +720,7 @@ int VLC_AddTarget( int i_object, char const *psz_target, int i_mode, int i_pos )
 int VLC_Set( int i_object, char const *psz_var, vlc_value_t value )
 {
     vlc_t *p_vlc;
+    int i_ret;
 
     p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc;
 
@@ -712,11 +755,15 @@ int VLC_Set( int i_object, char const *psz_var, vlc_value_t value )
                     config_PutPsz( p_vlc, psz_newvar, value.psz_string );
                     break;
             }
+            if( i_object ) vlc_object_release( p_vlc );
             return VLC_SUCCESS;
         }
     }
 
-    return var_Set( p_vlc, psz_var, value );
+    i_ret = var_Set( p_vlc, psz_var, value );
+
+    if( i_object ) vlc_object_release( p_vlc );
+    return i_ret;
 }
 
 /*****************************************************************************
@@ -727,6 +774,7 @@ int VLC_Set( int i_object, char const *psz_var, vlc_value_t value )
 int VLC_Get( int i_object, char const *psz_var, vlc_value_t *p_value )
 {
     vlc_t *p_vlc;
+    int i_ret;
 
     p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc;
 
@@ -735,7 +783,10 @@ int VLC_Get( int i_object, char const *psz_var, vlc_value_t *p_value )
         return VLC_ENOOBJ;
     }
 
-    return var_Get( p_vlc, psz_var, p_value );
+    i_ret = var_Get( p_vlc, psz_var, p_value );
+
+    if( i_object ) vlc_object_release( p_vlc );
+    return i_ret;
 }
 
 /* FIXME: temporary hacks */
@@ -756,10 +807,13 @@ int VLC_Play( int i_object )
         return VLC_ENOOBJ;
     }
 
+    vlc_thread_set_priority( p_vlc, VLC_THREAD_PRIORITY_LOW );
+
     p_playlist = vlc_object_find( p_vlc, VLC_OBJECT_PLAYLIST, FIND_CHILD );
 
     if( !p_playlist )
     {
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_ENOOBJ;
     }
 
@@ -776,6 +830,7 @@ int VLC_Play( int i_object )
 
     vlc_object_release( p_playlist );
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -830,7 +885,7 @@ int VLC_Stop( int i_object )
     {
         vlc_object_detach( p_vout );
         vlc_object_release( p_vout );
-        vout_DestroyThread( p_vout );
+        vout_Destroy( p_vout );
     }
 
     /*
@@ -844,6 +899,7 @@ int VLC_Stop( int i_object )
         aout_Delete( p_aout );
     }
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -866,12 +922,14 @@ int VLC_Pause( int i_object )
 
     if( !p_input )
     {
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_ENOOBJ;
     }
 
     input_SetStatus( p_input, INPUT_STATUS_PAUSE );
     vlc_object_release( p_input );
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -894,12 +952,14 @@ int VLC_FullScreen( int i_object )
 
     if( !p_vout )
     {
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_ENOOBJ;
     }
 
     p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
     vlc_object_release( p_vout );
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -917,6 +977,11 @@ static void SetLanguage ( char const *psz_lang )
 #if defined( ENABLE_NLS ) \
      && ( defined( HAVE_GETTEXT ) || defined( HAVE_INCLUDED_GETTEXT ) )
 
+    char *          psz_path;
+#ifdef SYS_DARWIN
+    char            psz_tmp[1024];
+#endif
+
 #   if defined( HAVE_INCLUDED_GETTEXT ) && !defined( HAVE_LC_MESSAGES )
     if( *psz_lang )
     {
@@ -937,10 +1002,17 @@ static void SetLanguage ( char const *psz_lang )
     setlocale( LC_CTYPE, psz_lang );
 
     /* Specify where to find the locales for current domain */
-    if( !bindtextdomain( PACKAGE, LOCALEDIR ) )
+#ifndef SYS_DARWIN
+    psz_path = LOCALEDIR;
+#else
+    snprintf( psz_tmp, sizeof(psz_tmp), "%s/%s", libvlc.psz_vlcpath,
+              "locale" );
+    psz_path = psz_tmp;
+#endif
+    if( !bindtextdomain( PACKAGE, psz_path ) )
     {
         fprintf( stderr, "warning: no domain %s in directory %s\n",
-                 PACKAGE, LOCALEDIR );
+                 PACKAGE, psz_path );
     }
 
     /* Set the default domain */
@@ -997,10 +1069,11 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
 #define LINE_START 8
 #define PADDING_SPACES 25
     vlc_list_t *p_list;
-    module_t **pp_parser;
+    module_t *p_parser;
     module_config_t *p_item;
     char psz_spaces[PADDING_SPACES+LINE_START+1];
     char psz_format[sizeof(FORMAT_STRING)];
+    int i_index;
 
     memset( psz_spaces, ' ', PADDING_SPACES+LINE_START );
     psz_spaces[PADDING_SPACES+LINE_START] = '\0';
@@ -1015,28 +1088,28 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
     p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
 
     /* Enumerate the config for each module */
-    for( pp_parser = (module_t **)p_list->pp_objects ;
-         *pp_parser ;
-         pp_parser++ )
+    for( i_index = 0; i_index < p_list->i_count; i_index++ )
     {
         vlc_bool_t b_help_module;
 
+        p_parser = (module_t *)p_list->p_values[i_index].p_object ;
+
         if( psz_module_name && strcmp( psz_module_name,
-                                       (*pp_parser)->psz_object_name ) )
+                                       p_parser->psz_object_name ) )
         {
             continue;
         }
 
         /* Ignore modules without config options */
-        if( !(*pp_parser)->i_config_items )
+        if( !p_parser->i_config_items )
         {
             continue;
         }
 
-        b_help_module = !strcmp( "help", (*pp_parser)->psz_object_name );
+        b_help_module = !strcmp( "help", p_parser->psz_object_name );
 
         /* Print module options */
-        for( p_item = (*pp_parser)->p_config;
+        for( p_item = p_parser->p_config;
              p_item->i_type != CONFIG_HINT_END;
              p_item++ )
         {
@@ -1188,8 +1261,9 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
 static void ListModules( vlc_t *p_this )
 {
     vlc_list_t *p_list;
-    module_t **pp_parser;
+    module_t *p_parser;
     char psz_spaces[22];
+    int i_index;
 
     memset( psz_spaces, ' ', 22 );
 
@@ -1207,20 +1281,20 @@ static void ListModules( vlc_t *p_this )
     p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
 
     /* Enumerate each module */
-    for( pp_parser = (module_t **)p_list->pp_objects ;
-         *pp_parser ;
-         pp_parser++ )
+    for( i_index = 0; i_index < p_list->i_count; i_index++ )
     {
         int i;
 
+        p_parser = (module_t *)p_list->p_values[i_index].p_object ;
+
         /* Nasty hack, but right now I'm too tired to think about a nice
          * solution */
-        i = 22 - strlen( (*pp_parser)->psz_object_name ) - 1;
+        i = 22 - strlen( p_parser->psz_object_name ) - 1;
         if( i < 0 ) i = 0;
         psz_spaces[i] = 0;
 
-        fprintf( stdout, "  %s%s %s\n", (*pp_parser)->psz_object_name,
-                         psz_spaces, (*pp_parser)->psz_longname );
+        fprintf( stdout, "  %s%s %s\n", p_parser->psz_object_name,
+                         psz_spaces, p_parser->psz_longname );
 
         psz_spaces[i] = ' ';
     }
@@ -1228,8 +1302,8 @@ static void ListModules( vlc_t *p_this )
     vlc_list_release( p_list );
 
 #ifdef WIN32        /* Pause the console because it's destroyed when we exit */
-        fprintf( stdout, _("\nPress the RETURN key to continue...\n") );
-        getchar();
+    fprintf( stdout, _("\nPress the RETURN key to continue...\n") );
+    getchar();
 #endif
 }
 
@@ -1274,4 +1348,3 @@ static void ShowConsole( void )
     return;
 }
 #endif
-