diff options
Diffstat (limited to 'config.c')
-rw-r--r-- | config.c | 323 |
1 files changed, 323 insertions, 0 deletions
diff --git a/config.c b/config.c new file mode 100644 index 00000000..5cee08fc --- /dev/null +++ b/config.c @@ -0,0 +1,323 @@ +/* + * config.c: User settings + * + * See the main source file 'xineliboutput.c' for copyright information and + * how to reach the author. + * + * $Id: config.c,v 1.1 2006-06-03 10:01:17 phintuka Exp $ + * + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <getopt.h> + +#include <vdr/config.h> + +#include "config.h" + +#define DEFAULT_DEINTERLACE_OPTS "method=Linear,cheap_mode=1,pulldown=0,use_progressive_frame_flag=1" + +const char *config_t::s_bufferSize[] = + {"custom","tiny","small","medium","large","huge",NULL}; +const int config_t::i_pesBufferSize[] = + {0,50,250,500,1000,2000,500}; +const char *config_t::s_aspects[] = + {"automatic", "default", "4:3", "16:9", "Pan&Scan", "CenterCutOut", 0}; +const char *config_t::s_deinterlaceMethods[] = + {"none", "bob", "weave", "greedy", "onefield", "onefield_xv", + "linearblend", "tvtime", 0}; +const char *config_t::s_deinterlaceMethodNames[] = + {"off", "Bob", "Weave", "Greedy", "One Field", "One Field XV", + "Linear Blend", "TvTime", NULL}; +const char *config_t::s_decoderPriority[] = + {"low", "normal", "high", 0}; +const char *config_t::s_fieldOrder[] = + {"normal", "inverted", NULL}; +const char *config_t::s_audioDriverNames[] = + {"automatic","Alsa","OSS","no audio","Arts","ESound",NULL}; +const char *config_t::s_audioDrivers[] = + {"auto","alsa","oss","none","arts","esound",NULL}; +const char *config_t::s_videoDriverNamesX11[] = + {"automatic","XShm","Xv","XvMC","XvMC+VLD","no video",NULL}; +const char *config_t::s_videoDriversX11[] = + {"auto","X11","xv","xvmc","xxmc","none",NULL}; +const char *config_t::s_videoDriverNamesFB[] = + {"automatic","Framebuffer","DirectFB","No Video",NULL}; +const char *config_t::s_videoDriversFB[] = + {"auto","fb","DirectFB","none",NULL}; +const char *config_t::s_frontendNames[] = + {"X11 (sxfe)", "Framebuffer (fbfe)", "Off", NULL}; +const char *config_t::s_frontends[] = + {"sxfe", "fbfe", "", NULL}; +const char *config_t::s_frontend_files[] = + {"lib" PLUGIN_NAME_I18N "-sxfe.so." XINELIBOUTPUT_VERSION, + "lib" PLUGIN_NAME_I18N "-fbfe.so." XINELIBOUTPUT_VERSION, + // example: xineliboutput-sxfe.so.0.4.0 + "", + NULL}; + +const char *config_t::s_audioEqNames[] = + {"30 Hz", "60 Hz", "125 Hz", "250 Hz", "500 Hz", + "1 kHz", "2 kHz", "4 kHz", "8 kHz", "16 kHz", NULL}; +const char *config_t::s_audioVisualizationNames[] = + {"Off", "Goom", "Oscilloscope", "FFT Scope", "FFT Graph", NULL}; +const char *config_t::s_audioVisualizations[] = + {"none", "goom", "oscope", "fftscope", "fftgraph", NULL}; + +static char *strcatrealloc(char *dest, const char *src) +{ + if (!src || !*src) + return dest; + + int l = (dest ? strlen(dest) : 0) + strlen(src) + 1; + if(dest) { + dest = (char *)realloc(dest, l); + strcat(dest, src); + } else { + dest = (char*)malloc(l); + strcpy(dest, src); + } + return dest; +} + +config_t::config_t() { + memset(this, 0, sizeof(config_t)); + + strcpy(local_frontend, s_frontends[FRONTEND_X11]); + strcpy(video_driver , s_videoDriversX11[X11_DRIVER_XV]); + strcpy(video_port , "127.0.0.1:0.0"); + strcpy(modeline , ""); + + strcpy(audio_driver , s_audioDrivers[AUDIO_DRIVER_ALSA]); + strcpy(audio_port , "default"); + + post_plugins = NULL; + + audio_delay = 0; + audio_compression = 0; + memset(audio_equalizer,0,sizeof(audio_equalizer)); + strcpy(audio_visualization, "goom"); + //strcpy(audio_vis_goom_opts, "fps:25,width:720,height:576"); + headphone = 0; + audio_upmix = 0; + audio_surround = 0; + + inactivity_timer = 0; + decoder_priority = DECODER_PRIORITY_NORMAL; + pes_buffers = i_pesBufferSize[PES_BUFFERS_SMALL_250]; + strcpy(deinterlace_method, s_deinterlaceMethods[DEINTERLACE_NONE]); + strcpy(deinterlace_opts, DEFAULT_DEINTERLACE_OPTS); + display_aspect = 0; /* auto */ + + hide_main_menu = 0; + prescale_osd = 1; + prescale_osd_downscale = 0; + unscaled_osd = 0; + unscaled_osd_opaque = 0; + unscaled_osd_lowresvideo = 1; + + alpha_correction = 0; + alpha_correction_abs = 0; + + fullscreen = 0; + modeswitch = 1; + width = 720; + height = 576; + scale_video = 0; + field_order = 0; + autocrop = 0; + + remote_mode = 0; + listen_port = LISTEN_PORT; + use_remote_keyboard = 1; + remote_usetcp = 1; + remote_useudp = 1; + remote_usertp = 1; + remote_usepipe = 1; + remote_usebcast = 1; + + strcpy(remote_rtp_addr, "224.0.1.9"); + remote_rtp_port = LISTEN_PORT; + remote_rtp_ttl = 1; + remote_rtp_always_on = 0; + + use_x_keyboard = 1; + + hue = -1; + saturation = -1; + contrast = -1; + brightness = -1; + + strcpy(browse_files_dir, "/video"); + strcpy(browse_images_dir, "/video"); + + main_menu_mode = ShowMenu; + force_primary_device = 0; + + m_ProcessedArgs = NULL; +}; + +bool config_t::ProcessArg(const char *Name, const char *Value) +{ + char *s = m_ProcessedArgs; + m_ProcessedArgs = NULL; + if(SetupParse(Name, Value)) { + m_ProcessedArgs = s ? s : strcpy(new char[4096], " "); + strcat(strcat(m_ProcessedArgs, Name), " "); + return true; + } + m_ProcessedArgs = s; + return false; +} + +char *m_ProcessedArgs; + +bool config_t::ProcessArgs(int argc, char *argv[]) +{ + static struct option long_options[] = { + { "display", required_argument, NULL, 'd' }, + { "fullscreen", no_argument, NULL, 'f' }, + { "xkeyboard", no_argument, NULL, 'k' }, + //{ "noxkeyboard",no_argument, NULL, 'K' }, + { "local", required_argument, NULL, 'l' }, + { "nolocal", no_argument, NULL, 'L' }, + { "modeline", required_argument, NULL, 'm' }, + { "remote", required_argument, NULL, 'r' }, + { "noremote", no_argument, NULL, 'R' }, + { "window", no_argument, NULL, 'w' }, + { "video", required_argument, NULL, 'V' }, + { "audio", required_argument, NULL, 'A' }, + { "post", required_argument, NULL, 'P' }, + { "primary", no_argument, NULL, 'p' }, + { NULL } + }; + + int c; + while ((c = getopt_long(argc, argv, "d:fkKl:Lm:r:RW", long_options, NULL)) != -1) { + switch (c) { + case 'd': ProcessArg("Video.Port", optarg); + break; + case 'f': ProcessArg("Fullscreen", "1"); + break; + case 'k': ProcessArg("X11.UseKeyboard", "1"); + break; + //case 'K': ProcessArg("X11.UseKeyboard", "0"); + //break; + case 'l': ProcessArg("Frontend", optarg); + break; + case 'L': ProcessArg("Frontend", "none"); + break; + case 'm': ProcessArg("Modeline", optarg); + break; + case 'r': ProcessArg("Remote.ListenPort", optarg); + ProcessArg("RemoteMode", "1"); + break; + case 'R': ProcessArg("RemoteMode", "0"); + break; + case 'w': ProcessArg("Fullscreen", "0"); + break; + case 'V': ProcessArg("Video.Driver", optarg); + break; + case 'A': ProcessArg("Audio.Driver", optarg); + break; + case 'P': if(post_plugins) + post_plugins = strcatrealloc(post_plugins, ";"); + post_plugins = strcatrealloc(post_plugins, optarg); + break; + case 'p': ProcessArg("ForcePrimaryDevice", "1"); + break; + default: return false; + } + } + return true; +} + +bool config_t::SetupParse(const char *Name, const char *Value) +{ + char *pt; + if(m_ProcessedArgs && NULL != (pt=strstr(m_ProcessedArgs+1, Name)) && + *(pt-1) == ' ' && *(pt+strlen(Name)) == ' ') + return true; + + if (!strcasecmp(Name, "Frontend")) strcpy(local_frontend, Value); + else if (!strcasecmp(Name, "Modeline")) strcpy(modeline, Value); + else if (!strcasecmp(Name, "VideoModeSwitching")) modeswitch = atoi(Value); + else if (!strcasecmp(Name, "Fullscreen")) fullscreen = atoi(Value); + else if (!strcasecmp(Name, "DisplayAspect")) display_aspect = strstra(Value, s_aspects, 0); + else if (!strcasecmp(Name, "ForcePrimaryDevice")) force_primary_device = atoi(Value); + + else if (!strcasecmp(Name, "X11.WindowWidth")) width = atoi(Value); + else if (!strcasecmp(Name, "X11.WindowHeight")) height = atoi(Value); + else if (!strcasecmp(Name, "X11.UseKeyboard")) use_x_keyboard = atoi(Value); + + else if (!strcasecmp(Name, "Audio.Driver")) strcpy(audio_driver, Value); + else if (!strcasecmp(Name, "Audio.Port")) strcpy(audio_port, Value); + else if (!strcasecmp(Name, "Audio.Delay")) audio_delay = atoi(Value); + else if (!strcasecmp(Name, "Audio.Compression")) audio_compression = atoi(Value); + else if (!strcasecmp(Name, "Audio.Visualization")) strcpy(audio_visualization, Value); + else if (!strcasecmp(Name, "Audio.Surround")) audio_surround = atoi(Value); + else if (!strcasecmp(Name, "Audio.Upmix")) audio_upmix = atoi(Value); + else if (!strcasecmp(Name, "Audio.Headphone")) headphone = atoi(Value); + + else if (!strcasecmp(Name, "OSD.HideMainMenu")) hide_main_menu = atoi(Value); + else if (!strcasecmp(Name, "OSD.Prescale")) prescale_osd = atoi(Value); + else if (!strcasecmp(Name, "OSD.Downscale")) prescale_osd_downscale = atoi(Value); + else if (!strcasecmp(Name, "OSD.UnscaledAlways")) unscaled_osd = atoi(Value); + else if (!strcasecmp(Name, "OSD.UnscaledOpaque")) unscaled_osd_opaque = atoi(Value); + else if (!strcasecmp(Name, "OSD.UnscaledLowRes")) unscaled_osd_lowresvideo = atoi(Value); + + else if (!strcasecmp(Name, "OSD.AlphaCorrection")) alpha_correction = atoi(Value); + else if (!strcasecmp(Name, "OSD.AlphaCorrectionAbs")) alpha_correction_abs = atoi(Value); + + else if (!strcasecmp(Name, "RemoteMode")) remote_mode = atoi(Value); + else if (!strcasecmp(Name, "Remote.ListenPort")) listen_port = atoi(Value); + else if (!strcasecmp(Name, "Remote.Keyboard")) use_remote_keyboard = atoi(Value); + else if (!strcasecmp(Name, "Remote.UseTcp")) remote_usetcp = atoi(Value); + else if (!strcasecmp(Name, "Remote.UseUdp")) remote_useudp = atoi(Value); + else if (!strcasecmp(Name, "Remote.UseRtp")) remote_usertp = atoi(Value); + else if (!strcasecmp(Name, "Remote.UsePipe")) remote_usepipe= atoi(Value); + else if (!strcasecmp(Name, "Remote.UseBroadcast")) remote_usebcast = atoi(Value); + + else if (!strcasecmp(Name, "Remote.Rtp.Address")) strncpy(remote_rtp_addr, Value, 20); + else if (!strcasecmp(Name, "Remote.Rtp.Port")) remote_rtp_port = atoi(Value); + else if (!strcasecmp(Name, "Remote.Rtp.TTL")) remote_rtp_ttl = atoi(Value); + else if (!strcasecmp(Name, "Remote.Rtp.AlwaysOn")) remote_rtp_always_on = atoi(Value); + + else if (!strcasecmp(Name, "Decoder.InactivityTimer")) inactivity_timer=atoi(Value); + else if (!strcasecmp(Name, "Decoder.Priority")) decoder_priority=strstra(Value,s_decoderPriority,1); + else if (!strcasecmp(Name, "Decoder.PesBuffers")) pes_buffers=atoi(Value); + + else if (!strcasecmp(Name, "Video.Driver")) strcpy(video_driver, Value); + else if (!strcasecmp(Name, "Video.Port")) strcpy(video_port, Value); + else if (!strcasecmp(Name, "Video.Scale")) scale_video = atoi(Value); + else if (!strcasecmp(Name, "Video.DeinterlaceOptions")) strcpy(deinterlace_opts, Value); + else if (!strcasecmp(Name, "Video.Deinterlace")) strcpy(deinterlace_method, Value); + else if (!strcasecmp(Name, "Video.FieldOrder")) field_order=atoi(Value)?1:0; + else if (!strcasecmp(Name, "Video.AutoCrop")) autocrop = atoi(Value); + else if (!strcasecmp(Name, "Video.HUE")) hue = atoi(Value); + else if (!strcasecmp(Name, "Video.Saturation")) saturation = atoi(Value); + else if (!strcasecmp(Name, "Video.Contrast")) contrast = atoi(Value); + else if (!strcasecmp(Name, "Video.Brightness")) brightness = atoi(Value); + + else if (!strcasecmp(Name, "BrowseFilesDir")) strcpy(browse_files_dir, Value); + else if (!strcasecmp(Name, "BrowseImagesDir")) strcpy(browse_images_dir, Value); + + else if (!strcasecmp(Name, "Audio.Equalizer")) + sscanf(Value,"%d %d %d %d %d %d %d %d %d %d", + audio_equalizer ,audio_equalizer+1, + audio_equalizer+2,audio_equalizer+3, + audio_equalizer+4,audio_equalizer+5, + audio_equalizer+6,audio_equalizer+7, + audio_equalizer+8,audio_equalizer+9); + + else return false; + + return true; +} + +/* Global instance */ +config_t xc; + + |