X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finterface%2Fmain.c;h=3c8571cfcd140d9ad2aa97860cf9cf676e4357d8;hb=36c0b1516d274aec95ed0cf13fc2996dc7e53e3b;hp=6ede2858f24b2a7bd64819c28f53e0548ec83c3e;hpb=14047fa106514c9839987c24c925cae340520019;p=vlc diff --git a/src/interface/main.c b/src/interface/main.c index 6ede2858f2..3c8571cfcd 100644 --- a/src/interface/main.c +++ b/src/interface/main.c @@ -4,16 +4,17 @@ * and spawn threads. ***************************************************************************** * Copyright (C) 1998-2001 VideoLAN - * $Id: main.c,v 1.138 2001/12/16 16:18:36 sam Exp $ + * $Id: main.c,v 1.195 2002/05/30 08:17:04 gbazin Exp $ * * Authors: Vincent Seguin * Samuel Hocevar + * Gildas Bazin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -27,12 +28,12 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include "defs.h" - #include /* SIGHUP, SIGINT, SIGKILL */ #include /* sprintf() */ #include /* longjmp, setjmp */ +#include + #ifdef HAVE_GETOPT_LONG # ifdef HAVE_GETOPT_H # include /* getopt() */ @@ -59,22 +60,14 @@ #endif #ifdef HAVE_LOCALE_H -# include +# include #endif #include /* ENOMEM */ #include /* getenv(), strtol(), */ #include /* strerror() */ -#include /* open(), O_WRONLY */ -#include /* S_IREAD */ -#include "common.h" -#include "debug.h" -#include "intf_msg.h" -#include "threads.h" -#include "mtime.h" -#include "tests.h" /* TestCPU() */ -#include "modules.h" +#include "netutils.h" /* network_ChannelJoin */ #include "stream_control.h" #include "input_ext-intf.h" @@ -87,184 +80,430 @@ #include "video.h" #include "video_output.h" -#ifdef SYS_BEOS -# include "beos_specific.h" -#endif - -#ifdef SYS_DARWIN -# include "darwin_specific.h" +/***************************************************************************** + * Configuration options for the main program. Each module will also separatly + * define its own configuration options. + * Look into configuration.h if you need to know more about the following + * macros. + * + *****************************************************************************/ +#define __BUILTIN__ +#define MODULE_NAME main +#include "modules_inner.h" /* for configuration stuff */ + + +#define INTF_TEXT N_("interface module") +#define INTF_LONGTEXT N_( \ + "This option allows you to select the interface used by vlc.\nNote that " \ + "the default behavior is to automatically select the best module " \ + "available.") + +#define WARNING_TEXT N_("warning level (or use -v, -vv, etc...)") +#define WARNING_LONGTEXT N_( \ + "Increasing the warning level will allow you to see more debug messages " \ + "and can sometimes help you to troubleshoot a problem.") + +#define STATS_TEXT N_("output statistics") +#define STATS_LONGTEXT N_( \ + "Enabling the stats mode will flood your log console with various " \ + "statistics messages.") + +#define INTF_PATH_TEXT N_("interface default search path") +#define INTF_PATH_LONGTEXT N_( \ + "This option allows you to set the default path that the interface will " \ + "open when looking for a file.") + +#define AOUT_TEXT N_("audio output module") +#define AOUT_LONGTEXT N_( \ + "This option allows you to select the audio audio output method used by " \ + "vlc.\nNote that the default behavior is to automatically select the " \ + "best method available.") + +#define AUDIO_TEXT N_("enable audio") +#define AUDIO_LONGTEXT N_( \ + "You can completely disable the audio output. In this case the audio " \ + "decoding stage won't be done, and it will also save some " \ + "processing power.") + +#define MONO_TEXT N_("force mono audio") +#define MONO_LONGTEXT N_("This will force a mono audio output") + +#define VOLUME_TEXT N_("audio output volume") +#define VOLUME_LONGTEXT N_( \ + "You can set the default audio output volume here, in a range from 0 to " \ + "1024.") + +#define FORMAT_TEXT N_("audio output format") +#define FORMAT_LONGTEXT N_( \ + "You can force the audio output format here.\n" \ + "0 -> 16 bits signed native endian (default)\n" \ + "1 -> 8 bits unsigned\n" \ + "2 -> 16 bits signed little endian\n" \ + "3 -> 16 bits signed big endian\n" \ + "4 -> 8 bits signed\n" \ + "5 -> 16 bits unsigned little endian\n" \ + "6 -> 16 bits unsigned big endian\n" \ + "7 -> mpeg2 audio (unsupported)\n" \ + "8 -> ac3 pass-through") + +#define RATE_TEXT N_("audio output frequency (Hz)") +#define RATE_LONGTEXT N_( \ + "You can force the audio output frequency here.\nCommon values are " \ + "48000, 44100, 32000, 22050, 16000, 11025, 8000.") + +#define DESYNC_TEXT N_("compensate desynchronization of audio (in ms)") +#define DESYNC_LONGTEXT N_( \ + "This option allows you to delay the audio output. This can be handy if " \ + "you notice a lag between the video and the audio.") + +#define VOUT_TEXT N_("video output module") +#define VOUT_LONGTEXT N_( \ + "This option allows you to select the video output method used by vlc.\n" \ + "Note that the default behavior is to automatically select the best " \ + "method available.") + +#define VIDEO_TEXT N_("enable video") +#define VIDEO_LONGTEXT N_( \ + "You can completely disable the video output. In this case the video " \ + "decoding stage won't be done, and it will also save some " \ + "processing power.") + +#define DISPLAY_TEXT N_("display identifier") +#define DISPLAY_LONGTEXT N_( \ + "This is the local display port that will be used for X11 drawing. " \ + "For instance :0.1.") + +#define WIDTH_TEXT N_("video width") +#define WIDTH_LONGTEXT N_( \ + "You can enforce the video width here.\nNote that by default vlc will " \ + "adapt to the video characteristics.") + +#define HEIGHT_TEXT N_("video height") +#define HEIGHT_LONGTEXT N_( \ + "You can enforce the video height here.\nNote that by default vlc will " \ + "adapt to the video characteristics.") + +#define ZOOM_TEXT N_("zoom video") +#define ZOOM_LONGTEXT N_( \ + "You can zoom the video by the specified factor.") + +#define GRAYSCALE_TEXT N_("grayscale video output") +#define GRAYSCALE_LONGTEXT N_( \ + "When enabled, the color information from the video won't be decoded " \ + "(this can also allow you to save some processing power).") + +#define FULLSCREEN_TEXT N_("fullscreen video output") +#define FULLSCREEN_LONGTEXT N_( \ + "If this option is enabled, vlc will always start a video in fullscreen " \ + "mode.") + +#define OVERLAY_TEXT N_("overlay video output") +#define OVERLAY_LONGTEXT N_( \ + "If enabled, vlc will try to take advantage of the overlay capabilities " \ + "of you graphics card.") + +#define SPUMARGIN_TEXT N_("force SPU position") +#define SPUMARGIN_LONGTEXT N_( \ + "You can use this option to place the sub-titles under the movie, " \ + "instead of over the movie. Try several positions.") + +#define FILTER_TEXT N_("video filter module") +#define FILTER_LONGTEXT N_( \ + "This will allow you to add a post-processing filter to enhance the " \ + "picture quality, for instance deinterlacing, or to clone or distort " \ + "the video window.") + +#define SERVER_PORT_TEXT N_("server port") +#define SERVER_PORT_LONGTEXT N_( \ + "This is the port used for UDP streams. By default, we chose 1234.") + +#define NETCHANNEL_TEXT N_("enable network channel mode") +#define NETCHANNEL_LONGTEXT N_( \ + "Activate this option if you want to use the VideoLAN Channel Server.") + +#define CHAN_SERV_TEXT N_("channel server address") +#define CHAN_SERV_LONGTEXT N_( \ + "Indicate here the address of the VideoLAN Channel Server.") + +#define CHAN_PORT_TEXT N_("channel server port") +#define CHAN_PORT_LONGTEXT N_( \ + "Indicate here the port on which the VideoLAN Channel Server runs.") + +#define IFACE_TEXT N_("network interface") +#define IFACE_LONGTEXT N_( \ + "If you have several interfaces on your Linux machine and use the " \ + "VLAN solution, you may indicate here which interface to use.") + +#define INPUT_PROGRAM_TEXT N_("choose program (SID)") +#define INPUT_PROGRAM_LONGTEXT N_( \ + "Choose the program to select by giving its Service ID.") + +#define INPUT_AUDIO_TEXT N_("choose audio") +#define INPUT_AUDIO_LONGTEXT N_( \ + "Give the default type of audio you want to use in a DVD.") + +#define INPUT_CHAN_TEXT N_("choose channel") +#define INPUT_CHAN_LONGTEXT N_( \ + "Give the stream number of the audio channel you want to use in a DVD " \ + "(from 1 to n).") + +#define INPUT_SUBT_TEXT N_("choose subtitles") +#define INPUT_SUBT_LONGTEXT N_( \ + "Give the stream number of the subtitle channel you want to use in a DVD "\ + "(from 1 to n).") + +#define DVD_DEV_TEXT N_("DVD device") +#define DVD_DEV_LONGTEXT N_( \ + "This is the default DVD device to use.") + +#define VCD_DEV_TEXT N_("VCD device") +#define VCD_DEV_LONGTEXT N_( \ + "This is the default VCD device to use.") + +#define IPV6_TEXT N_("force IPv6") +#define IPV6_LONGTEXT N_( \ + "If you check this box, IPv6 will be used by default for all UDP and " \ + "HTTP connections.") + +#define IPV4_TEXT N_("force IPv4") +#define IPV4_LONGTEXT N_( \ + "If you check this box, IPv4 will be used by default for all UDP and " \ + "HTTP connections.") + +#define ADEC_MPEG_TEXT N_("choose MPEG audio decoder") +#define ADEC_MPEG_LONGTEXT N_( \ + "This allows you to select the MPEG audio decoder you want to use. " \ + "Common choices are builtin and mad.") + +#define ADEC_AC3_TEXT N_("choose AC3 audio decoder") +#define ADEC_AC3_LONGTEXT N_( \ + "This allows you to select the AC3/A52 audio decoder you want to use. " \ + "Common choices are builtin and a52.") + +#define MMX_TEXT N_("enable CPU MMX support") +#define MMX_LONGTEXT N_( \ + "If your processor supports the MMX instructions set, vlc can take " \ + "advantage of them.") + +#define THREE_DN_TEXT N_("enable CPU 3D Now! support") +#define THREE_DN_LONGTEXT N_( \ + "If your processor supports the 3D Now! instructions set, vlc can take "\ + "advantage of them.") + +#define MMXEXT_TEXT N_("enable CPU MMX EXT support") +#define MMXEXT_LONGTEXT N_( \ + "If your processor supports the MMX EXT instructions set, vlc can take "\ + "advantage of them.") + +#define SSE_TEXT N_("enable CPU SSE support") +#define SSE_LONGTEXT N_( \ + "If your processor supports the SSE instructions set, vlc can take " \ + "can take advantage of them.") + +#define ALTIVEC_TEXT N_("enable CPU AltiVec support") +#define ALTIVEC_LONGTEXT N_( \ + "If your processor supports the AltiVec instructions set, vlc can take "\ + "advantage of them.") + +#define PL_LAUNCH_TEXT N_("launch playlist on startup") +#define PL_LAUNCH_LONGTEXT N_( \ + "If you want vlc to start playing on startup, then enable this option.") + +#define PL_ENQUEUE_TEXT N_("enqueue items in playlist") +#define PL_ENQUEUE_LONGTEXT N_( \ + "If you want vlc to add items to the playlist as you open them, then " \ + "enable this option.") + +#define PL_LOOP_TEXT N_("loop playlist on end") +#define PL_LOOP_LONGTEXT N_( \ + "If you want vlc to keep playing the playlist indefinitely then enable " \ + "this option.") + +#define MEMCPY_TEXT N_("memory copy module") +#define MEMCPY_LONGTEXT N_( \ + "You can select wich memory copy module you want to use. By default vlc " \ + "will select the fastest one supported by your hardware.") + +#define ACCESS_TEXT N_("access module") +#define ACCESS_LONGTEXT N_( \ + "This is a legacy entry to let you configure access modules") + +#define DEMUX_TEXT N_("demux module") +#define DEMUX_LONGTEXT N_( \ + "This is a legacy entry to let you configure demux modules") + +#define FAST_PTHREAD_TEXT N_("fast pthread on NT/2K/XP (developpers only)") +#define FAST_PTHREAD_LONGTEXT N_( \ + "On Windows NT/2K/XP we use a slow but correct pthread implementation, " \ + "you can also use this faster implementation but you might experience " \ + "problems with it.") + +/* + * Quick usage guide for the configuration options: + * + * MODULE_CONFIG_START + * MODULE_CONFIG_STOP + * ADD_CATEGORY_HINT( N_(text), longtext ) + * ADD_SUBCATEGORY_HINT( N_(text), longtext ) + * ADD_STRING( option_name, value, p_callback, N_(text), N_(longtext) ) + * ADD_FILE( option_name, psz_value, p_callback, N_(text), N_(longtext) ) + * ADD_MODULE( option_name, psz_value, i_capability, p_callback, + * N_(text), N_(longtext) ) + * ADD_INTEGER( option_name, i_value, p_callback, N_(text), N_(longtext) ) + * ADD_BOOL( option_name, b_value, p_callback, N_(text), N_(longtext) ) + */ + +MODULE_CONFIG_START + +/* Interface options */ +ADD_CATEGORY_HINT( N_("Interface"), NULL) +ADD_MODULE_WITH_SHORT ( "intf", 'I', MODULE_CAPABILITY_INTF, NULL, NULL, INTF_TEXT, INTF_LONGTEXT ) +ADD_INTEGER ( "warning", 0, NULL, WARNING_TEXT, WARNING_LONGTEXT ) +ADD_BOOL ( "stats", 0, NULL, STATS_TEXT, STATS_LONGTEXT ) +ADD_STRING ( "search-path", NULL, NULL, INTF_PATH_TEXT, INTF_PATH_LONGTEXT ) + +/* Audio options */ +ADD_CATEGORY_HINT( N_("Audio"), NULL) +ADD_MODULE_WITH_SHORT ( "aout", 'A', MODULE_CAPABILITY_AOUT, NULL, NULL, AOUT_TEXT, AOUT_LONGTEXT ) +ADD_BOOL ( "audio", 1, NULL, AUDIO_TEXT, AUDIO_LONGTEXT ) +ADD_BOOL ( "mono", 0, NULL, MONO_TEXT, MONO_LONGTEXT ) +ADD_INTEGER ( "volume", VOLUME_DEFAULT, NULL, VOLUME_TEXT, VOLUME_LONGTEXT ) +ADD_INTEGER ( "rate", 44100, NULL, RATE_TEXT, RATE_LONGTEXT ) +ADD_INTEGER ( "desync", 0, NULL, DESYNC_TEXT, DESYNC_LONGTEXT ) +ADD_INTEGER ( "audio-format", 0, NULL, FORMAT_TEXT, FORMAT_LONGTEXT ) + +/* Video options */ +ADD_CATEGORY_HINT( N_("Video"), NULL ) +ADD_MODULE_WITH_SHORT ( "vout", 'V', MODULE_CAPABILITY_VOUT, NULL, NULL, VOUT_TEXT, VOUT_LONGTEXT ) +ADD_BOOL ( "video", 1, NULL, VIDEO_TEXT, VIDEO_LONGTEXT ) +ADD_INTEGER ( "width", -1, NULL, WIDTH_TEXT, WIDTH_LONGTEXT ) +ADD_INTEGER ( "height", -1, NULL, HEIGHT_TEXT, HEIGHT_LONGTEXT ) +ADD_FLOAT ( "zoom", 1, NULL, ZOOM_TEXT, ZOOM_LONGTEXT ) +ADD_BOOL ( "grayscale", 0, NULL, GRAYSCALE_TEXT, GRAYSCALE_LONGTEXT ) +ADD_BOOL ( "fullscreen", 0, NULL, FULLSCREEN_TEXT, FULLSCREEN_LONGTEXT ) +ADD_BOOL ( "overlay", 1, NULL, OVERLAY_TEXT, OVERLAY_LONGTEXT ) +ADD_INTEGER ( "spumargin", -1, NULL, SPUMARGIN_TEXT, SPUMARGIN_LONGTEXT ) +ADD_MODULE ( "filter", MODULE_CAPABILITY_VOUT, NULL, NULL, FILTER_TEXT, FILTER_LONGTEXT ) + +/* Input options */ +ADD_CATEGORY_HINT( N_("Input"), NULL ) +ADD_INTEGER ( "server-port", 1234, NULL, SERVER_PORT_TEXT, SERVER_PORT_LONGTEXT ) +ADD_BOOL ( "network-channel", 0, NULL, NETCHANNEL_TEXT, NETCHANNEL_LONGTEXT ) +ADD_STRING ( "channel-server", "localhost", NULL, CHAN_SERV_TEXT, CHAN_SERV_LONGTEXT ) +ADD_INTEGER ( "channel-port", 6010, NULL, CHAN_PORT_TEXT, CHAN_PORT_LONGTEXT ) +ADD_STRING ( "iface", "eth0", NULL, IFACE_TEXT, IFACE_LONGTEXT ) + +ADD_INTEGER ( "program", 0, NULL, INPUT_PROGRAM_TEXT, INPUT_PROGRAM_LONGTEXT ) +ADD_INTEGER ( "audio-type", -1, NULL, INPUT_AUDIO_TEXT, INPUT_AUDIO_LONGTEXT ) +ADD_INTEGER ( "audio-channel", -1, NULL, INPUT_CHAN_TEXT, INPUT_CHAN_LONGTEXT ) +ADD_INTEGER ( "spu-channel", -1, NULL, INPUT_SUBT_TEXT, INPUT_SUBT_LONGTEXT ) + +ADD_STRING ( "dvd", DVD_DEVICE, NULL, DVD_DEV_TEXT, DVD_DEV_LONGTEXT ) +ADD_STRING ( "vcd", VCD_DEVICE, NULL, VCD_DEV_TEXT, VCD_DEV_LONGTEXT ) + +ADD_BOOL_WITH_SHORT ( "ipv6", '6', 0, NULL, IPV6_TEXT, IPV6_LONGTEXT ) +ADD_BOOL_WITH_SHORT ( "ipv4", '4', 0, NULL, IPV4_TEXT, IPV4_LONGTEXT ) + +/* Decoder options */ +ADD_CATEGORY_HINT( N_("Decoders"), NULL ) +ADD_MODULE ( "mpeg-adec", MODULE_CAPABILITY_DECODER, NULL, NULL, ADEC_MPEG_TEXT, ADEC_MPEG_LONGTEXT ) +ADD_MODULE ( "ac3-adec", MODULE_CAPABILITY_DECODER, NULL, NULL, ADEC_AC3_TEXT, ADEC_AC3_LONGTEXT ) + +/* CPU options */ +ADD_CATEGORY_HINT( N_("CPU"), NULL ) +ADD_BOOL ( "mmx", 1, NULL, MMX_TEXT, MMX_LONGTEXT ) +ADD_BOOL ( "3dn", 1, NULL, THREE_DN_TEXT, THREE_DN_LONGTEXT ) +ADD_BOOL ( "mmxext", 1, NULL, MMXEXT_TEXT, MMXEXT_LONGTEXT ) +ADD_BOOL ( "sse", 1, NULL, SSE_TEXT, SSE_LONGTEXT ) +ADD_BOOL ( "altivec", 1, NULL, ALTIVEC_TEXT, ALTIVEC_LONGTEXT ) + +/* Playlist options */ +ADD_CATEGORY_HINT( N_("Playlist"), NULL ) +ADD_BOOL ( "launch-playlist", 0, NULL, PL_LAUNCH_TEXT, PL_LAUNCH_LONGTEXT ) +ADD_BOOL ( "enqueue-playlist", 0, NULL, PL_ENQUEUE_TEXT, PL_ENQUEUE_LONGTEXT ) +ADD_BOOL ( "loop-playlist", 0, NULL, PL_LOOP_TEXT, PL_LOOP_LONGTEXT ) + +/* Misc options */ +ADD_CATEGORY_HINT( N_("Miscellaneous"), NULL ) +ADD_MODULE ( "memcpy", MODULE_CAPABILITY_MEMCPY, NULL, NULL, MEMCPY_TEXT, MEMCPY_LONGTEXT ) +ADD_MODULE ( "access", MODULE_CAPABILITY_ACCESS, NULL, NULL, ACCESS_TEXT, ACCESS_LONGTEXT ) +ADD_MODULE ( "demux", MODULE_CAPABILITY_DEMUX, NULL, NULL, DEMUX_TEXT, DEMUX_LONGTEXT ) + +#if defined(WIN32) +ADD_BOOL ( "fast_pthread", 0, NULL, FAST_PTHREAD_TEXT, FAST_PTHREAD_LONGTEXT ) #endif -#ifdef WIN32 -# include "win32_specific.h" -#endif +MODULE_CONFIG_STOP -#include "netutils.h" /* network_ChannelJoin */ +MODULE_INIT_START + SET_DESCRIPTION( N_("main program") ) + ADD_CAPABILITY( MAIN, 100/*whatever*/ ) +MODULE_INIT_STOP -/***************************************************************************** - * Command line options constants. If something is changed here, be sure that - * GetConfiguration and Usage are also changed. - *****************************************************************************/ +MODULE_ACTIVATE_START +MODULE_ACTIVATE_STOP -/* Long options return values - note that values corresponding to short options - * chars, and in general any regular char, should be avoided */ -#define OPT_NOAUDIO 150 -#define OPT_STEREO 151 -#define OPT_MONO 152 -#define OPT_SPDIF 153 -#define OPT_VOLUME 154 -#define OPT_DESYNC 155 - -#define OPT_NOVIDEO 160 -#define OPT_DISPLAY 161 -#define OPT_WIDTH 162 -#define OPT_HEIGHT 163 -#define OPT_COLOR 164 -#define OPT_FULLSCREEN 165 -#define OPT_OVERLAY 166 -#define OPT_XVADAPTOR 167 -#define OPT_SMP 168 -#define OPT_FILTER 169 - -#define OPT_CHANNELS 170 -#define OPT_SERVER 171 -#define OPT_PORT 172 -#define OPT_BROADCAST 173 -#define OPT_CHANNELSERVER 174 - -#define OPT_INPUT 180 -#define OPT_MOTION 181 -#define OPT_IDCT 182 -#define OPT_YUV 183 -#define OPT_DOWNMIX 184 -#define OPT_IMDCT 185 -#define OPT_MEMCPY 186 -#define OPT_DVDCSS_METHOD 187 -#define OPT_DVDCSS_VERBOSE 188 - -#define OPT_SYNCHRO 190 -#define OPT_WARNING 191 -#define OPT_VERSION 192 -#define OPT_STDOUT 193 -#define OPT_STATS 194 - -#define OPT_MPEG_ADEC 200 - -/* Usage fashion */ -#define USAGE 0 -#define SHORT_HELP 1 -#define LONG_HELP 2 - -/* Needed for x86 CPU capabilities detection */ -#define cpuid( a ) \ - asm volatile ( "cpuid" \ - : "=a" ( i_eax ), \ - "=b" ( i_ebx ), \ - "=c" ( i_ecx ), \ - "=d" ( i_edx ) \ - : "a" ( a ) \ - : "cc" ); +MODULE_DEACTIVATE_START +MODULE_DEACTIVATE_STOP -/* Long options */ -static const struct option longopts[] = +/* Hack for help options */ +static module_t help_module; +static module_config_t p_help_config[] = { - /* name, has_arg, flag, val */ - - /* General/common options */ - { "help", 0, 0, 'h' }, - { "longhelp", 0, 0, 'H' }, - { "version", 0, 0, OPT_VERSION }, - - /* Interface options */ - { "intf", 1, 0, 'I' }, - { "warning", 1, 0, OPT_WARNING }, - { "stdout", 1, 0, OPT_STDOUT }, - { "stats", 0, 0, OPT_STATS }, - - /* Audio options */ - { "noaudio", 0, 0, OPT_NOAUDIO }, - { "aout", 1, 0, 'A' }, - { "stereo", 0, 0, OPT_STEREO }, - { "mono", 0, 0, OPT_MONO }, - { "spdif", 0, 0, OPT_SPDIF }, - { "downmix", 1, 0, OPT_DOWNMIX }, - { "imdct", 1, 0, OPT_IMDCT }, - { "volume", 1, 0, OPT_VOLUME }, - { "desync", 1, 0, OPT_DESYNC }, - - /* Video options */ - { "novideo", 0, 0, OPT_NOVIDEO }, - { "vout", 1, 0, 'V' }, - { "display", 1, 0, OPT_DISPLAY }, - { "width", 1, 0, OPT_WIDTH }, - { "height", 1, 0, OPT_HEIGHT }, - { "grayscale", 0, 0, 'g' }, - { "color", 0, 0, OPT_COLOR }, - { "motion", 1, 0, OPT_MOTION }, - { "idct", 1, 0, OPT_IDCT }, - { "yuv", 1, 0, OPT_YUV }, - { "fullscreen", 0, 0, OPT_FULLSCREEN }, - { "overlay", 0, 0, OPT_OVERLAY }, - { "xvadaptor", 1, 0, OPT_XVADAPTOR }, - { "smp", 1, 0, OPT_SMP }, - { "filter", 1, 0, OPT_FILTER }, - - /* DVD options */ - { "dvdtitle", 1, 0, 't' }, - { "dvdchapter", 1, 0, 'T' }, - { "dvdangle", 1, 0, 'u' }, - { "dvdaudio", 1, 0, 'a' }, - { "dvdchannel", 1, 0, 'c' }, - { "dvdsubtitle", 1, 0, 's' }, - { "dvdcss-method", 1, 0, OPT_DVDCSS_METHOD }, - { "dvdcss-verbose", 1, 0, OPT_DVDCSS_VERBOSE }, - - /* Input options */ - { "input", 1, 0, OPT_INPUT }, - { "channels", 0, 0, OPT_CHANNELS }, - { "channelserver", 1, 0, OPT_CHANNELSERVER }, - - /* Misc options */ - { "synchro", 1, 0, OPT_SYNCHRO }, - { "memcpy", 1, 0, OPT_MEMCPY }, - - /* Decoder options */ - { "mpeg_adec", 1, 0, OPT_MPEG_ADEC }, - - { 0, 0, 0, 0 } + { MODULE_CONFIG_ITEM_BOOL, "help", 'h', N_("print help"), + NULL, NULL, 0, 0, NULL, NULL, 0 }, + { MODULE_CONFIG_ITEM_BOOL, "longhelp", 'H', N_("print detailed help"), + NULL, NULL, 0, 0, NULL, NULL, 0 }, + { MODULE_CONFIG_ITEM_BOOL, "list", 'l', N_("print a list of available " + "modules"), NULL, NULL, 0, 0, NULL, NULL, 0 }, + { MODULE_CONFIG_ITEM_STRING, "module", 'p', N_("print help on module"), + NULL, NULL, 0, 0, NULL, &help_module.config_lock, 0 }, + { MODULE_CONFIG_ITEM_BOOL, "version", '\0', + N_("print version information"), NULL, NULL, 0, 0, NULL, NULL, 0 }, + { MODULE_CONFIG_HINT_END, NULL, '\0', NULL, NULL, NULL, 0, 0, + NULL, NULL, 0 } +}; +static module_t help_module = { "help", "help module", NULL, {NULL}, 0, {0}, 0, + NULL, p_help_config, {0}, + sizeof(p_help_config)/sizeof(module_config_t), + sizeof(p_help_config)/sizeof(module_config_t) }; -/* Short options */ -static const char *psz_shortopts = "hHvgt:T:u:a:s:c:I:A:V:"; + +/***************************************************************************** + * End configuration. + *****************************************************************************/ /***************************************************************************** * Global variables - these are the only ones, see main.h and modules.h *****************************************************************************/ main_t *p_main; module_bank_t *p_module_bank; +input_bank_t *p_input_bank; aout_bank_t *p_aout_bank; vout_bank_t *p_vout_bank; /***************************************************************************** * Local prototypes *****************************************************************************/ -static int GetConfiguration ( int *pi_argc, char *ppsz_argv[], - char *ppsz_env[] ); -static int GetFilenames ( int i_argc, char *ppsz_argv[] ); -static void Usage ( int i_fashion ); -static void Version ( void ); +static int GetFilenames ( int i_argc, char *ppsz_argv[] ); +static void Usage ( const char *psz_module_name ); +static void ListModules ( void ); +static void Version ( void ); -static void InitSignalHandler ( void ); -static void SimpleSignalHandler ( int i_signal ); -static void FatalSignalHandler ( int i_signal ); -static void InstructionSignalHandler( int i_signal ); -static int CPUCapabilities ( void ); +static void InitSignalHandler ( void ); +static void SimpleSignalHandler ( int i_signal ); +static void FatalSignalHandler ( int i_signal ); +static void IllegalSignalHandler ( int i_signal ); +static u32 CPUCapabilities ( void ); -static int RedirectSTDOUT ( void ); -static void ShowConsole ( void ); +#ifdef WIN32 +static void ShowConsole ( void ); +#endif static jmp_buf env; -static int i_illegal; +static int i_illegal; +static char *psz_capability; /***************************************************************************** * main: parse command line, start interface and spawn threads @@ -280,24 +519,32 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] ) { main_t main_data; /* root of all data - see main.h */ module_bank_t module_bank; + input_bank_t input_bank; aout_bank_t aout_bank; vout_bank_t vout_bank; + char *psz_module; + char *p_tmp; p_main = &main_data; /* set up the global variables */ p_module_bank = &module_bank; + p_input_bank = &input_bank; p_aout_bank = &aout_bank; p_vout_bank = &vout_bank; -#ifdef ENABLE_NLS - /* - * Support for getext + p_main->i_warning_level = 0; + + /* + * Support for gettext */ -#if defined( HAVE_LOCALE_H ) && defined( HAVE_LC_MESSAGES ) +#if defined( ENABLE_NLS ) && defined ( HAVE_GETTEXT ) +# if defined( HAVE_LOCALE_H ) && defined( HAVE_LC_MESSAGES ) if( !setlocale( LC_MESSAGES, "" ) ) { - fprintf( stderr, "warning: unsupported locale.\n" ); + fprintf( stderr, "warning: unsupported locale settings\n" ); } -#endif + + setlocale( LC_CTYPE, "" ); +# endif if( !bindtextdomain( PACKAGE, LOCALEDIR ) ) { @@ -307,17 +554,17 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] ) textdomain( PACKAGE ); #endif - + /* * Initialize threads system */ - vlc_threads_init( ); + vlc_threads_init(); /* - * Test if our code is likely to run on this CPU + * Test if our code is likely to run on this CPU */ p_main->i_cpu_capabilities = CPUCapabilities(); - + /* * System specific initialization code */ @@ -327,41 +574,170 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] ) #elif defined( SYS_LINUX ) # ifdef DEBUG /* Activate malloc checking routines to detect heap corruptions. */ - main_PutIntVariable( "MALLOC_CHECK_", 2 ); + putenv( "MALLOC_CHECK_=2" ); + putenv( "GNOME_DISABLE_CRASH_DIALOG=1" ); # endif #endif /* * Initialize messages interface */ - p_main->p_msg = intf_MsgCreate(); - if( !p_main->p_msg ) /* start messages interface */ + intf_MsgCreate(); + + intf_Msg( COPYRIGHT_MESSAGE "\n" ); + + + /* Get the executable name (similar to the basename command) */ + if( i_argc > 0 ) { - fprintf( stderr, "error: can't initialize messages interface (%s)\n", - strerror(errno) ); + p_main->psz_arg0 = p_tmp = ppsz_argv[ 0 ]; + while( *p_tmp ) + { + if( *p_tmp == '/' ) p_main->psz_arg0 = ++p_tmp; + else ++p_tmp; + } + } + else + { + p_main->psz_arg0 = "vlc"; + } + + /* + * Initialize the module bank and 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(); + module_LoadMain(); + + /* Hack: insert the help module here */ + vlc_mutex_init( &help_module.config_lock ); + help_module.next = p_module_bank->first; + p_module_bank->first = &help_module; + /* end hack */ + + if( config_LoadCmdLine( &i_argc, ppsz_argv, 1 ) ) + { + intf_MsgDestroy(); return( errno ); } - intf_MsgImm( COPYRIGHT_MESSAGE "\n" ); + /* Check for short help option */ + if( config_GetIntVariable( "help" ) ) + { + intf_Msg( _("Usage: %s [options] [parameters] [file]...\n"), + p_main->psz_arg0 ); + + Usage( "help" ); + Usage( "main" ); + return( -1 ); + } + + /* Check for version option */ + if( config_GetIntVariable( "version" ) ) + { + Version(); + return( -1 ); + } + + /* Hack: remove the help module here */ + p_module_bank->first = help_module.next; + /* end hack */ + + /* + * Load the builtins and plugins into the module_bank. + * We have to do it before config_Load*() because this also gets the + * list of configuration options exported by each module and loads their + * default values. + */ + module_LoadBuiltins(); + module_LoadPlugins(); + intf_WarnMsg( 2, "module: module bank initialized, found %i modules", + p_module_bank->i_count ); + + /* Hack: insert the help module here */ + help_module.next = p_module_bank->first; + p_module_bank->first = &help_module; + /* end hack */ + + /* Check for help on modules */ + if( (p_tmp = config_GetPszVariable( "module" )) ) + { + Usage( p_tmp ); + free( p_tmp ); + return( -1 ); + } + + /* Check for long help option */ + if( config_GetIntVariable( "longhelp" ) ) + { + Usage( NULL ); + return( -1 ); + } + + /* Check for module list option */ + if( config_GetIntVariable( "list" ) ) + { + ListModules(); + return( -1 ); + } + + /* Hack: remove the help module here */ + p_module_bank->first = help_module.next; + /* end hack */ + + + /* + * Override default configuration with config file settings + */ + vlc_mutex_init( &p_main->config_lock ); + p_main->psz_homedir = config_GetHomeDir(); + config_LoadConfigFile( NULL ); /* - * Read configuration + * Override configuration with command line settings */ - if( GetConfiguration( &i_argc, ppsz_argv, ppsz_env ) ) /* parse cmd line */ + if( config_LoadCmdLine( &i_argc, ppsz_argv, 0 ) ) { +#ifdef WIN32 + ShowConsole(); + /* Pause the console because it's destroyed when we exit */ + intf_Msg( "The command line options couldn't be loaded, check that " + "they are valid.\nPress the RETURN key to continue..." ); + getchar(); +#endif intf_MsgDestroy(); return( errno ); } + /* - * Redirect the standard output if required by the user, and on Win32 we - * also open a console to display the debug messages. + * System specific configuration */ - RedirectSTDOUT(); + system_Configure(); + + /* p_main inititalization. FIXME ? */ + p_main->i_warning_level = config_GetIntVariable( "warning" ); + p_main->i_desync = config_GetIntVariable( "desync" ) * (mtime_t)1000; + p_main->b_stats = config_GetIntVariable( "stats" ); + p_main->b_audio = config_GetIntVariable( "audio" ); + p_main->b_stereo= !config_GetIntVariable( "mono" ); + p_main->b_video = config_GetIntVariable( "video" ); + if( !config_GetIntVariable( "mmx" ) ) + p_main->i_cpu_capabilities &= ~CPU_CAPABILITY_MMX; + if( !config_GetIntVariable( "3dn" ) ) + p_main->i_cpu_capabilities &= ~CPU_CAPABILITY_3DNOW; + if( !config_GetIntVariable( "mmxext" ) ) + p_main->i_cpu_capabilities &= ~CPU_CAPABILITY_MMXEXT; + if( !config_GetIntVariable( "sse" ) ) + p_main->i_cpu_capabilities &= ~CPU_CAPABILITY_SSE; + if( !config_GetIntVariable( "altivec" ) ) + p_main->i_cpu_capabilities &= ~CPU_CAPABILITY_ALTIVEC; + if( p_main->b_stats ) { - char p_capabilities[200]; + char p_capabilities[200]; p_capabilities[0] = '\0'; #define PRINT_CAPABILITY( capability, string ) \ @@ -380,7 +756,8 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] ) PRINT_CAPABILITY( CPU_CAPABILITY_MMXEXT, "MMXEXT" ); PRINT_CAPABILITY( CPU_CAPABILITY_SSE, "SSE" ); PRINT_CAPABILITY( CPU_CAPABILITY_ALTIVEC, "Altivec" ); - intf_StatMsg("info: CPU has capabilities %s", p_capabilities ); + PRINT_CAPABILITY( CPU_CAPABILITY_FPU, "FPU" ); + intf_StatMsg( "info: CPU has capabilities : %s", p_capabilities ); } /* @@ -401,41 +778,41 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] ) GetFilenames( i_argc, ppsz_argv ); /* - * Initialize module, aout and vout banks + * Initialize input, aout and vout banks */ - module_InitBank(); + input_InitBank(); aout_InitBank(); vout_InitBank(); /* * Choose the best memcpy module */ - p_main->p_memcpy_module = module_Need( MODULE_CAPABILITY_MEMCPY, NULL ); - - if( p_main->p_memcpy_module != NULL ) + psz_module = config_GetPszVariable( "memcpy" ); + p_main->p_memcpy_module = module_Need( MODULE_CAPABILITY_MEMCPY, + psz_module, NULL ); + if( psz_module ) free( psz_module ); + if( p_main->p_memcpy_module == NULL ) { -#define f p_main->p_memcpy_module->p_functions->memcpy.functions.memcpy - p_main->fast_memcpy = f.fast_memcpy; -#undef f + intf_ErrMsg( "intf error: no suitable memcpy module, " + "using libc default" ); + p_main->pf_memcpy = memcpy; } else { - intf_ErrMsg( "intf error: no suitable memcpy module, " - "using libc default" ); - p_main->fast_memcpy = memcpy; + p_main->pf_memcpy = p_main->p_memcpy_module->p_functions + ->memcpy.functions.memcpy.pf_memcpy; } /* * Initialize shared resources and libraries */ - if( main_GetIntVariable( INPUT_NETWORK_CHANNEL_VAR, - INPUT_NETWORK_CHANNEL_DEFAULT ) && + if( config_GetIntVariable( "network-channel" ) && network_ChannelCreate() ) { /* On error during Channels initialization, switch off channels */ - intf_Msg( "Channels initialization failed : " - "Channel management is deactivated" ); - main_PutIntVariable( INPUT_NETWORK_CHANNEL_VAR, 0 ); + intf_ErrMsg( "intf error: channels initialization failed, " + "deactivating channels" ); + config_PutIntVariable( "network-channel", 0 ); } /* @@ -466,45 +843,48 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] ) /* * Go back into channel 0 which is the network */ - if( main_GetIntVariable( INPUT_NETWORK_CHANNEL_VAR, - INPUT_NETWORK_CHANNEL_DEFAULT ) ) + if( config_GetIntVariable( "network-channel" ) && p_main->p_channel ) { network_ChannelJoin( COMMON_CHANNEL ); } } /* - * Free memcpy module + * Free input, aout and vout banks + */ + input_EndBank(); + vout_EndBank(); + aout_EndBank(); + + /* + * Free playlist + */ + intf_PlaylistDestroy( p_main->p_playlist ); + + /* + * Free allocated memory */ if( p_main->p_memcpy_module != NULL ) { module_Unneed( p_main->p_memcpy_module ); } - /* - * Free module, aout and vout banks - */ - vout_EndBank(); - aout_EndBank(); - module_EndBank(); + free( p_main->psz_homedir ); /* - * Free playlist + * Free module bank */ - intf_PlaylistDestroy( p_main->p_playlist ); + module_EndBank(); /* * System specific cleaning code */ -#if defined( SYS_BEOS ) || defined( SYS_DARWIN ) || defined( WIN32 ) system_End(); -#endif - /* * Terminate messages interface and program */ - intf_Msg( "intf: program terminated" ); + intf_WarnMsg( 1, "intf: program terminated" ); intf_MsgDestroy(); /* @@ -515,545 +895,230 @@ int main( int i_argc, char *ppsz_argv[], char *ppsz_env[] ) return 0; } -/***************************************************************************** - * main_GetIntVariable: get the int value of an environment variable - ***************************************************************************** - * This function is used to read some default parameters in modules. - *****************************************************************************/ -int main_GetIntVariable( char *psz_name, int i_default ) -{ - char * psz_env; /* environment value */ - char * psz_end; /* end of parsing index */ - long int i_value; /* value */ - psz_env = getenv( psz_name ); - if( psz_env ) - { - i_value = strtol( psz_env, &psz_end, 0 ); - if( (*psz_env != '\0') && (*psz_end == '\0') ) - { - return( i_value ); - } - } - return( i_default ); -} +/* following functions are local */ /***************************************************************************** - * main_GetPszVariable: get the string value of an environment variable + * GetFilenames: parse command line options which are not flags ***************************************************************************** - * This function is used to read some default parameters in modules. + * Parse command line for input files. *****************************************************************************/ -char * main_GetPszVariable( char *psz_name, char *psz_default ) +static int GetFilenames( int i_argc, char *ppsz_argv[] ) { - char *psz_env; + int i_opt; - psz_env = getenv( psz_name ); - if( psz_env ) + /* We assume that the remaining parameters are filenames */ + for( i_opt = optind; i_opt < i_argc; i_opt++ ) { - return( psz_env ); + intf_PlaylistAdd( p_main->p_playlist, PLAYLIST_END, + ppsz_argv[ i_opt ] ); } - return( psz_default ); -} -/***************************************************************************** - * main_PutPszVariable: set the string value of an environment variable - ***************************************************************************** - * This function is used to set some default parameters in modules. The use of - * this function will cause some memory leak: since some systems use the pointer - * passed to putenv to store the environment string, it can't be freed. - *****************************************************************************/ -void main_PutPszVariable( char *psz_name, char *psz_value ) -{ - char *psz_env; - - psz_env = malloc( strlen(psz_name) + strlen(psz_value) + 2 ); - if( psz_env == NULL ) - { - intf_ErrMsg( "intf error: cannot create psz_env (%s)", - strerror(ENOMEM) ); - } - else - { - sprintf( psz_env, "%s=%s", psz_name, psz_value ); - if( putenv( psz_env ) ) - { - intf_ErrMsg( "intf error: cannot putenv (%s)", strerror(errno) ); - } - } + return( 0 ); } /***************************************************************************** - * main_PutIntVariable: set the integer value of an environment variable + * Usage: print program usage ***************************************************************************** - * This function is used to set some default parameters in modules. The use of - * this function will cause some memory leak: since some systems use the pointer - * passed to putenv to store the environment string, it can't be freed. + * Print a short inline help. Message interface is initialized at this stage. *****************************************************************************/ -void main_PutIntVariable( char *psz_name, int i_value ) +static void Usage( const char *psz_module_name ) { - char psz_value[ 256 ]; /* buffer for value */ +#define FORMAT_STRING " --%s%s%s%s%s%s %s%s" + /* option name prefix ------' | | | | | | | + * option name ---------------' | | | | | | + * ----------------------------' | | | + * padding spaces --------------------' | | + * comment ------------------------------' | + * comment suffix -------------------------' + * + * The purpose of having bra and ket is that we might i18n them as well. + */ +#define LINE_START 8 +#define PADDING_SPACES 25 + module_t *p_module; + module_config_t *p_item; + char psz_spaces[PADDING_SPACES+LINE_START+1]; + char psz_format[sizeof(FORMAT_STRING)]; - sprintf( psz_value, "%d", i_value ); - main_PutPszVariable( psz_name, psz_value ); -} + memset( psz_spaces, ' ', PADDING_SPACES+LINE_START ); + psz_spaces[PADDING_SPACES+LINE_START] = '\0'; -/* following functions are local */ + strcpy( psz_format, FORMAT_STRING ); -/***************************************************************************** - * GetConfiguration: parse command line - ***************************************************************************** - * Parse command line and configuration file for configuration. If the inline - * help is requested, the function Usage() is called and the function returns - * -1 (causing main() to exit). The messages interface is initialized at this - * stage, but most structures are not allocated, so only environment should - * be used. - *****************************************************************************/ -static int GetConfiguration( int *pi_argc, char *ppsz_argv[], char *ppsz_env[] ) -{ - int i_cmd; - char *p_tmp; +#ifdef WIN32 + ShowConsole(); +#endif - /* Set default configuration and copy arguments */ - p_main->i_argc = *pi_argc; - p_main->ppsz_argv = ppsz_argv; - p_main->ppsz_env = ppsz_env; + /* Enumerate the config for each module */ + for( p_module = p_module_bank->first ; + p_module != NULL ; + p_module = p_module->next ) + { + boolean_t b_help_module = !strcmp( "help", p_module->psz_name ); - p_main->b_audio = 1; - p_main->b_video = 1; + if( psz_module_name && strcmp( psz_module_name, p_module->psz_name ) ) + continue; - p_main->i_warning_level = 0; - p_main->b_stats = 0; - p_main->i_desync = 0; /* No desynchronization by default */ + /* ignore modules without config options */ + if( !p_module->i_config_items ) continue; - p_main->p_channel = NULL; + /* print module name */ + intf_Msg( _("%s module options:\n"), p_module->psz_name ); - /* Get the executable name (similar to the basename command) */ - p_main->psz_arg0 = p_tmp = ppsz_argv[ 0 ]; - while( *p_tmp ) - { - if( *p_tmp == '/' ) - { - p_main->psz_arg0 = ++p_tmp; - } - else + for( p_item = p_module->p_config; + p_item->i_type != MODULE_CONFIG_HINT_END; + p_item++ ) { - ++p_tmp; - } - } + char *psz_bra = NULL, *psz_type = NULL, *psz_ket = NULL; + char *psz_suf = ""; + int i; -#ifdef SYS_DARWIN - /* When vlc.app is run by double clicking in Mac OS X, the 2nd arg - * is the PSN - process serial number (a unique PID-ish thingie) - * still ok for real Darwin & when run from command line */ - if ( (*pi_argc > 1) && (strncmp( ppsz_argv[ 1 ] , "-psn" , 4 ) == 0) ) - /* for example -psn_0_9306113 */ - { - /* GDMF!... I can't do this or else the MacOSX window server will - * not pick up the PSN and not register the app and we crash... - * hence the following kludge otherwise we'll get confused w/ argv[1] - * being an input file name */ -#if 0 - ppsz_argv[ 1 ] = NULL; -#endif - *pi_argc = *pi_argc - 1; - pi_argc--; - return( 0 ); - } -#endif - - /* Parse command line options */ - opterr = 0; - while( ( i_cmd = getopt_long( *pi_argc, ppsz_argv, - psz_shortopts, longopts, 0 ) ) != EOF ) - { - switch( i_cmd ) - { - /* General/common options */ - case 'h': /* -h, --help */ - ShowConsole(); - RedirectSTDOUT(); - Usage( SHORT_HELP ); -#ifdef WIN32 /* Pause the console because it's destroyed when we exit */ - if( strcmp( "", main_GetPszVariable( INTF_STDOUT_VAR, - INTF_STDOUT_DEFAULT ) ) == 0 ) + switch( p_item->i_type ) { - /* No stdout redirection has been asked for */ - intf_MsgImm( "\nPress the RETURN key to continue..." ); - getchar(); + case MODULE_CONFIG_HINT_CATEGORY: + intf_Msg( " %s", p_item->psz_text ); + break; + + case MODULE_CONFIG_ITEM_STRING: + case MODULE_CONFIG_ITEM_FILE: + case MODULE_CONFIG_ITEM_MODULE: /* We could also have "=<" here */ + psz_bra = " <"; psz_type = _("string"); psz_ket = ">"; + break; + case MODULE_CONFIG_ITEM_INTEGER: + psz_bra = " <"; psz_type = _("integer"); psz_ket = ">"; + break; + case MODULE_CONFIG_ITEM_FLOAT: + psz_bra = " <"; psz_type = _("float"); psz_ket = ">"; + break; + case MODULE_CONFIG_ITEM_BOOL: + psz_bra = ""; psz_type = ""; psz_ket = ""; + if( !b_help_module ) + psz_suf = p_item->i_value ? _(" (default: enabled)") : + _(" (default: disabled)"); + break; } -#endif - return( -1 ); - break; - case 'H': /* -H, --longhelp */ - ShowConsole(); - RedirectSTDOUT(); - Usage( LONG_HELP ); -#ifdef WIN32 /* Pause the console because it's destroyed when we exit */ - if( strcmp( "", main_GetPszVariable( INTF_STDOUT_VAR, - INTF_STDOUT_DEFAULT ) ) == 0 ) + + /* Add short option */ + if( p_item->i_short ) { - /* No stdout redirection has been asked for */ - intf_MsgImm( "\nPress the RETURN key to continue..." ); - getchar(); + psz_format[2] = '-'; + psz_format[3] = p_item->i_short; + psz_format[4] = ','; } -#endif - return( -1 ); - break; - case OPT_VERSION: /* --version */ - ShowConsole(); - RedirectSTDOUT(); - Version(); -#ifdef WIN32 /* Pause the console because it's destroyed when we exit */ - if( strcmp( "", main_GetPszVariable( INTF_STDOUT_VAR, - INTF_STDOUT_DEFAULT ) ) == 0 ) + else { - /* No stdout redirection has been asked for */ - intf_MsgImm( "\nPress the RETURN key to continue..." ); - getchar(); + psz_format[2] = ' '; + psz_format[3] = ' '; + psz_format[4] = ' '; } -#endif - return( -1 ); - break; - case 'v': /* -v, --verbose */ - p_main->i_warning_level++; - break; - - /* Interface warning messages level */ - case 'I': /* -I, --intf */ - main_PutPszVariable( INTF_METHOD_VAR, optarg ); - break; - case OPT_WARNING: /* --warning */ - intf_ErrMsg( "intf error: `--warning' is deprecated, use `-v'" ); - p_main->i_warning_level = atoi(optarg); - break; - - case OPT_STDOUT: /* --stdout */ - main_PutPszVariable( INTF_STDOUT_VAR, optarg ); - break; - - case OPT_STATS: - p_main->b_stats = 1; - break; - - /* Audio options */ - case OPT_NOAUDIO: /* --noaudio */ - p_main->b_audio = 0; - break; - case 'A': /* -A, --aout */ - main_PutPszVariable( AOUT_METHOD_VAR, optarg ); - break; - case OPT_STEREO: /* --stereo */ - main_PutIntVariable( AOUT_STEREO_VAR, 1 ); - break; - case OPT_MONO: /* --mono */ - main_PutIntVariable( AOUT_STEREO_VAR, 0 ); - break; - case OPT_SPDIF: /* --spdif */ - main_PutIntVariable( AOUT_SPDIF_VAR, 1 ); - break; - case OPT_DOWNMIX: /* --downmix */ - main_PutPszVariable( DOWNMIX_METHOD_VAR, optarg ); - break; - case OPT_IMDCT: /* --imdct */ - main_PutPszVariable( IMDCT_METHOD_VAR, optarg ); - break; - case OPT_VOLUME: /* --volume */ - main_PutIntVariable( AOUT_VOLUME_VAR, atoi(optarg) ); - break; - case OPT_DESYNC: /* --desync */ - p_main->i_desync = atoi(optarg); - break; - - /* Video options */ - case OPT_NOVIDEO: /* --novideo */ - p_main->b_video = 0; - break; - case 'V': /* -V, --vout */ - main_PutPszVariable( VOUT_METHOD_VAR, optarg ); - break; - case OPT_DISPLAY: /* --display */ - main_PutPszVariable( VOUT_DISPLAY_VAR, optarg ); - break; - case OPT_WIDTH: /* --width */ - main_PutPszVariable( VOUT_WIDTH_VAR, optarg ); - break; - case OPT_HEIGHT: /* --height */ - main_PutPszVariable( VOUT_HEIGHT_VAR, optarg ); - break; - case 'g': /* -g, --grayscale */ - main_PutIntVariable( VOUT_GRAYSCALE_VAR, 1 ); - break; - case OPT_COLOR: /* --color */ - main_PutIntVariable( VOUT_GRAYSCALE_VAR, 0 ); - break; - case OPT_FULLSCREEN: /* --fullscreen */ - main_PutIntVariable( VOUT_FULLSCREEN_VAR, 1 ); - break; - case OPT_OVERLAY: /* --overlay */ - main_PutIntVariable( VOUT_OVERLAY_VAR, 1 ); - break; - case OPT_XVADAPTOR: /* --xvadaptor */ - main_PutIntVariable( VOUT_XVADAPTOR_VAR, atoi(optarg) ); - break; - case OPT_MOTION: /* --motion */ - main_PutPszVariable( MOTION_METHOD_VAR, optarg ); - break; - case OPT_IDCT: /* --idct */ - main_PutPszVariable( IDCT_METHOD_VAR, optarg ); - break; - case OPT_YUV: /* --yuv */ - main_PutPszVariable( YUV_METHOD_VAR, optarg ); - break; - case OPT_SMP: /* --smp */ - main_PutIntVariable( VDEC_SMP_VAR, atoi(optarg) ); - break; - case OPT_FILTER: /* --filter */ - main_PutPszVariable( VOUT_FILTER_VAR, optarg ); - break; - - /* DVD options */ - case 't': /* --dvdtitle */ - main_PutIntVariable( INPUT_TITLE_VAR, atoi(optarg) ); - break; - case 'T': /* --dvdchapter */ - main_PutIntVariable( INPUT_CHAPTER_VAR, atoi(optarg) ); - break; - case 'u': /* --dvdangle */ - main_PutIntVariable( INPUT_ANGLE_VAR, atoi(optarg) ); - break; - case 'a': /* --dvdaudio */ - if ( ! strcmp(optarg, "ac3") ) - main_PutIntVariable( INPUT_AUDIO_VAR, REQUESTED_AC3 ); - else if ( ! strcmp(optarg, "lpcm") ) - main_PutIntVariable( INPUT_AUDIO_VAR, REQUESTED_LPCM ); - else if ( ! strcmp(optarg, "mpeg") ) - main_PutIntVariable( INPUT_AUDIO_VAR, REQUESTED_MPEG ); - else - main_PutIntVariable( INPUT_AUDIO_VAR, REQUESTED_NOAUDIO ); - break; - case 'c': /* --dvdchannel */ - main_PutIntVariable( INPUT_CHANNEL_VAR, atoi(optarg) ); - break; - case 's': /* --dvdsubtitle */ - main_PutIntVariable( INPUT_SUBTITLE_VAR, atoi(optarg) ); - break; - case OPT_DVDCSS_METHOD: /* --dvdcss-method */ - main_PutPszVariable( "DVDCSS_METHOD", optarg ); - break; - case OPT_DVDCSS_VERBOSE: /* --dvdcss-verbose */ - main_PutPszVariable( "DVDCSS_VERBOSE", optarg ); - break; - - /* Input options */ - case OPT_INPUT: /* --input */ - main_PutPszVariable( INPUT_METHOD_VAR, optarg ); - break; - case OPT_CHANNELS: /* --channels */ - main_PutIntVariable( INPUT_NETWORK_CHANNEL_VAR, 1 ); - break; - case OPT_CHANNELSERVER: /* --channelserver */ - main_PutPszVariable( INPUT_CHANNEL_SERVER_VAR, optarg ); - break; - - /* Misc options */ - case OPT_SYNCHRO: - main_PutPszVariable( VPAR_SYNCHRO_VAR, optarg ); - break; - case OPT_MEMCPY: - main_PutPszVariable( MEMCPY_METHOD_VAR, optarg ); - break; - - /* Decoder options */ - case OPT_MPEG_ADEC: - main_PutPszVariable( ADEC_MPEG_VAR, optarg ); - break; - - /* Internal error: unknown option */ - case '?': - default: - ShowConsole(); - RedirectSTDOUT(); - intf_ErrMsg( "intf error: unknown option `%s'", - ppsz_argv[optind] ); - Usage( USAGE ); -#ifdef WIN32 /* Pause the console because it's destroyed when we exit */ - if( strcmp( "", main_GetPszVariable( INTF_STDOUT_VAR, - INTF_STDOUT_DEFAULT ) ) == 0 ) + + if( psz_type ) { - /* No stdout redirection has been asked for */ - intf_MsgImm( "\nPress the RETURN key to continue..." ); - getchar(); + i = PADDING_SPACES - strlen( p_item->psz_name ) + - strlen( psz_bra ) - strlen( psz_type ) + - strlen( psz_ket ) - 1; + if( p_item->i_type == MODULE_CONFIG_ITEM_BOOL && + !b_help_module ) i -= 5; + + if( i < 0 ) + { + i = 0; + psz_spaces[i] = '\n'; + } + else + { + psz_spaces[i] = '\0'; + } + + intf_Msg( psz_format, + ( p_item->i_type == MODULE_CONFIG_ITEM_BOOL && + !b_help_module ) ? "(no-)" : "", + p_item->psz_name, psz_bra, psz_type, psz_ket, + psz_spaces, p_item->psz_text, psz_suf ); + psz_spaces[i] = ' '; } -#endif - return( EINVAL ); - break; } - } - if( p_main->i_warning_level < 0 ) - { - p_main->i_warning_level = 0; + /* Yet another nasty hack. + * Maybe we could use MODULE_CONFIG_ITEM_END to display tail messages + * for each module?? */ + if( !strcmp( "main", p_module->psz_name ) ) + { + intf_Msg( _("\nPlaylist items:" + "\n *.mpg, *.vob plain MPEG-1/2 files" + "\n [dvd:][device][@raw_device][@[title][,[chapter][,angle]]]" + "\n DVD device" + "\n [vcd:][device][@[title][,[chapter]]" + "\n VCD device" + "\n udpstream:[@[][:]]" + "\n UDP stream sent by VLS" + "\n vlc:loop loop execution of the " + "playlist" + "\n vlc:pause pause execution of " + "playlist items" + "\n vlc:quit quit VLC") ); + } + + intf_Msg( "" ); + } - return( 0 ); +#ifdef WIN32 /* Pause the console because it's destroyed when we exit */ + intf_Msg( _("\nPress the RETURN key to continue...") ); + getchar(); +#endif } /***************************************************************************** - * GetFilenames: parse command line options which are not flags + * ListModules: list the available modules with their description ***************************************************************************** - * Parse command line for input files. + * Print a list of all available modules (builtins and plugins) and a short + * description for each one. *****************************************************************************/ -static int GetFilenames( int i_argc, char *ppsz_argv[] ) +static void ListModules( void ) { - int i_opt; + module_t *p_module; + char psz_spaces[22]; - /* We assume that the remaining parameters are filenames */ - for( i_opt = optind; i_opt < i_argc; i_opt++ ) - { - intf_PlaylistAdd( p_main->p_playlist, PLAYLIST_END, - ppsz_argv[ i_opt ] ); - } + memset( psz_spaces, ' ', 22 ); - return( 0 ); -} +#ifdef WIN32 + ShowConsole(); +#endif -/***************************************************************************** - * Usage: print program usage - ***************************************************************************** - * Print a short inline help. Message interface is initialized at this stage. - *****************************************************************************/ -static void Usage( int i_fashion ) -{ /* Usage */ - intf_MsgImm( "Usage: %s [options] [parameters] [file]...", - p_main->psz_arg0 ); + intf_Msg( _("Usage: %s [options] [parameters] [file]...\n"), + p_main->psz_arg0 ); + + intf_Msg( _("[module] [description]") ); - if( i_fashion == USAGE ) + /* Enumerate each module */ + for( p_module = p_module_bank->first ; + p_module != NULL ; + p_module = p_module->next ) { - intf_MsgImm( "Try `%s --help' for more information.", - p_main->psz_arg0 ); - return; - } + int i; - /* Options */ - intf_MsgImm( "\nOptions:" - "\n -I, --intf \tinterface method" - "\n -v, --verbose \tverbose mode (cumulative)" - "\n --stdout \tredirect console stdout" - "\n --memcpy \tmemcpy method" - "\n" - "\n --noaudio \tdisable audio" - "\n -A, --aout \taudio output method" - "\n --stereo, --mono \tstereo/mono audio" - "\n --spdif \tAC3 pass-through mode" - "\n --downmix \tAC3 downmix method" - "\n --imdct \tAC3 IMDCT method" - "\n --volume [0..1024] \tVLC output volume" - "\n --desync