summaryrefslogtreecommitdiff
path: root/setup_menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'setup_menu.c')
-rw-r--r--setup_menu.c1119
1 files changed, 1119 insertions, 0 deletions
diff --git a/setup_menu.c b/setup_menu.c
new file mode 100644
index 00000000..baabdad2
--- /dev/null
+++ b/setup_menu.c
@@ -0,0 +1,1119 @@
+/*
+ * setup_menu.c: Setup Menu
+ *
+ * See the main source file 'xineliboutput.c' for copyright information and
+ * how to reach the author.
+ *
+ * $Id: setup_menu.c,v 1.1 2006-06-03 10:01:17 phintuka Exp $
+ *
+ */
+
+#include <vdr/config.h>
+#include <vdr/i18n.h>
+#include <vdr/plugin.h>
+
+#include "setup_menu.h"
+#include "device.h"
+#include "menuitems.h"
+#include "config.h"
+
+namespace XinelibOutputSetupMenu {
+
+//#define INTEGER_CONFIG_VIDEO_CONTROLS
+//#define LINEAR_VIDEO_CONTROLS
+
+//--- Setup Menu -------------------------------------------------------------
+
+const char *ModeLineChars =
+ " 0123456789+-hvsync.";
+const char *DriverNameChars =
+ " abcdefghijklmnopqrstuvwxyz0123456789-.,#~:;";
+const char *OptionsChars =
+ "=.,abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+
+const char *controls[] =
+ { "Off",
+ "[|---------------]","[|---------------]",
+ "[-|--------------]","[-|--------------]",
+ "[--|-------------]","[--|-------------]",
+ "[---|------------]","[---|------------]",
+ "[----|-----------]","[----|-----------]",
+ "[-----|----------]","[-----|----------]",
+ "[------|---------]","[------|---------]",
+ "[-------|--------]","[-------|--------]",
+ "[--------|-------]","[--------|-------]",
+ "[---------|------]","[---------|------]",
+ "[----------|-----]","[----------|-----]",
+ "[-----------|----]","[-----------|----]",
+ "[------------|---]","[------------|---]",
+ "[-------------|--]","[-------------|--]",
+ "[--------------|-]","[--------------|-]",
+ "[---------------|]","[---------------|]",
+ NULL
+ };
+
+#ifdef LINEAR_VIDEO_CONTROLS
+# define CONTROL_TO_INDEX(val) ((val)>=0 ? ((val)>>11)+1 : 0)
+# define INDEX_TO_CONTROL(ind) ((ind)==0 ? -1 : ((ind)-1)<<11)
+#else
+const int ind2ctrl_tbl[33] = {
+ -1, 0, 0x0001, 0x0002, 0x0003, 0x0004, 0x0007, 0x000a,
+ 0x000f, 0x0014, 0x001f, 42, 0x003f, 80, 0x007f, 170,
+ 0x00ff, 336, 0x01ff, 682, 0x03ff, 1630, 0x07ff, 2730,
+ 0x0fff, 5726, 0x1fff, 10858, 0x3fff, 22110, 0x7fff, 43224,
+ 0xffff };
+static int CONTROL_TO_INDEX(int val)
+{
+ for(int i=0; i<33;i++)
+ if(val<=ind2ctrl_tbl[i])
+ return i;
+ return 32;
+}
+static int INDEX_TO_CONTROL(int ind)
+{
+ if(ind<0) ind=0;
+ if(ind>32) ind=32;
+ return ind2ctrl_tbl[ind];
+}
+#endif
+
+static cOsdItem *NewTitle(const char *s)
+{
+ char str[128];
+ cOsdItem *tmp;
+ sprintf(str,"----- %s -----", tr(s));
+ tmp = new cOsdItem(str);
+ tmp->SetSelectable(false);
+ return tmp;
+}
+
+//--- cMenuSetupAudio --------------------------------------------------------
+
+class cMenuSetupAudio : public cMenuSetupPage
+{
+ private:
+ config_t newconfig;
+ int audio_driver;
+ int visualization;
+
+ cOsdItem *audio_driver_item;
+ cOsdItem *audio_ctrl_delay;
+ cOsdItem *audio_ctrl_compression;
+ cOsdItem *audio_ctrl_upmix;
+ cOsdItem *audio_ctrl_surround;
+ cOsdItem *audio_ctrl_headphone;
+ cMenuEditItem *audio_port_item;
+
+ protected:
+ virtual void Store(void);
+ void Set(void);
+
+ public:
+ cMenuSetupAudio(void);
+ ~cMenuSetupAudio(void);
+
+ virtual eOSState ProcessKey(eKeys Key);
+};
+
+cMenuSetupAudio::cMenuSetupAudio(void)
+{
+ memcpy(&newconfig, &xc, sizeof(config_t));
+ audio_driver = strstra(xc.audio_driver,
+ xc.s_audioDrivers,
+ 0);
+ visualization = strstra(xc.audio_visualization,
+ xc.s_audioVisualizations,
+ 0);
+ Set();
+}
+
+cMenuSetupAudio::~cMenuSetupAudio(void)
+{
+ cXinelibDevice::Instance().ConfigurePostprocessing(
+ xc.deinterlace_method, xc.audio_delay, xc.audio_compression,
+ xc.audio_equalizer, xc.audio_surround);
+#ifdef ENABLE_TEST_POSTPLUGINS
+ cXinelibDevice::Instance().ConfigurePostprocessing(
+ "upmix", xc.audio_upmix ? true : false, NULL);
+ cXinelibDevice::Instance().ConfigurePostprocessing(
+ "headphone", xc.headphone ? true : false, NULL);
+#endif
+}
+
+void cMenuSetupAudio::Set(void)
+{
+ SetPlugin(cPluginManager::GetPlugin(PLUGIN_NAME_I18N));
+ int current = Current();
+ Clear();
+
+ Add(NewTitle("Audio"));
+ Add(audio_driver_item =
+ new cMenuEditStraI18nItem(tr("Driver"), &audio_driver,
+ AUDIO_DRIVER_count, xc.s_audioDriverNames));
+ if(audio_driver != AUDIO_DRIVER_AUTO && audio_driver != AUDIO_DRIVER_NONE)
+ Add(audio_port_item =
+ new cMenuEditStrItem(tr("Port"), newconfig.audio_port, 31,
+ DriverNameChars));
+ else
+ audio_port_item = NULL;
+ Add(audio_ctrl_delay =
+ new cMenuEditTypedIntItem(tr("Delay"), tr("ms"), &newconfig.audio_delay,
+ -3000, 3000, tr("Off")));
+ Add(audio_ctrl_compression =
+ new cMenuEditTypedIntItem(tr("Audio Compression"), "%",
+ &newconfig.audio_compression,
+ 100, 500, tr("Off")));
+ Add(audio_ctrl_upmix =
+ new cMenuEditBoolItem(tr("Upmix stereo to 5.1"),
+ &newconfig.audio_upmix));
+ Add(audio_ctrl_surround =
+ new cMenuEditBoolItem(tr("Downmix AC3 to surround"),
+ &newconfig.audio_upmix));
+#ifdef ENABLE_TEST_POSTPLUGINS
+ Add(audio_ctrl_headphone =
+ new cMenuEditBoolItem(tr("Mix to headphones"),
+ &newconfig.headphone));
+#else
+ audio_ctrl_headphone = NULL;
+#endif
+ Add(new cMenuEditStraI18nItem(tr("Visualization"), &visualization,
+ AUDIO_VIS_count,
+ xc.s_audioVisualizationNames));
+
+ if(current<1) current=1; /* first item is not selectable */
+ SetCurrent(Get(current));
+ Display();
+}
+
+eOSState cMenuSetupAudio::ProcessKey(eKeys Key)
+{
+ cOsdItem *item = Get(Current());
+ int val = audio_driver;
+
+ eOSState state = cMenuSetupPage::ProcessKey(Key);
+
+ if(Key!=kLeft && Key!=kRight)
+ return state;
+
+ if(item == audio_driver_item) {
+ if(val != audio_driver) {
+ if(audio_driver == AUDIO_DRIVER_ALSA) {
+ strcpy(newconfig.audio_port, "default");
+ Set();
+ } else if(audio_driver == AUDIO_DRIVER_OSS) {
+ strcpy(newconfig.audio_port, "/dev/dsp0");
+ Set();
+ } else {
+ strcpy(newconfig.audio_port, "");
+ Set();
+ }
+ }
+ else if((audio_driver != AUDIO_DRIVER_AUTO &&
+ audio_driver != AUDIO_DRIVER_NONE) &&
+ !audio_port_item)
+ Set();
+ else if((audio_driver == AUDIO_DRIVER_AUTO ||
+ audio_driver == AUDIO_DRIVER_NONE) &&
+ audio_port_item)
+ Set();
+ }
+ else if(item == audio_ctrl_delay || item == audio_ctrl_compression ||
+ item == audio_ctrl_surround) {
+ cXinelibDevice::Instance().ConfigurePostprocessing(
+ xc.deinterlace_method, newconfig.audio_delay,
+ newconfig.audio_compression, newconfig.audio_equalizer,
+ newconfig.audio_surround);
+ }
+ else if(item == audio_ctrl_upmix) {
+ cXinelibDevice::Instance().ConfigurePostprocessing(
+ "upmix", newconfig.audio_upmix ? true : false, NULL);
+ }
+#ifdef ENABLE_TEST_POSTPLUGINS
+ else if(item == audio_ctrl_headphone) {
+ cXinelibDevice::Instance().ConfigurePostprocessing(
+ "headphone", newconfig.headphone ? true : false, NULL);
+ }
+#endif
+
+ return state;
+}
+
+
+void cMenuSetupAudio::Store(void)
+{
+ memcpy(&xc, &newconfig, sizeof(config_t));
+ strcpy(xc.audio_driver, xc.s_audioDrivers[audio_driver]);
+ strcpy(xc.audio_visualization, xc.s_audioVisualizations[visualization]);
+
+ SetupStore("Audio.Driver", xc.audio_driver);
+ SetupStore("Audio.Port", xc.audio_port);
+ SetupStore("Audio.Delay", xc.audio_delay);
+ SetupStore("Audio.Compression", xc.audio_compression);
+ SetupStore("Audio.Surround", xc.audio_surround);
+ SetupStore("Audio.Upmix", xc.audio_upmix);
+ SetupStore("Audio.Headphone", xc.headphone);
+ SetupStore("Audio.Visualization",xc.audio_visualization);
+}
+
+//--- cMenuSetupAudioEq ------------------------------------------------------
+
+class cMenuSetupAudioEq : public cMenuSetupPage
+{
+ private:
+ config_t newconfig;
+
+ protected:
+ virtual void Store(void);
+ void Set(void);
+
+ public:
+ cMenuSetupAudioEq(void);
+ ~cMenuSetupAudioEq(void);
+
+ virtual eOSState ProcessKey(eKeys Key);
+};
+
+cMenuSetupAudioEq::cMenuSetupAudioEq(void)
+{
+ memcpy(&newconfig, &xc, sizeof(config_t));
+ Set();
+}
+
+cMenuSetupAudioEq::~cMenuSetupAudioEq(void)
+{
+ cXinelibDevice::Instance().ConfigurePostprocessing(
+ xc.deinterlace_method, xc.audio_delay, xc.audio_compression,
+ xc.audio_equalizer, xc.audio_surround);
+}
+
+void cMenuSetupAudioEq::Set(void)
+{
+ SetPlugin(cPluginManager::GetPlugin(PLUGIN_NAME_I18N));
+ int current = Current();
+ Clear();
+
+ Add(NewTitle("Audio Equalizer"));
+ for(int i=0; i<AUDIO_EQ_count; i++)
+ Add(new cMenuEditTypedIntItem(config_t::s_audioEqNames[i], "%",
+ &newconfig.audio_equalizer[i],
+ -100, 100, tr("Off")));
+
+ if(current<1) current=1; /* first item is not selectable */
+ SetCurrent(Get(current));
+ Display();
+}
+
+eOSState cMenuSetupAudioEq::ProcessKey(eKeys Key)
+{
+ eOSState state = cMenuSetupPage::ProcessKey(Key);
+
+ if(Key == kLeft || Key == kRight) {
+ cXinelibDevice::Instance().ConfigurePostprocessing(
+ xc.deinterlace_method, xc.audio_delay, xc.audio_compression,
+ newconfig.audio_equalizer, xc.audio_surround);
+ }
+
+ return state;
+}
+
+void cMenuSetupAudioEq::Store(void)
+{
+ memcpy(&xc, &newconfig, sizeof(config_t));
+
+ char tmp[255];
+ sprintf(tmp,"%d %d %d %d %d %d %d %d %d %d",
+ xc.audio_equalizer[0], xc.audio_equalizer[1],
+ xc.audio_equalizer[2], xc.audio_equalizer[3],
+ xc.audio_equalizer[4], xc.audio_equalizer[5],
+ xc.audio_equalizer[6], xc.audio_equalizer[7],
+ xc.audio_equalizer[8], xc.audio_equalizer[9]);
+ SetupStore("Audio.Equalizer", tmp);
+}
+
+//--- cMenuSetupVideo --------------------------------------------------------
+
+class cMenuSetupVideo : public cMenuSetupPage
+{
+ private:
+ config_t newconfig;
+
+ cOsdItem *ctrl_hue;
+ cOsdItem *ctrl_saturation;
+ cOsdItem *ctrl_contrast;
+ cOsdItem *ctrl_brightness;
+
+ protected:
+ virtual void Store(void);
+ void Set(void);
+
+ public:
+ cMenuSetupVideo(void);
+ ~cMenuSetupVideo(void);
+
+ virtual eOSState ProcessKey(eKeys Key);
+};
+
+cMenuSetupVideo::cMenuSetupVideo(void)
+{
+ memcpy(&newconfig, &xc, sizeof(config_t));
+
+ newconfig.hue = CONTROL_TO_INDEX(newconfig.hue);
+ newconfig.saturation = CONTROL_TO_INDEX(newconfig.saturation);
+ newconfig.contrast = CONTROL_TO_INDEX(newconfig.contrast);
+ newconfig.brightness = CONTROL_TO_INDEX(newconfig.brightness);
+
+ Set();
+}
+
+cMenuSetupVideo::~cMenuSetupVideo(void)
+{
+ cXinelibDevice::Instance().ConfigureVideo(xc.hue, xc.saturation,
+ xc.brightness, xc.contrast);
+}
+
+void cMenuSetupVideo::Set(void)
+{
+ SetPlugin(cPluginManager::GetPlugin(PLUGIN_NAME_I18N));
+ //int current = Current();
+ Clear();
+
+ Add(NewTitle("Video"));
+
+#ifdef INTEGER_CONFIG_VIDEO_CONTROLS
+ Add(new cMenuEditIntItem(tr("HUE"), &newconfig.hue, -1, 0xffff));
+ Add(new cMenuEditIntItem(tr("Saturation"), &newconfig.saturation,-1,0xffff));
+ Add(new cMenuEditIntItem(tr("Contrast"), &newconfig.contrast, -1, 0xffff));
+ Add(new cMenuEditIntItem(tr("Brightness"), &newconfig.brightness,-1,0xffff));
+#else
+ Add(ctrl_hue = new cMenuEditStraItem(tr("HUE"), &newconfig.hue, 33,
+ controls));
+ Add(ctrl_saturation =
+ new cMenuEditStraItem(tr("Saturation"), &newconfig.saturation, 33,
+ controls));
+ Add(ctrl_contrast =
+ new cMenuEditStraItem(tr("Contrast"), &newconfig.contrast, 33,
+ controls));
+ Add(ctrl_brightness =
+ new cMenuEditStraItem(tr("Brightness"), &newconfig.brightness, 33,
+ controls));
+#endif
+
+ //if(current<1) current=1; /* first item is not selectable */
+ //SetCurrent(Get(current));
+ SetCurrent(Get(1));
+ Display();
+}
+
+eOSState cMenuSetupVideo::ProcessKey(eKeys Key)
+{
+ cOsdItem *item = Get(Current());
+
+ eOSState state = cMenuSetupPage::ProcessKey(Key);
+
+ if(Key!=kLeft && Key!=kRight)
+ return state;
+
+ if(item == ctrl_hue || item == ctrl_saturation ||
+ item == ctrl_contrast || item == ctrl_brightness )
+#ifdef INTEGER_CONFIG_VIDEO_CONTROLS
+ cXinelibDevice::Instance().ConfigureVideo(newconfig.hue,
+ newconfig.saturation,
+ newconfig.brightness,
+ newconfig.contrast);
+#else
+ cXinelibDevice::Instance().ConfigureVideo(
+ INDEX_TO_CONTROL(newconfig.hue),
+ INDEX_TO_CONTROL(newconfig.saturation),
+ INDEX_TO_CONTROL(newconfig.brightness),
+ INDEX_TO_CONTROL(newconfig.contrast));
+#endif
+ return state;
+}
+
+void cMenuSetupVideo::Store(void)
+{
+ memcpy(&xc, &newconfig, sizeof(config_t));
+
+#ifdef INTEGER_CONFIG_VIDEO_CONTROLS
+#else
+ xc.hue = INDEX_TO_CONTROL(xc.hue);
+ xc.saturation = INDEX_TO_CONTROL(xc.saturation);
+ xc.contrast = INDEX_TO_CONTROL(xc.contrast);
+ xc.brightness = INDEX_TO_CONTROL(xc.brightness);
+#endif
+
+ SetupStore("Video.HUE", xc.hue);
+ SetupStore("Video.Saturation", xc.saturation);
+ SetupStore("Video.Contrast", xc.contrast);
+ SetupStore("Video.Brightness", xc.brightness);
+}
+
+
+//--- cMenuSetupOSD ----------------------------------------------------------
+
+class cMenuSetupOSD : public cMenuSetupPage
+{
+ private:
+ config_t newconfig;
+
+ int orig_alpha_correction;
+ int orig_alpha_correction_abs;
+
+ cOsdItem *ctrl_alpha;
+ cOsdItem *ctrl_alpha_abs;
+ cOsdItem *ctrl_unscaled;
+ cOsdItem *ctrl_scale;
+ cOsdItem *ctrl_downscale;
+ cOsdItem *ctrl_lowres;
+
+ protected:
+ virtual void Store(void);
+ void Set(void);
+
+ public:
+ cMenuSetupOSD(void);
+ ~cMenuSetupOSD();
+
+ virtual eOSState ProcessKey(eKeys Key);
+};
+
+cMenuSetupOSD::cMenuSetupOSD(void)
+{
+ memcpy(&newconfig, &xc, sizeof(config_t));
+ orig_alpha_correction = xc.alpha_correction;
+ orig_alpha_correction_abs = xc.alpha_correction_abs;
+
+ Set();
+}
+
+cMenuSetupOSD::~cMenuSetupOSD()
+{
+ xc.alpha_correction = orig_alpha_correction;
+ xc.alpha_correction_abs = orig_alpha_correction_abs;
+
+ cXinelibDevice::Instance().ConfigureOSD(xc.prescale_osd, xc.unscaled_osd);
+}
+
+void cMenuSetupOSD::Set(void)
+{
+ SetPlugin(cPluginManager::GetPlugin(PLUGIN_NAME_I18N));
+ int current = Current();
+ Clear();
+
+ ctrl_scale = NULL;
+ ctrl_downscale = NULL;
+ ctrl_unscaled = NULL;
+ ctrl_lowres = NULL;
+ ctrl_alpha = NULL;
+ ctrl_alpha_abs = NULL;
+
+ Add(NewTitle("On-Screen Display"));
+ Add(new cMenuEditBoolItem(tr("Hide main menu"),
+ &newconfig.hide_main_menu));
+ Add(ctrl_scale =
+ new cMenuEditBoolItem(tr("Scale OSD to video size"),
+ &newconfig.prescale_osd));
+ if(newconfig.prescale_osd)
+ Add(ctrl_downscale =
+ new cMenuEditBoolItem(tr(" Allow downscaling"),
+ &newconfig.prescale_osd_downscale));
+ Add(ctrl_unscaled =
+ new cMenuEditBoolItem(tr("Unscaled OSD (no transparency)"),
+ &newconfig.unscaled_osd));
+ if(!newconfig.unscaled_osd) {
+ Add(new cMenuEditBoolItem(tr(" When opaque OSD"),
+ &newconfig.unscaled_osd_opaque));
+ Add(ctrl_lowres =
+ new cMenuEditBoolItem(tr(" When low-res video"),
+ &newconfig.unscaled_osd_lowresvideo));
+ }
+
+ Add(ctrl_alpha =
+ new cMenuEditTypedIntItem(tr("Dynamic transparency correction"), "%",
+ &newconfig.alpha_correction, -200, 200,
+ tr("Off")));
+ Add(ctrl_alpha_abs =
+ new cMenuEditTypedIntItem(tr("Static transparency correction"), "",
+ &newconfig.alpha_correction_abs, -0xff, 0xff,
+ tr("Off")));
+
+ if(current<1) current=1; /* first item is not selectable */
+ SetCurrent(Get(current));
+ SetCurrent(Get(1));
+ Display();
+}
+
+eOSState cMenuSetupOSD::ProcessKey(eKeys Key)
+{
+ cOsdItem *item = Get(Current());
+
+ eOSState state = cMenuSetupPage::ProcessKey(Key);
+
+ if(Key!=kLeft && Key!=kRight)
+ return state;
+
+ if(item == ctrl_alpha)
+ xc.alpha_correction = newconfig.alpha_correction;
+ else if(item == ctrl_alpha_abs)
+ xc.alpha_correction_abs = newconfig.alpha_correction_abs;
+ else if(item == ctrl_unscaled || item == ctrl_scale)
+ cXinelibDevice::Instance().ConfigureOSD(newconfig.prescale_osd,
+ newconfig.unscaled_osd);
+
+ if(newconfig.prescale_osd && !ctrl_downscale)
+ Set();
+ if(!newconfig.prescale_osd && ctrl_downscale)
+ Set();
+ if(!newconfig.unscaled_osd && !ctrl_lowres)
+ Set();
+ if(newconfig.unscaled_osd && ctrl_lowres)
+ Set();
+
+ return state;
+}
+
+void cMenuSetupOSD::Store(void)
+{
+ memcpy(&xc, &newconfig, sizeof(config_t));
+
+ orig_alpha_correction = xc.alpha_correction;
+ orig_alpha_correction_abs = xc.alpha_correction_abs;
+
+ SetupStore("OSD.HideMainMenu", xc.hide_main_menu);
+ SetupStore("OSD.Prescale", xc.prescale_osd);
+ SetupStore("OSD.Downscale", xc.prescale_osd_downscale);
+ SetupStore("OSD.UnscaledAlways", xc.unscaled_osd);
+ SetupStore("OSD.UnscaledOpaque", xc.unscaled_osd_opaque);
+ SetupStore("OSD.UnscaledLowRes", xc.unscaled_osd_lowresvideo);
+ SetupStore("OSD.AlphaCorrection", xc.alpha_correction);
+ SetupStore("OSD.AlphaCorrectionAbs", xc.alpha_correction_abs);
+}
+
+
+//--- cMenuSetupDecoder ------------------------------------------------------
+
+class cMenuSetupDecoder : public cMenuSetupPage
+{
+ private:
+ config_t newconfig;
+
+ int pes_buffers_ind;
+
+ cOsdItem *ctrl_pes_buffers_ind;
+ cOsdItem *ctrl_pes_buffers;
+
+ protected:
+ virtual void Store(void);
+ void Set(void);
+
+ public:
+ cMenuSetupDecoder(void);
+
+ virtual eOSState ProcessKey(eKeys Key);
+};
+
+cMenuSetupDecoder::cMenuSetupDecoder(void)
+{
+ int i;
+ memcpy(&newconfig, &xc, sizeof(config_t));
+
+ pes_buffers_ind = PES_BUFFERS_CUSTOM;
+ for(i=0;xc.s_bufferSize[i];i++)
+ if(xc.pes_buffers == xc.i_pesBufferSize[i])
+ pes_buffers_ind = i;
+
+ Set();
+}
+
+void cMenuSetupDecoder::Set(void)
+{
+ SetPlugin(cPluginManager::GetPlugin(PLUGIN_NAME_I18N));
+ int current = Current();
+ Clear();
+
+ Add(NewTitle("Decoder"));
+ Add(new cMenuEditStraI18nItem(tr("Priority"), &xc.decoder_priority,
+ DECODER_PRIORITY_count, xc.s_decoderPriority));
+#ifdef ENABLE_SUSPEND
+ Add(new cMenuEditTypedIntItem(tr("Stop after inactivity"), tr("min"),
+ &newconfig.inactivity_timer, 0, 1440,
+ tr("Off")));
+#endif
+ Add(ctrl_pes_buffers_ind =
+ new cMenuEditStraI18nItem(tr("Buffer size"), &pes_buffers_ind,
+ PES_BUFFERS_count, xc.s_bufferSize));
+ if(pes_buffers_ind == PES_BUFFERS_CUSTOM)
+ Add(ctrl_pes_buffers =
+ new cMenuEditIntItem(tr(" Number of PES packets"), &newconfig.pes_buffers,
+ 10, 10000));
+ else
+ ctrl_pes_buffers = NULL;
+
+ if(current<1) current=1; /* first item is not selectable */
+ SetCurrent(Get(current));
+ Display();
+}
+
+eOSState cMenuSetupDecoder::ProcessKey(eKeys Key)
+{
+ cOsdItem *item = Get(Current());
+
+ eOSState state = cMenuSetupPage::ProcessKey(Key);
+
+ if(Key!=kLeft && Key!=kRight)
+ return state;
+
+ if(item == ctrl_pes_buffers_ind) {
+ if(pes_buffers_ind == PES_BUFFERS_CUSTOM && !ctrl_pes_buffers) {
+ Set();
+ } else if(pes_buffers_ind != PES_BUFFERS_CUSTOM && ctrl_pes_buffers) {
+ Set();
+ }
+ }
+
+ return state;
+}
+
+void cMenuSetupDecoder::Store(void)
+{
+ int old_buffers = xc.pes_buffers;
+ int old_priority = xc.decoder_priority;
+
+ memcpy(&xc, &newconfig, sizeof(config_t));
+
+ if(pes_buffers_ind != PES_BUFFERS_CUSTOM)
+ xc.pes_buffers = xc.i_pesBufferSize[pes_buffers_ind];
+
+ SetupStore("Decoder.InactivityTimer", xc.inactivity_timer);
+ SetupStore("Decoder.Priority", xc.s_decoderPriority[xc.decoder_priority]);
+ SetupStore("Decoder.PesBuffers", xc.pes_buffers);
+
+ if(xc.pes_buffers != old_buffers || xc.decoder_priority != old_priority)
+ cXinelibDevice::Instance().ConfigureDecoder(xc.pes_buffers,
+ xc.decoder_priority);
+}
+
+
+//--- cMenuSetupLocal --------------------------------------------------------
+
+class cMenuSetupLocal : public cMenuSetupPage
+{
+ private:
+ config_t newconfig;
+
+ int deinterlace;
+ int video_driver;
+ int local_frontend;
+
+ cOsdItem *ctrl_scale;
+ cOsdItem *ctrl_local_fe;
+ cOsdItem *ctrl_driver;
+ cOsdItem *ctrl_fullscreen;
+ cOsdItem *ctrl_window_width;
+ cOsdItem *ctrl_window_height;
+ cOsdItem *ctrl_deinterlace;
+ cOsdItem *ctrl_deinterlace_opts;
+ cOsdItem *ctrl_interlace_order;
+ cOsdItem *ctrl_aspect;
+ cOsdItem *ctrl_autocrop;
+
+ protected:
+ virtual void Store(void);
+ void Set(void);
+
+ public:
+ cMenuSetupLocal(void);
+ ~cMenuSetupLocal(void);
+
+ virtual eOSState ProcessKey(eKeys Key);
+};
+
+cMenuSetupLocal::cMenuSetupLocal(void)
+{
+ SetPlugin(cPluginManager::GetPlugin(PLUGIN_NAME_I18N));
+
+ memcpy(&newconfig, &xc, sizeof(config_t));
+
+ local_frontend = strstra(xc.local_frontend, xc.s_frontends, 0);
+
+ video_driver = 0;
+ if(local_frontend == FRONTEND_X11)
+ video_driver = strstra(xc.video_driver, xc.s_videoDriversX11, 0);
+ if(local_frontend == FRONTEND_FB)
+ video_driver = strstra(xc.video_driver, xc.s_videoDriversFB, 0);
+
+ deinterlace = strstra(xc.deinterlace_method, xc.s_deinterlaceMethods, 0);
+
+ Set();
+}
+
+cMenuSetupLocal::~cMenuSetupLocal(void)
+{
+ cXinelibDevice::Instance().ConfigureWindow(
+ xc.fullscreen, xc.width, xc.height, xc.modeswitch, xc.modeline,
+ xc.display_aspect, xc.scale_video, xc.field_order);
+ cXinelibDevice::Instance().ConfigurePostprocessing(
+ xc.deinterlace_method, xc.audio_delay, xc.audio_compression,
+ xc.audio_equalizer, xc.audio_surround);
+#ifdef ENABLE_TEST_POSTPLUGINS
+ cXinelibDevice::Instance().ConfigurePostprocessing(
+ "autocrop", xc.autocrop ? true : false, NULL);
+#endif
+}
+
+void cMenuSetupLocal::Set(void)
+{
+ int current = Current();
+ Clear();
+
+ ctrl_autocrop = NULL;
+ ctrl_interlace_order = NULL;
+ ctrl_fullscreen = NULL;
+ ctrl_window_width = NULL;
+ ctrl_window_height = NULL;
+ ctrl_driver = NULL;
+ ctrl_aspect = NULL;
+ ctrl_scale = NULL;
+ ctrl_deinterlace_opts = NULL;
+
+ //Add(NewTitle("Video"));
+
+#ifdef ENABLE_TEST_POSTPLUGINS
+#warning move to Video menu (or enable only for local, for remote --> cmdline)
+ Add(ctrl_autocrop =
+ new cMenuEditBoolItem(tr("Crop letterbox to 16:9"),
+ &newconfig.autocrop));
+#endif
+
+ Add(NewTitle("Local Frontend"));
+ Add(ctrl_local_fe =
+ new cMenuEditStraI18nItem(tr("Local Display Frontend"), &local_frontend,
+ FRONTEND_count, xc.s_frontendNames));
+
+ if(local_frontend == FRONTEND_X11) {
+ Add(ctrl_driver =
+ new cMenuEditStraI18nItem(tr("Driver"), &video_driver,
+ X11_DRIVER_count,
+ xc.s_videoDriverNamesX11));
+ strcpy(newconfig.video_port, "127.0.0.1:0.0");
+ Add(new cMenuEditStrItem(tr("Display address"), newconfig.video_port,
+ 31, DriverNameChars));
+ Add(new cMenuEditBoolItem(tr("Use keyboard"),
+ &newconfig.use_x_keyboard));
+
+ } else if(local_frontend == FRONTEND_FB) {
+ Add(ctrl_driver =
+ new cMenuEditStraI18nItem(tr("Driver"), &video_driver,
+ FB_DRIVER_count,
+ xc.s_videoDriverNamesFB));
+ strcpy(newconfig.video_port, "/dev/fb/0");
+ Add(new cMenuEditStrItem(tr("Framebuffer device"), newconfig.video_port, 31,
+ DriverNameChars));
+ }
+#if 0
+ if(local_frontend == FRONTEND_FB || !newconfig.fullscreen) {
+ Add(new cMenuEditStrItem( "Modeline", newconfig.modeline, 31,
+ ModeLineChars));
+ Add(new cMenuEditBoolItem("Videomode switching", &xc.modeswitch));
+ }
+#endif
+
+ if(local_frontend == FRONTEND_X11) {
+ Add(ctrl_fullscreen = new cMenuEditBoolItem(tr("Fullscreen mode"),
+ &newconfig.fullscreen));
+ if(!newconfig.fullscreen) {
+ Add(ctrl_window_width =
+ new cMenuEditTypedIntItem( tr(" Window width"), tr("px"),
+ &newconfig.width, 1, 2048));
+ Add(ctrl_window_height =
+ new cMenuEditTypedIntItem( tr(" Window height"), tr("px"),
+ &newconfig.height, 1, 2048));
+ }
+ }
+
+ if(local_frontend != FRONTEND_NONE) {
+ Add(ctrl_aspect =
+ new cMenuEditStraI18nItem(tr("Window aspect"), &newconfig.display_aspect,
+ ASPECT_count, xc.s_aspects));
+ Add(ctrl_scale =
+ new cMenuEditBoolItem(tr("Scale to window size"), &newconfig.scale_video));
+
+ Add(ctrl_deinterlace =
+ new cMenuEditStraI18nItem(tr("Deinterlacing"), &deinterlace,
+ DEINTERLACE_count,
+ xc.s_deinterlaceMethodNames));
+
+ if(deinterlace == DEINTERLACE_TVTIME)
+ Add(ctrl_deinterlace_opts = new cMenuEditStrItem(tr(" Options:"),
+ newconfig.deinterlace_opts,
+ 64, OptionsChars));
+
+#ifdef HAVE_XV_FIELD_ORDER
+ if(!deinterlace)
+ Add(ctrl_interlace_order =
+ new cMenuEditStraI18nItem(tr("Interlaced Field Order"),
+ &newconfig.field_order, FIELD_ORDER_count,
+ xc.s_fieldOrder));
+#endif
+ }
+
+ if(current<1) current=1; /* first item is not selectable */
+ SetCurrent(Get(current));
+ Display();
+}
+
+eOSState cMenuSetupLocal::ProcessKey(eKeys Key)
+{
+ int prev_frontend = local_frontend;
+
+ cOsdItem *item = Get(Current());
+
+ eOSState state = cMenuSetupPage::ProcessKey(Key);
+
+ if((Key!=kLeft && Key!=kRight) || !item)
+ return state;
+
+ if(item == ctrl_aspect || item == ctrl_scale || item == ctrl_interlace_order)
+ cXinelibDevice::Instance().ConfigureWindow(
+ xc.fullscreen, xc.width, xc.height, xc.modeswitch, xc.modeline,
+ newconfig.display_aspect, newconfig.scale_video,
+ newconfig.field_order);
+ else if(item == ctrl_local_fe && local_frontend != prev_frontend)
+ Set();
+ else if(item == ctrl_fullscreen) {
+ if(!newconfig.fullscreen && !ctrl_window_width) {
+ Set();
+ } else if(newconfig.fullscreen && ctrl_window_width) {
+ Set();
+ }
+#ifdef ENABLE_TEST_POSTPLUGINS
+ } else if(item == ctrl_autocrop) {
+ cXinelibDevice::Instance().ConfigurePostprocessing(
+ "autocrop", xc.autocrop ? true : false, NULL);
+#endif
+ } else if(item == ctrl_deinterlace) {
+ if(deinterlace == DEINTERLACE_TVTIME && !ctrl_deinterlace_opts) {
+ Set();
+ } else if(deinterlace != DEINTERLACE_TVTIME && ctrl_deinterlace_opts) {
+ Set();
+ }
+ }
+
+#ifdef HAVE_XV_FIELD_ORDER
+ else if(item == ctrl_deinterlace) {
+ if(!deinterlace && !ctrl_interlace_order) {
+ Set();
+ } else if(deinterlace && ctrl_interlace_order) {
+ Set();
+ }
+ }
+#endif
+
+ return state;
+}
+
+void cMenuSetupLocal::Store(void)
+{
+ memcpy(&xc, &newconfig, sizeof(config_t));
+
+ strcpy(xc.local_frontend, xc.s_frontends[local_frontend]);
+ if(local_frontend == FRONTEND_X11)
+ strcpy(xc.video_driver, xc.s_videoDriversX11[video_driver]);
+ if(local_frontend == FRONTEND_FB)
+ strcpy(xc.video_driver, xc.s_videoDriversFB[video_driver]);
+
+ strcpy(xc.deinterlace_method, xc.s_deinterlaceMethods[deinterlace]);
+
+ SetupStore("Frontend", xc.local_frontend);
+ SetupStore("Modeline", xc.modeline);
+ SetupStore("VideoModeSwitching", xc.modeswitch);
+ SetupStore("Fullscreen", xc.fullscreen);
+ SetupStore("DisplayAspect", xc.s_aspects[xc.display_aspect]);
+
+ SetupStore("X11.WindowWidth", xc.width);
+ SetupStore("X11.WindowHeight", xc.height);
+ SetupStore("X11.UseKeyboard", xc.use_x_keyboard);
+
+ SetupStore("Video.Driver", xc.video_driver);
+ SetupStore("Video.Port", xc.video_port);
+ SetupStore("Video.Scale", xc.scale_video);
+ SetupStore("Video.Deinterlace", xc.deinterlace_method);
+ SetupStore("Video.DeinterlaceOptions", xc.deinterlace_opts);
+
+ SetupStore("Video.FieldOrder", xc.field_order);
+ SetupStore("Video.AutoCrop", xc.autocrop);
+}
+
+//--- cMenuSetupRemote -------------------------------------------------------
+
+class cMenuSetupRemote : public cMenuSetupPage
+{
+ private:
+ config_t newconfig;
+
+ cOsdItem *ctrl_remote_mode;
+ cOsdItem *ctrl_usertp;
+ cOsdItem *ctrl_rtp_addr;
+
+ protected:
+ virtual void Store(void);
+ void Set(void);
+
+ public:
+ cMenuSetupRemote(void);
+
+ virtual eOSState ProcessKey(eKeys Key);
+};
+
+cMenuSetupRemote::cMenuSetupRemote(void)
+{
+ memcpy(&newconfig, &xc, sizeof(config_t));
+ Set();
+}
+
+void cMenuSetupRemote::Set(void)
+{
+ SetPlugin(cPluginManager::GetPlugin(PLUGIN_NAME_I18N));
+ Clear();
+
+ Add(NewTitle("Remote Clients"));
+ Add(ctrl_remote_mode = new cMenuEditBoolItem(tr("Allow remote clients"),
+ &newconfig.remote_mode));
+ ctrl_usertp = NULL;
+ ctrl_rtp_addr = NULL;
+ if(newconfig.remote_mode) {
+ Add(new cMenuEditIntItem( tr(" Listen port (TCP and broadcast)"),
+ &newconfig.listen_port,
+ 0, 0xffff));
+ Add(new cMenuEditBoolItem(tr(" Remote keyboard"),
+ &newconfig.use_remote_keyboard));
+
+ Add(new cMenuEditBoolItem(tr(" TCP transport"),
+ &newconfig.remote_usetcp));
+ Add(new cMenuEditBoolItem(tr(" UDP transport"),
+ &newconfig.remote_useudp));
+ Add(ctrl_usertp =
+ new cMenuEditBoolItem(tr(" RTP (multicast) transport"),
+ &newconfig.remote_usertp));
+ if(newconfig.remote_usertp) {
+ Add(ctrl_rtp_addr =
+ new cMenuEditStrItem( tr(" Multicast address"),
+ &newconfig.remote_rtp_addr[0], 16, "0123456789."));
+ Add(new cMenuEditIntItem( tr(" Multicast port"),
+ &newconfig.remote_rtp_port, 1000, 0xffff));
+ Add(new cMenuEditIntItem( tr(" Multicast TTL"),
+ &newconfig.remote_rtp_ttl, 1, 10));
+ Add(new cMenuEditBoolItem(tr(" Transmit always on"),
+ &newconfig.remote_rtp_always_on));
+ }
+ Add(new cMenuEditBoolItem(tr(" PIPE transport"),
+ &newconfig.remote_usepipe));
+ Add(new cMenuEditBoolItem(tr(" Server announce broadcasts"),
+ &newconfig.remote_usebcast));
+ }
+
+ Display();
+}
+
+eOSState cMenuSetupRemote::ProcessKey(eKeys Key)
+{
+ cOsdItem *item = Get(Current());
+
+ eOSState state = cMenuSetupPage::ProcessKey(Key);
+
+ if(Key!=kLeft && Key!=kRight)
+ return state;
+
+ if(item == ctrl_remote_mode) {
+ if(newconfig.remote_mode && !ctrl_usertp) {
+ Set();
+ } else if(!newconfig.remote_mode && ctrl_usertp) {
+ Set();
+ }
+ }
+ if(item == ctrl_usertp) {
+ if(newconfig.remote_usertp && !ctrl_rtp_addr) {
+ Set();
+ } else if(!newconfig.remote_usertp && ctrl_rtp_addr) {
+ Set();
+ }
+ }
+
+ return state;
+}
+
+void cMenuSetupRemote::Store(void)
+{
+ memcpy(&xc, &newconfig, sizeof(config_t));
+
+ SetupStore("RemoteMode", xc.remote_mode);
+ SetupStore("Remote.ListenPort", xc.listen_port);
+ SetupStore("Remote.Keyboard", xc.use_remote_keyboard);
+
+ SetupStore("Remote.UseTcp", xc.remote_usetcp);
+ SetupStore("Remote.UseUdp", xc.remote_useudp);
+ SetupStore("Remote.UseRtp", xc.remote_usertp);
+ SetupStore("Remote.UsePipe",xc.remote_usepipe);
+ SetupStore("Remote.UseBroadcast", xc.remote_usebcast);
+
+ SetupStore("Remote.Rtp.Address", xc.remote_rtp_addr);
+ SetupStore("Remote.Rtp.Port", xc.remote_rtp_port);
+ SetupStore("Remote.Rtp.TTL", xc.remote_rtp_ttl);
+ SetupStore("Remote.Rtp.AlwaysOn", xc.remote_rtp_always_on);
+
+ cXinelibDevice::Instance().Listen(xc.remote_mode, xc.listen_port);
+}
+
+} // namespace
+
+//--- cMenuSetupXinelib ------------------------------------------------------
+
+cMenuSetupXinelib::cMenuSetupXinelib(void)
+{
+ XinelibOutputSetupMenu::controls[0] = tr("Off");
+ Set();
+}
+
+void cMenuSetupXinelib::Set(void)
+{
+ Clear();
+
+ SetHasHotkeys();
+ Add(new cOsdItem(hk(tr("Audio")), osUser1));
+ Add(new cOsdItem(hk(tr("Audio Equalizer")),osUser2));
+ Add(new cOsdItem(hk(tr("Video")), osUser3));
+ Add(new cOsdItem(hk(tr("OSD")), osUser4));
+ Add(new cOsdItem(hk(tr("Decoder")), osUser5));
+ Add(new cOsdItem(hk(tr("Local Frontend")), osUser6));
+ Add(new cOsdItem(hk(tr("Remote Clients")), osUser7));
+
+ Display();
+}
+
+eOSState cMenuSetupXinelib::ProcessKey(eKeys Key)
+{
+ eOSState state = cMenuSetupPage::ProcessKey(Key);
+
+ switch (state) {
+ case osUser1:
+ return AddSubMenu(new XinelibOutputSetupMenu::cMenuSetupAudio);
+ case osUser2:
+ return AddSubMenu(new XinelibOutputSetupMenu::cMenuSetupAudioEq);
+ case osUser3:
+ return AddSubMenu(new XinelibOutputSetupMenu::cMenuSetupVideo);
+ case osUser4:
+ return AddSubMenu(new XinelibOutputSetupMenu::cMenuSetupOSD);
+ case osUser5:
+ return AddSubMenu(new XinelibOutputSetupMenu::cMenuSetupDecoder);
+ case osUser6:
+ return AddSubMenu(new XinelibOutputSetupMenu::cMenuSetupLocal);
+ case osUser7:
+ return AddSubMenu(new XinelibOutputSetupMenu::cMenuSetupRemote);
+
+ default: ;
+ }
+
+ return state;
+}
+
+