X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Flibvlc.c;h=4c5e51ad703eb653d96fa32f7464deca290c3ec6;hb=25cd1327a67705cdecbb8754f405be01557a175b;hp=23c15a089754d5afbb6a5b4f277feff4cb3c8c46;hpb=231797fcda74e847c6609e48d138f2c5c533cf85;p=vlc diff --git a/src/libvlc.c b/src/libvlc.c index 23c15a0897..4c5e51ad70 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -1,8 +1,8 @@ /***************************************************************************** * libvlc.c: main libvlc source ***************************************************************************** - * Copyright (C) 1998-2002 VideoLAN - * $Id: libvlc.c,v 1.85 2003/05/10 13:40:37 titer Exp $ + * Copyright (C) 1998-2004 VideoLAN + * $Id: libvlc.c,v 1.109 2004/01/06 12:02:05 zorglub Exp $ * * Authors: Vincent Seguin * Samuel Hocevar @@ -63,17 +63,17 @@ #include "vlc_cpu.h" /* CPU detection */ #include "os_specific.h" -#include "error.h" +#include "vlc_error.h" #include "stream_control.h" #include "input_ext-intf.h" #include "vlc_playlist.h" -#include "interface.h" +#include "vlc_interface.h" #include "audio_output.h" -#include "video.h" +#include "vlc_video.h" #include "video_output.h" #include "libvlc.h" @@ -81,8 +81,9 @@ /***************************************************************************** * The evil global variable. We handle it with care, don't worry. *****************************************************************************/ -static libvlc_t libvlc; -static vlc_t * p_static_vlc; +static libvlc_t libvlc; +static libvlc_t * p_libvlc; +static vlc_t * p_static_vlc; /***************************************************************************** * Local prototypes @@ -98,6 +99,23 @@ static void ShowConsole ( void ); #endif static int ConsoleWidth ( void ); + +/***************************************************************************** + * vlc_current_object: return the current object. + ***************************************************************************** + * If i_object is non-zero, return the corresponding object. Otherwise, + * return the statically allocated p_vlc object. + *****************************************************************************/ +vlc_t * vlc_current_object( int i_object ) +{ + if( i_object ) + { + return vlc_object_get( p_libvlc, i_object ); + } + + return p_static_vlc; +} + /***************************************************************************** * VLC_Version: return the libvlc version. ***************************************************************************** @@ -130,9 +148,12 @@ int VLC_Create( void ) vlc_t * p_vlc = NULL; vlc_value_t lockval; + /* &libvlc never changes, so we can safely call this multiple times. */ + p_libvlc = &libvlc; + /* 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( &libvlc ); + i_ret = vlc_threads_init( p_libvlc ); if( i_ret < 0 ) { return i_ret; @@ -140,8 +161,8 @@ int VLC_Create( void ) /* Now that the thread system is initialized, we don't have much, but * at least we have var_Create */ - var_Create( &libvlc, "libvlc", VLC_VAR_MUTEX ); - var_Get( &libvlc, "libvlc", &lockval ); + var_Create( p_libvlc, "libvlc", VLC_VAR_MUTEX ); + var_Get( p_libvlc, "libvlc", &lockval ); vlc_mutex_lock( lockval.p_address ); if( !libvlc.b_ready ) { @@ -161,11 +182,11 @@ int VLC_Create( void ) #endif /* Initialize message queue */ - msg_Create( &libvlc ); + msg_Create( p_libvlc ); /* Announce who we are */ - msg_Dbg( &libvlc, COPYRIGHT_MESSAGE ); - msg_Dbg( &libvlc, "libvlc was configured with %s", CONFIGURE_LINE ); + msg_Dbg( p_libvlc, COPYRIGHT_MESSAGE ); + msg_Dbg( p_libvlc, "libvlc was configured with %s", CONFIGURE_LINE ); /* The module bank will be initialized later */ libvlc.p_module_bank = NULL; @@ -173,10 +194,10 @@ int VLC_Create( void ) libvlc.b_ready = VLC_TRUE; } vlc_mutex_unlock( lockval.p_address ); - var_Destroy( &libvlc, "libvlc" ); + var_Destroy( p_libvlc, "libvlc" ); /* Allocate a vlc object */ - p_vlc = vlc_object_create( &libvlc, VLC_OBJECT_VLC ); + p_vlc = vlc_object_create( p_libvlc, VLC_OBJECT_VLC ); if( p_vlc == NULL ) { return VLC_EGENERIC; @@ -187,9 +208,12 @@ int VLC_Create( void ) /* Initialize mutexes */ vlc_mutex_init( p_vlc, &p_vlc->config_lock ); +#ifdef SYS_DARWIN + vlc_mutex_init( p_vlc, &p_vlc->quicktime_lock ); +#endif /* Store our newly allocated structure in the global list */ - vlc_object_attach( p_vlc, &libvlc ); + vlc_object_attach( p_vlc, p_libvlc ); /* Store data for the non-reentrant API */ p_static_vlc = p_vlc; @@ -214,13 +238,11 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) char * psz_parser; char * psz_language; vlc_bool_t b_exit = VLC_FALSE; - vlc_t * p_vlc; + vlc_t * p_vlc = vlc_current_object( i_object ); 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; - if( !p_vlc ) { return VLC_ENOOBJ; @@ -258,22 +280,22 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) * 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 ); + var_Create( p_libvlc, "libvlc", VLC_VAR_MUTEX ); + var_Get( p_libvlc, "libvlc", &lockval ); vlc_mutex_lock( lockval.p_address ); if( libvlc.p_module_bank == NULL ) { - module_InitBank( &libvlc ); - module_LoadMain( &libvlc ); + module_InitBank( p_vlc ); + module_LoadMain( p_vlc ); } vlc_mutex_unlock( lockval.p_address ); - var_Destroy( &libvlc, "libvlc" ); + var_Destroy( p_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 ); + /*module_EndBank( p_vlc );*/ if( i_object ) vlc_object_release( p_vlc ); return VLC_EGENERIC; } @@ -287,7 +309,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) vlc_object_detach( p_help_module ); config_Free( p_help_module ); vlc_object_destroy( p_help_module ); - //module_EndBank( p_vlc ); + /*module_EndBank( p_vlc );*/ if( i_object ) vlc_object_release( p_vlc ); return VLC_EGENERIC; } @@ -295,7 +317,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( stdout, _("Usage: %s [options] [items]...\n\n"), + fprintf( stdout, _("Usage: %s [options] [items]...\n"), p_vlc->psz_object_name ); Usage( p_vlc, "main" ); Usage( p_vlc, "help" ); @@ -308,6 +330,10 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) b_exit = VLC_TRUE; } + /* Set the config file stuff */ + p_vlc->psz_homedir = config_GetHomeDir(); + p_vlc->psz_configfile = config_GetPsz( p_vlc, "config" ); + /* Hack: remove the help module here */ vlc_object_detach( p_help_module ); /* End hack */ @@ -316,7 +342,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 ); + /*module_EndBank( p_vlc );*/ if( i_object ) vlc_object_release( p_vlc ); return VLC_EEXIT; } @@ -327,7 +353,6 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) /* This ain't really nice to have to reload the config here but it seems * the only way to do it. */ - p_vlc->psz_homedir = config_GetHomeDir(); config_LoadConfigFile( p_vlc, "main" ); config_LoadCmdLine( p_vlc, &i_argc, ppsz_argv, VLC_TRUE ); @@ -343,9 +368,16 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) textdomain( PACKAGE ); +#if defined( SYS_BEOS ) || defined ( SYS_DARWIN ) || \ + ( defined( WIN32 ) && !defined( HAVE_INCLUDED_GETTEXT ) ) + /* BeOS only support UTF8 strings */ + /* Mac OS X prefers UTF8 */ + bind_textdomain_codeset( PACKAGE, "UTF-8" ); +#endif + module_EndBank( p_vlc ); - module_InitBank( &libvlc ); - module_LoadMain( &libvlc ); + module_InitBank( p_vlc ); + module_LoadMain( p_vlc ); config_LoadCmdLine( p_vlc, &i_argc, ppsz_argv, VLC_TRUE ); } if( psz_language ) free( psz_language ); @@ -357,8 +389,13 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) * list of configuration options exported by each module and loads their * default values. */ - module_LoadBuiltins( &libvlc ); - module_LoadPlugins( &libvlc ); + module_LoadBuiltins( p_vlc ); + module_LoadPlugins( p_vlc ); + if( p_vlc->b_die ) + { + b_exit = VLC_TRUE; + } + msg_Dbg( p_vlc, "module bank initialized, found %i modules", libvlc.p_module_bank->i_children ); @@ -386,15 +423,33 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) b_exit = VLC_TRUE; } + /* Check for config file options */ + if( config_GetInt( p_vlc, "reset-config" ) ) + { + vlc_object_detach( p_help_module ); + config_ResetAll( p_vlc ); + config_LoadCmdLine( p_vlc, &i_argc, ppsz_argv, VLC_TRUE ); + config_SaveConfigFile( p_vlc, NULL ); + vlc_object_attach( p_help_module, libvlc.p_module_bank ); + } + if( config_GetInt( p_vlc, "save-config" ) ) + { + vlc_object_detach( p_help_module ); + config_LoadConfigFile( p_vlc, NULL ); + config_LoadCmdLine( p_vlc, &i_argc, ppsz_argv, VLC_TRUE ); + config_SaveConfigFile( p_vlc, NULL ); + vlc_object_attach( p_help_module, libvlc.p_module_bank ); + } + /* Hack: remove the help module here */ vlc_object_detach( p_help_module ); - config_Free( p_help_module ); - vlc_object_destroy( p_help_module ); /* End hack */ if( b_exit ) { - //module_EndBank( p_vlc ); + 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; } @@ -402,9 +457,12 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) /* * Override default configuration with config file settings */ - p_vlc->psz_homedir = config_GetHomeDir(); config_LoadConfigFile( p_vlc, NULL ); + /* Hack: insert the help module here */ + vlc_object_attach( p_help_module, libvlc.p_module_bank ); + /* End hack */ + /* * Override configuration with command line settings */ @@ -417,15 +475,24 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) "that they are valid.\nPress the RETURN key to continue..." ); getchar(); #endif - //module_EndBank( p_vlc ); + vlc_object_detach( p_help_module ); + 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; } + /* Hack: remove the help module here */ + vlc_object_detach( p_help_module ); + config_Free( p_help_module ); + vlc_object_destroy( p_help_module ); + /* End hack */ + /* * System specific configuration */ - system_Configure( p_vlc ); + system_Configure( p_vlc, &i_argc, ppsz_argv ); /* * Message queue options @@ -450,7 +517,6 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) msg_Flush( p_vlc ); /* p_vlc initialization. FIXME ? */ - p_vlc->i_desync = config_GetInt( p_vlc, "desync" ) * (mtime_t)1000; #if defined( __i386__ ) if( !config_GetInt( p_vlc, "mmx" ) ) @@ -502,6 +568,14 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) p_vlc->pf_memset = memset; } + /* + * Initialize hotkey handling + */ + var_Create( p_vlc, "key-pressed", VLC_VAR_INTEGER ); + p_vlc->p_hotkeys = malloc( sizeof(p_hotkeys) ); + /* Do a copy (we don't need to modify the strings) */ + memcpy( p_vlc->p_hotkeys, p_hotkeys, sizeof(p_hotkeys) ); + /* * Initialize playlist and get commandline files */ @@ -513,7 +587,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 ); + /*module_EndBank( p_vlc );*/ if( i_object ) vlc_object_release( p_vlc ); return VLC_EGENERIC; } @@ -546,10 +620,26 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) free( psz_modules ); } + /* + * Allways load the hotkeys interface if it exists + */ + VLC_AddIntf( 0, "hotkeys,none", VLC_FALSE ); + /* * FIXME: kludge to use a p_vlc-local variable for the Mozilla plugin */ var_Create( p_vlc, "drawable", VLC_VAR_INTEGER ); + var_Create( p_vlc, "drawableredraw", VLC_VAR_INTEGER ); + var_Create( p_vlc, "drawablet", VLC_VAR_INTEGER ); + var_Create( p_vlc, "drawablel", VLC_VAR_INTEGER ); + var_Create( p_vlc, "drawableb", VLC_VAR_INTEGER ); + var_Create( p_vlc, "drawabler", VLC_VAR_INTEGER ); + var_Create( p_vlc, "drawablex", VLC_VAR_INTEGER ); + var_Create( p_vlc, "drawabley", VLC_VAR_INTEGER ); + var_Create( p_vlc, "drawablew", VLC_VAR_INTEGER ); + var_Create( p_vlc, "drawableh", VLC_VAR_INTEGER ); + var_Create( p_vlc, "drawableportx", VLC_VAR_INTEGER ); + var_Create( p_vlc, "drawableporty", VLC_VAR_INTEGER ); /* * Get input filenames given as commandline arguments @@ -572,9 +662,7 @@ 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; - - p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc; + vlc_t *p_vlc = vlc_current_object( i_object ); if( !p_vlc ) { @@ -614,9 +702,7 @@ int VLC_AddIntf( int i_object, char const *psz_module, vlc_bool_t b_block ) *****************************************************************************/ int VLC_Destroy( int i_object ) { - vlc_t *p_vlc; - - p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc; + vlc_t *p_vlc = vlc_current_object( i_object ); if( !p_vlc ) { @@ -638,10 +724,22 @@ int VLC_Destroy( int i_object ) p_vlc->psz_homedir = NULL; } + if( p_vlc->psz_configfile ) + { + free( p_vlc->psz_configfile ); + p_vlc->psz_configfile = NULL; + } + + if( p_vlc->p_hotkeys ) + { + free( p_vlc->p_hotkeys ); + p_vlc->p_hotkeys = NULL; + } + /* * XXX: Free module bank ! */ - //module_EndBank( p_vlc ); + /*module_EndBank( p_vlc );*/ /* * System specific cleaning code @@ -650,6 +748,9 @@ int VLC_Destroy( int i_object ) /* Destroy mutexes */ vlc_mutex_destroy( &p_vlc->config_lock ); +#ifdef SYS_DARWIN + vlc_mutex_destroy( &p_vlc->quicktime_lock ); +#endif vlc_object_detach( p_vlc ); @@ -659,7 +760,7 @@ int VLC_Destroy( int i_object ) vlc_object_destroy( p_vlc ); /* Stop thread system: last one out please shut the door! */ - vlc_threads_end( &libvlc ); + vlc_threads_end( p_libvlc ); return VLC_SUCCESS; } @@ -668,13 +769,11 @@ int VLC_Destroy( int i_object ) * VLC_Die: ask vlc to die. ***************************************************************************** * This function sets p_vlc->b_die to VLC_TRUE, but does not do any other - * task. It is your duty to call vlc_end and VLC_Destroy afterwards. + * task. It is your duty to call VLC_End and VLC_Destroy afterwards. *****************************************************************************/ int VLC_Die( int i_object ) { - vlc_t *p_vlc; - - p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc; + vlc_t *p_vlc = vlc_current_object( i_object ); if( !p_vlc ) { @@ -693,13 +792,14 @@ int VLC_Die( int i_object ) * This function adds psz_target to the current playlist. If a playlist does * not exist, it will create one. *****************************************************************************/ -int VLC_AddTarget( int i_object, char const *psz_target, int i_mode, int i_pos ) +int VLC_AddTarget( int i_object, char const *psz_target, + char const **ppsz_options, int i_options, + int i_mode, int i_pos ) { + int i; int i_err; playlist_t *p_playlist; - vlc_t *p_vlc; - - p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc; + vlc_t *p_vlc = vlc_current_object( i_object ); if( !p_vlc ) { @@ -722,7 +822,13 @@ int VLC_AddTarget( int i_object, char const *psz_target, int i_mode, int i_pos ) vlc_object_yield( p_playlist ); } - i_err = playlist_Add( p_playlist, psz_target, i_mode, i_pos ); + i_err = playlist_Add( p_playlist, psz_target, psz_target, + i_mode, i_pos ); + + for( i = 0 ; i< i_options ; i++ ) + { + playlist_AddOption( p_playlist, i_err , ppsz_options[i] ); + } vlc_object_release( p_playlist ); @@ -737,11 +843,9 @@ 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; + vlc_t *p_vlc = vlc_current_object( i_object ); int i_ret; - p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc; - if( !p_vlc ) { return VLC_ENOOBJ; @@ -791,11 +895,9 @@ 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; + vlc_t *p_vlc = vlc_current_object( i_object ); int i_ret; - p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc; - if( !p_vlc ) { return VLC_ENOOBJ; @@ -809,15 +911,84 @@ int VLC_Get( int i_object, char const *psz_var, vlc_value_t *p_value ) /* FIXME: temporary hacks */ + +/***************************************************************************** + * VLC_IsPlaying: Query for Playlist Status + *****************************************************************************/ +vlc_bool_t VLC_IsPlaying( int i_object ) +{ + + playlist_t * p_playlist; + vlc_bool_t playing; + + vlc_t *p_vlc = vlc_current_object( i_object ); + + /* Check that the handle is valid */ + if( !p_vlc ) + { + return VLC_ENOOBJ; + } + + 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; + } + + playing = playlist_IsPlaying( p_playlist ); + + vlc_object_release( p_playlist ); + + if( i_object ) vlc_object_release( p_vlc ); + + return playing; + +} + + +/***************************************************************************** + * VLC_ClearPlaylist: Query for Playlist Status + * + * return: 0 + *****************************************************************************/ +int VLC_ClearPlaylist( int i_object ) +{ + + playlist_t * p_playlist; + vlc_t *p_vlc = vlc_current_object( i_object ); + + /* Check that the handle is valid */ + if( !p_vlc ) + { + return VLC_ENOOBJ; + } + + 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; + } + + playlist_Clear(p_playlist); + + vlc_object_release( p_playlist ); + + if( i_object ) vlc_object_release( p_vlc ); + return 0; +} + + /***************************************************************************** * VLC_Play: play *****************************************************************************/ int VLC_Play( int i_object ) { playlist_t * p_playlist; - vlc_t *p_vlc; - - p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc; + vlc_t *p_vlc = vlc_current_object( i_object ); /* Check that the handle is valid */ if( !p_vlc ) @@ -859,9 +1030,7 @@ int VLC_Stop( int i_object ) playlist_t * p_playlist; vout_thread_t * p_vout; aout_instance_t * p_aout; - vlc_t *p_vlc; - - p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc; + vlc_t *p_vlc = vlc_current_object( i_object ); /* Check that the handle is valid */ if( !p_vlc ) @@ -873,6 +1042,7 @@ int VLC_Stop( int i_object ) * Ask the interfaces to stop and destroy them */ msg_Dbg( p_vlc, "removing all interfaces" ); + while( (p_intf = vlc_object_find( p_vlc, VLC_OBJECT_INTF, FIND_CHILD )) ) { intf_StopThread( p_intf ); @@ -884,6 +1054,7 @@ int VLC_Stop( int i_object ) /* * Free playlists */ + msg_Dbg( p_vlc, "removing all playlists" ); while( (p_playlist = vlc_object_find( p_vlc, VLC_OBJECT_PLAYLIST, FIND_CHILD )) ) @@ -892,7 +1063,7 @@ int VLC_Stop( int i_object ) vlc_object_release( p_playlist ); playlist_Destroy( p_playlist ); } - + /* * Free video outputs */ @@ -925,9 +1096,7 @@ int VLC_Stop( int i_object ) int VLC_Pause( int i_object ) { input_thread_t *p_input; - vlc_t *p_vlc; - - p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc; + vlc_t *p_vlc = vlc_current_object( i_object ); if( !p_vlc ) { @@ -955,9 +1124,7 @@ int VLC_Pause( int i_object ) int VLC_FullScreen( int i_object ) { vout_thread_t *p_vout; - vlc_t *p_vlc; - - p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc; + vlc_t *p_vlc = vlc_current_object( i_object ); if( !p_vlc ) { @@ -998,20 +1165,6 @@ static void SetLanguage ( char const *psz_lang ) char psz_tmp[1024]; #endif -# if defined( HAVE_INCLUDED_GETTEXT ) && !defined( HAVE_LC_MESSAGES ) - if( *psz_lang ) - { - /* We set LC_ALL manually because it is the only way to set - * 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 ); - } -# endif - if( psz_lang && !*psz_lang ) { # if defined( HAVE_LC_MESSAGES ) @@ -1019,23 +1172,25 @@ static void SetLanguage ( char const *psz_lang ) # endif setlocale( LC_CTYPE, psz_lang ); } - else + else if( psz_lang ) { -#ifdef SYS_BEOS - static char psz_lcall[20]; -#endif - setlocale( LC_ALL, psz_lang ); #ifdef SYS_DARWIN /* I need that under Darwin, please check it doesn't disturb * other platforms. --Meuuh */ setenv( "LANG", psz_lang, 1 ); -#endif -#ifdef SYS_BEOS - /* I need this under BeOS... */ + +#elif defined( SYS_BEOS ) || defined( WIN32 ) + /* We set LC_ALL manually because it is the only way to set + * 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 ); #endif + + setlocale( LC_ALL, psz_lang ); } /* Specify where to find the locales for current domain */ @@ -1055,8 +1210,10 @@ static void SetLanguage ( char const *psz_lang ) /* Set the default domain */ textdomain( PACKAGE ); -#ifdef SYS_BEOS +#if defined( SYS_BEOS ) || defined ( SYS_DARWIN ) || \ + ( defined( WIN32 ) && !defined( HAVE_INCLUDED_GETTEXT ) ) /* BeOS only support UTF8 strings */ + /* Mac OS X prefers UTF8 */ bind_textdomain_codeset( PACKAGE, "UTF-8" ); #endif @@ -1066,26 +1223,33 @@ static void SetLanguage ( char const *psz_lang ) /***************************************************************************** * GetFilenames: parse command line options which are not flags ***************************************************************************** - * Parse command line for input files. + * Parse command line for input files as well as their associated options. + * An option always follows its associated input and begins with a ":". *****************************************************************************/ static int GetFilenames( vlc_t *p_vlc, int i_argc, char *ppsz_argv[] ) { - int i_opt; + int i_opt, i_options; - /* We assume that the remaining parameters are filenames */ - for( i_opt = i_argc - 1; i_opt > optind; i_opt-- ) + /* We assume that the remaining parameters are filenames + * and their input options */ + for( i_opt = i_argc - 1; i_opt >= optind; i_opt-- ) { + i_options = 0; + + /* Count the input options */ + while( *ppsz_argv[ i_opt ] == ':' && i_opt > optind ) + { + i_options++; + 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_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 ); + (char const **)( i_options ? &ppsz_argv[i_opt + 1] : + NULL ), i_options, + PLAYLIST_INSERT | (i_opt == optind ? PLAYLIST_GO : 0), + 0 ); } return VLC_SUCCESS; @@ -1172,11 +1336,12 @@ static void Usage( vlc_t *p_this, char const *psz_module_name ) { case CONFIG_HINT_CATEGORY: case CONFIG_HINT_USAGE: - fprintf( stdout, " %s\n", p_item->psz_text ); + fprintf( stdout, "\n %s\n", p_item->psz_text ); break; case CONFIG_ITEM_STRING: case CONFIG_ITEM_FILE: + case CONFIG_ITEM_DIRECTORY: case CONFIG_ITEM_MODULE: /* We could also have "=<" here */ if( !p_item->ppsz_list ) { @@ -1197,6 +1362,7 @@ static void Usage( vlc_t *p_this, char const *psz_module_name ) break; } case CONFIG_ITEM_INTEGER: + case CONFIG_ITEM_KEY: /* FIXME: do something a bit more clever */ psz_bra = " <"; psz_type = _("integer"); psz_ket = ">"; break; case CONFIG_ITEM_FLOAT: @@ -1399,7 +1565,7 @@ static void Version( void ) _("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") ); + "Written by the VideoLAN team; see the AUTHORS file.\n") ); #ifdef WIN32 /* Pause the console because it's destroyed when we exit */ fprintf( stdout, _("\nPress the RETURN key to continue...\n") );