]> git.sesse.net Git - vlc/blobdiff - src/libvlc.c
* minor updates to pofiles.
[vlc] / src / libvlc.c
index 0aa7d72e98d7d266d26c41a2d1bff6fb0d4cc250..15213278340173ea439d7f6dc655262a058ef7b8 100644 (file)
@@ -2,7 +2,7 @@
  * libvlc.c: main libvlc source
  *****************************************************************************
  * Copyright (C) 1998-2002 VideoLAN
- * $Id: libvlc.c,v 1.42 2002/10/16 15:10:39 sam Exp $
+ * $Id: libvlc.c,v 1.56 2003/01/07 13:26:22 sam Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
-#include <errno.h>                                                 /* ENOMEM */
+#include <vlc/vlc.h>
+
+#ifdef HAVE_ERRNO_H
+#   include <errno.h>                                              /* ENOMEM */
+#endif
 #include <stdio.h>                                              /* sprintf() */
 #include <string.h>                                            /* strerror() */
 #include <stdlib.h>                                                /* free() */
 
-#include <vlc/vlc.h>
-
 #ifndef WIN32
 #   include <netinet/in.h>                            /* BSD: struct in_addr */
 #endif
 
 #ifdef HAVE_UNISTD_H
 #   include <unistd.h>
-#elif defined( _MSC_VER ) && defined( _WIN32 )
+#elif defined( _MSC_VER ) && defined( _WIN32 ) && !defined( UNDER_CE )
 #   include <io.h>
 #endif
 
 #ifdef WIN32                       /* optind, getopt(), included in unistd.h */
-#   include "extras/GNUgetopt/getopt.h"
+#   include "extras/getopt.h"
 #endif
 
 #ifdef HAVE_LOCALE_H
@@ -223,11 +225,6 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
         return VLC_ENOOBJ;
     }
 
-    /*
-     * Support for gettext
-     */
-    SetLanguage( "" );
-
     /*
      * System specific initialization code
      */
@@ -248,11 +245,20 @@ 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") );
+
     /* 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";
@@ -266,6 +272,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_EGENERIC;
     }
 
@@ -274,7 +281,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
     /* Check for short help option */
     if( config_GetInt( p_vlc, "help" ) )
     {
-        fprintf( stderr, _("Usage: %s [options] [items]...\n\n"),
+        fprintf( stdout, _("Usage: %s [options] [items]...\n\n"),
                          p_vlc->psz_object_name );
         Usage( p_vlc, "main" );
         Usage( p_vlc, "help" );
@@ -296,6 +303,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;
     }
 
@@ -343,6 +351,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;
     }
 
@@ -365,6 +374,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;
     }
 
@@ -472,6 +482,7 @@ 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;
     }
 
@@ -480,6 +491,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
      */
     GetFilenames( p_vlc, i_argc, ppsz_argv );
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -526,6 +538,7 @@ int VLC_AddIntf( int i_object, char const *psz_module, vlc_bool_t b_block )
     if( p_intf == NULL )
     {
         msg_Err( p_vlc, "interface initialization failed" );
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_EGENERIC;
     }
 
@@ -536,9 +549,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;
 }
 
@@ -602,6 +617,7 @@ int VLC_Destroy( int i_object )
     /* Stop thread system: last one out please shut the door! */
     vlc_threads_end( &libvlc );
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -624,6 +640,7 @@ int VLC_Die( int i_object )
 
     p_vlc->b_die = VLC_TRUE;
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -655,6 +672,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;
         }
 
@@ -665,6 +683,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;
 }
 
@@ -676,6 +695,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;
 
@@ -710,11 +730,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;
 }
 
 /*****************************************************************************
@@ -725,6 +749,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;
 
@@ -733,7 +758,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 */
@@ -753,11 +781,21 @@ int VLC_Play( int i_object )
     {
         return VLC_ENOOBJ;
     }
+    
+    /* add pseudo sap interface; non blocking */
+    if( config_GetInt( p_vlc, "sap" ) )
+    {
+        msg_Dbg( p_vlc, "adding sap interface" );
+        VLC_AddIntf( 0, "sap", VLC_FALSE );
+    }
+
+    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;
     }
 
@@ -774,6 +812,7 @@ int VLC_Play( int i_object )
 
     vlc_object_release( p_playlist );
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -828,7 +867,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 );
     }
 
     /*
@@ -842,6 +881,7 @@ int VLC_Stop( int i_object )
         aout_Delete( p_aout );
     }
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -864,12 +904,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;
 }
 
@@ -892,12 +934,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;
 }
 
@@ -915,6 +959,12 @@ 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_vlcpath = system_GetProgramPath();
+    char            psz_tmp[1024];
+#endif
+
 #   if defined( HAVE_INCLUDED_GETTEXT ) && !defined( HAVE_LC_MESSAGES )
     if( *psz_lang )
     {
@@ -935,10 +985,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", 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 */
@@ -956,12 +1013,19 @@ static int GetFilenames( vlc_t *p_vlc, int i_argc, char *ppsz_argv[] )
     int i_opt;
 
     /* We assume that the remaining parameters are filenames */
-    for( i_opt = optind; i_opt < i_argc; i_opt++ )
+    for( i_opt = i_argc - 1; i_opt > optind; i_opt-- )
     {
         /* TODO: write an internal function of this one, to avoid
          *       unnecessary lookups. */
         VLC_AddTarget( p_vlc->i_object_id, ppsz_argv[ i_opt ],
-                          PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
+                       PLAYLIST_INSERT, 0 );
+    }
+
+    /* If there is at least one target, play it */
+    if( i_argc > optind )
+    {
+        VLC_AddTarget( p_vlc->i_object_id, ppsz_argv[ optind ],
+                       PLAYLIST_INSERT | PLAYLIST_GO, 0 );
     }
 
     return VLC_SUCCESS;
@@ -987,11 +1051,12 @@ 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;
+    vlc_list_t list;
+    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';
@@ -1003,31 +1068,31 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
 #endif
 
     /* List all modules */
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+    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 < list.i_count; i_index++ )
     {
         vlc_bool_t b_help_module;
 
+        p_parser = (module_t *)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++ )
         {
@@ -1039,7 +1104,7 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
             {
             case CONFIG_HINT_CATEGORY:
             case CONFIG_HINT_USAGE:
-                fprintf( stderr, " %s\n", p_item->psz_text );
+                fprintf( stdout, " %s\n", p_item->psz_text );
                 break;
 
             case CONFIG_ITEM_STRING:
@@ -1142,13 +1207,13 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
                 if( p_item->i_type == CONFIG_ITEM_BOOL &&
                     !b_help_module )
                 {
-                    fprintf( stderr, psz_format, p_item->psz_name, psz_prefix,
+                    fprintf( stdout, psz_format, p_item->psz_name, psz_prefix,
                              p_item->psz_name, psz_bra, psz_type, psz_ket,
                              psz_spaces, p_item->psz_text, psz_suf );
                 }
                 else
                 {
-                    fprintf( stderr, psz_format, p_item->psz_name, "", "",
+                    fprintf( stdout, psz_format, p_item->psz_name, "", "",
                              psz_bra, psz_type, psz_ket, psz_spaces,
                              p_item->psz_text, psz_suf );
                 }
@@ -1162,10 +1227,10 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
     }
 
     /* Release the module list */
-    vlc_list_release( p_list );
+    vlc_list_release( &list );
 
 #ifdef WIN32        /* Pause the console because it's destroyed when we exit */
-        fprintf( stderr, _("\nPress the RETURN key to continue...\n") );
+        fprintf( stdout, _("\nPress the RETURN key to continue...\n") );
         getchar();
 #endif
 }
@@ -1178,9 +1243,10 @@ 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;
+    vlc_list_t list;
+    module_t *p_parser;
     char psz_spaces[22];
+    int i_index;
 
     memset( psz_spaces, ' ', 22 );
 
@@ -1189,38 +1255,38 @@ static void ListModules( vlc_t *p_this )
 #endif
 
     /* Usage */
-    fprintf( stderr, _("Usage: %s [options] [items]...\n\n"),
+    fprintf( stdout, _("Usage: %s [options] [items]...\n\n"),
                      p_this->p_vlc->psz_object_name );
 
-    fprintf( stderr, _("[module]              [description]\n") );
+    fprintf( stdout, _("[module]              [description]\n") );
 
     /* List all modules */
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+    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 < list.i_count; i_index++ )
     {
         int i;
 
+        p_parser = (module_t *)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( stderr, "  %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] = ' ';
     }
 
-    vlc_list_release( p_list );
+    vlc_list_release( &list );
 
 #ifdef WIN32        /* Pause the console because it's destroyed when we exit */
-        fprintf( stderr, _("\nPress the RETURN key to continue...\n") );
-        getchar();
+    fprintf( stdout, _("\nPress the RETURN key to continue...\n") );
+    getchar();
 #endif
 }
 
@@ -1235,15 +1301,15 @@ static void Version( void )
     ShowConsole();
 #endif
 
-    fprintf( stderr, VERSION_MESSAGE "\n" );
-    fprintf( stderr,
+    fprintf( stdout, VERSION_MESSAGE "\n" );
+    fprintf( stdout,
       _("This program comes with NO WARRANTY, to the extent permitted by "
         "law.\nYou may redistribute it under the terms of the GNU General "
         "Public License;\nsee the file named COPYING for details.\n"
         "Written by the VideoLAN team at Ecole Centrale, Paris.\n") );
 
 #ifdef WIN32        /* Pause the console because it's destroyed when we exit */
-    fprintf( stderr, _("\nPress the RETURN key to continue...\n") );
+    fprintf( stdout, _("\nPress the RETURN key to continue...\n") );
     getchar();
 #endif
 }
@@ -1256,11 +1322,12 @@ static void Version( void )
 #ifdef WIN32 /*  */
 static void ShowConsole( void )
 {
+#   ifndef UNDER_CE
     AllocConsole();
     freopen( "CONOUT$", "w", stdout );
     freopen( "CONOUT$", "w", stderr );
     freopen( "CONIN$", "r", stdin );
+#   endif
     return;
 }
 #endif
-