summaryrefslogtreecommitdiff
path: root/menu.c
diff options
context:
space:
mode:
authorcvs2svn <admin@example.com>2009-10-21 00:02:02 +0000
committercvs2svn <admin@example.com>2009-10-21 00:02:02 +0000
commit97a97ca3358eb48de3eb7a222e487e800566569f (patch)
tree97c920d0225a1c9773a3bce2207f261d7d230123 /menu.c
parenta61961358c5a2ec92340b3f8e056bab55438f103 (diff)
downloadxineliboutput-CVS.tar.gz
xineliboutput-CVS.tar.bz2
This commit was manufactured by cvs2svn to create branch 'CVS'.CVS
Diffstat (limited to 'menu.c')
-rw-r--r--menu.c918
1 files changed, 0 insertions, 918 deletions
diff --git a/menu.c b/menu.c
deleted file mode 100644
index fa7c56a1..00000000
--- a/menu.c
+++ /dev/null
@@ -1,918 +0,0 @@
-/*
- * menu.c: Main Menu
- *
- * See the main source file 'xineliboutput.c' for copyright information and
- * how to reach the author.
- *
- * $Id: menu.c,v 1.68 2009-08-03 12:40:09 phintuka Exp $
- *
- */
-
-#include "features.h"
-
-#include <dirent.h>
-
-#include <vdr/config.h>
-#include <vdr/interface.h>
-#include <vdr/menu.h>
-#include <vdr/plugin.h>
-#include <vdr/videodir.h>
-#include <vdr/i18n.h>
-
-#include "logdefs.h"
-#include "config.h"
-#include "menu.h"
-#include "menuitems.h"
-#include "tools/metainfo_menu.h"
-#include "device.h"
-#include "media_player.h"
-#include "equalizer.h"
-
-#ifndef HOTKEY_START
-# define HOTKEY_START kRed
-
-# define HOTKEY_DVD k0 /* */
-# define HOTKEY_DVD_TRACK1 k1 /* */
-# define HOTKEY_RESERVED k2 /* */
-
-# define HOTKEY_NEXT_ASPECT k3 /* auto, 4:3, 16:9 */
-# define HOTKEY_TOGGLE_CROP k4 /* off, force, auto */
-# define HOTKEY_UPMIX k5 /* off, on */
-# define HOTKEY_DOWNMIX k6 /* off, on */
-# define HOTKEY_DEINTERLACE k7 /* off, on */
-# define HOTKEY_LOCAL_FE k8 /* off, on */
-
-# define HOTKEY_PLAYLIST k9 /* Start replaying playlist or file pointed by
- symlink $(CONFDIR)/plugins/xineliboutput/default_playlist */
-# define HOTKEY_ADELAY_UP kUp /* audio delay up */
-# define HOTKEY_ADELAY_DOWN kDown /* audio delay down */
-# define HOTKEY_TOGGLE_VO_ASPECT kRight
-#endif
-
-//#define OLD_TOGGLE_FE
-
-#define ISNUMBERKEY(k) (RAWKEY(k) >= k0 && RAWKEY(k) <= k9)
-
-//--------------------------- cMenuBrowseFiles -------------------------------
-
-class cMenuBrowseFiles : public cOsdMenu
-{
- protected:
- const eMainMenuMode m_Mode;
- bool m_OnlyQueue;
- char *m_CurrentDir;
- char *m_ConfigLastDir;
- const char *help[4];
-
- virtual bool ScanDir(const char *DirName);
- virtual eOSState Open(bool ForceOpen = false, bool Queue = false, bool Rewind = false);
- virtual eOSState Delete(void);
- virtual eOSState Info(void);
- virtual void Set(void);
- virtual void SetHelpButtons(void);
- cFileListItem *GetCurrent() { return (cFileListItem *)Get(Current()); }
- void StoreConfig(void);
- char *GetLastDir(void);
-
- public:
- cMenuBrowseFiles(eMainMenuMode mode = ShowFiles, bool OnlyQueue=false);
- ~cMenuBrowseFiles();
-
- virtual eOSState ProcessKey(eKeys Key);
-};
-
-static char *ParentDir(const char *dir)
-{
- char *result = strdup(dir);
- char *pt = strrchr(result, '/');
- if(pt) {
- *(pt+1)=0;
- if(pt != result)
- *pt = 0;
- }
- return result;
-}
-
-static char *LastDir(const char *dir)
-{
- const char *pt = strrchr(dir, '/');
- if(pt && pt[0] && pt[1])
- return strdup(pt+1);
- return NULL;
-}
-
-cMenuBrowseFiles::cMenuBrowseFiles(eMainMenuMode mode, bool OnlyQueue) :
- cOsdMenu( ( mode==ShowImages ? tr("Images") :
- mode==ShowMusic ? (!OnlyQueue ? tr("Play music") : tr("Add to playlist")) :
- /*mode==ShowFiles ?*/ tr("Play file")),
- 2, 4),
- m_Mode(mode)
-{
- m_CurrentDir = NULL;
- m_OnlyQueue = OnlyQueue;
-
- m_ConfigLastDir = GetLastDir();
- Set();
-}
-
-cMenuBrowseFiles::~cMenuBrowseFiles()
-{
- Setup.Save();
- free(m_CurrentDir);
-}
-
-char *cMenuBrowseFiles::GetLastDir(void)
-{
- switch(m_Mode) {
- case ShowMusic: return xc.browse_music_dir;
- case ShowImages: return xc.browse_images_dir;
- default:
- case ShowFiles: return xc.browse_files_dir;
- }
- return xc.browse_files_dir;
-}
-
-void cMenuBrowseFiles::Set(void)
-{
- Clear();
-
- if(!m_CurrentDir)
- m_CurrentDir = strdup(m_ConfigLastDir);
-
- if(m_CurrentDir[0] != '/') {
- free(m_CurrentDir);
- m_CurrentDir = strdup(VideoDirectory);
- }
-
- // find deepest accessible directory from path
- while(!ScanDir(m_CurrentDir) && strlen(m_CurrentDir) > 1) {
- char *n = ParentDir(m_CurrentDir);
- free(m_CurrentDir);
- m_CurrentDir = n;
- }
-
- // add link to parent folder
- if(strlen(m_CurrentDir) > 1)
- Add(new cFileListItem("..",true));
-
- Sort();
-
- SetCurrent(Get(Count()>1 && strlen(m_CurrentDir)>1 ? 1 : 0));
-
- // select last selected item
-
- char *lastParent = ParentDir(m_ConfigLastDir);
- if(!strncmp(m_CurrentDir,lastParent,strlen(m_CurrentDir))) {
- char *item = LastDir(m_ConfigLastDir);
- if(item) {
- for(cFileListItem *it = (cFileListItem*)First(); it; it = (cFileListItem*)Next(it))
- if(!strcmp(it->Name(),item))
- SetCurrent(it);
- free(item);
- }
- }
- free(lastParent);
-
- strn0cpy(m_ConfigLastDir, m_CurrentDir, sizeof(xc.browse_files_dir));
- StoreConfig();
-
- SetHelpButtons();
-}
-
-void cMenuBrowseFiles::StoreConfig(void)
-{
- cPluginManager::GetPlugin(PLUGIN_NAME_I18N)->SetupStore("Media.BrowseMusicDir",
- xc.browse_music_dir);
- cPluginManager::GetPlugin(PLUGIN_NAME_I18N)->SetupStore("Media.BrowseFilesDir",
- xc.browse_files_dir);
- cPluginManager::GetPlugin(PLUGIN_NAME_I18N)->SetupStore("Media.BrowseImagesDir",
- xc.browse_images_dir);
-#if 1
- // delete old keys (<1.0.0)
- cPluginManager::GetPlugin(PLUGIN_NAME_I18N)->SetupStore("BrowseMusicDir");
- cPluginManager::GetPlugin(PLUGIN_NAME_I18N)->SetupStore("BrowseFilesDir");
- cPluginManager::GetPlugin(PLUGIN_NAME_I18N)->SetupStore("BrowseImagesDir");
-#endif
-}
-
-void cMenuBrowseFiles::SetHelpButtons(void)
-{
- bool isDir = !GetCurrent() || GetCurrent()->IsDir();
- bool isFile = !isDir;
-
- if (isDir && !strcmp("..", GetCurrent()->Name())) {
- help[0] = help[1] = help[2] = help[3] = NULL;
- } else if (m_Mode == ShowMusic) {
- help[0] = isDir ? trVDR("Button$Play") : NULL;
- help[1] = tr ("Button$Queue");
- help[2] = isFile ? trVDR("Button$Delete") : NULL;
- help[3] = isFile ? trVDR("Button$Info") : NULL;
- } else if (m_Mode == ShowImages) {
- help[0] = isDir ? trVDR("Button$Play") : NULL;
- help[1] = NULL;
- help[2] = isFile ? trVDR("Button$Delete") : NULL;
- help[3] = isFile ? trVDR("Button$Info") : NULL;
- } else {
- bool isDvd = GetCurrent() && (GetCurrent()->IsDvd() || GetCurrent()->IsBluRay());
- bool hasResume = GetCurrent() && GetCurrent()->HasResume();
-
- help[0] = isDir && isDvd ? trVDR("Button$Open") : NULL;
- help[1] = hasResume ? trVDR("Button$Rewind") : NULL;
- help[2] = isFile || isDvd ? trVDR("Button$Delete") : NULL;
- help[3] = isFile ? trVDR("Button$Info") : NULL;
- }
-
- SetHelp(help[0], help[1], help[2], help[3]);
- Display();
-}
-
-eOSState cMenuBrowseFiles::Delete(void)
-{
- cFileListItem *it = GetCurrent();
- if(!it->IsDir()) {
- if (Interface->Confirm(trVDR("Delete recording?"))) {
- cString name = cString::sprintf("%s/%s", m_CurrentDir, it->Name());
- if(!unlink(name)) {
- isyslog("file %s deleted", *name);
- if(m_Mode != ShowImages) {
- name = cString::sprintf("%s.resume", *name);
- unlink(name);
- }
- cOsdMenu::Del(Current());
- SetHelpButtons();
- Display();
- } else {
- Skins.Message(mtError, trVDR("Error while deleting recording!"));
- isyslog("Error deleting file %s", *name);
- }
- }
- }
- return osContinue;
-}
-
-eOSState cMenuBrowseFiles::Open(bool ForceOpen, bool Queue, bool Rewind)
-{
- if(!GetCurrent()) {
- return osContinue;
- }
-
- /* parent directory */
- if (!strcmp("..", GetCurrent()->Name())) {
- char *n = ParentDir(m_CurrentDir);
- free(m_CurrentDir);
- m_CurrentDir = n;
- Set();
- return osContinue;
-
- /* directory */
- } else if (GetCurrent()->IsDir()) {
-
- if(!ForceOpen && GetCurrent()->IsDvd()) {
- /* play dvd */
- cString f = cString::sprintf("dvd:%s/%s", m_CurrentDir, GetCurrent()->Name());
- cControl::Shutdown();
- cControl::Launch(new cXinelibDvdPlayerControl(f));
- return osEnd;
- }
- if(!ForceOpen && GetCurrent()->IsBluRay()) {
-#if 0
- /* play bd */
- cString f = cString::sprintf("bd:%s/%s", m_CurrentDir, GetCurrent()->Name());
- cControl::Shutdown();
- cControl::Launch(new cXinelibBdPlayerControl(f));
- return osEnd;
-#endif
- }
- if(ForceOpen && GetCurrent()->IsDir() &&
- !GetCurrent()->IsDvd() && !GetCurrent()->IsBluRay()) {
- /* play all files */
- if(m_Mode != ShowImages) {
-
- if(m_OnlyQueue && !Queue)
- return osContinue;
-
- cString f = cString::sprintf("%s/%s/", m_CurrentDir, GetCurrent()->Name());
-
- if(!Queue || !cXinelibPlayerControl::IsOpen())
- cControl::Shutdown();
- if(Queue)
- cXinelibPlayerControl::Queue(f);
- else
- cControl::Launch(new cXinelibPlayerControl(m_Mode, f));
- return Queue ? osContinue : osEnd;
-
- } else {
- // TODO: show all images
- }
- }
-
- /* go to directory */
- const char *d = GetCurrent()->Name();
- char *buffer = NULL;
- if(asprintf(&buffer, "%s/%s", m_CurrentDir, d) >= 0) {
- while(buffer[0] == '/' && buffer[1] == '/')
- strcpy(buffer, buffer+1);
- free(m_CurrentDir);
- m_CurrentDir = buffer;
- }
- Set();
- return osContinue;
-
- /* regular file */
- } else {
- cString f = cString::sprintf("%s%s/%s",
- GetCurrent()->IsDvd() ? "dvd:" : "",
- m_CurrentDir, GetCurrent()->Name());
- if (GetCurrent()->IsDvd())
- strn0cpy(m_ConfigLastDir, m_CurrentDir, sizeof(xc.browse_files_dir));
- else
- strn0cpy(m_ConfigLastDir, f, sizeof(xc.browse_files_dir));
- StoreConfig();
-
- if(m_Mode != ShowImages) {
- /* video/audio */
- if(m_OnlyQueue && !Queue)
- return osContinue;
- if(!Queue || !cXinelibPlayerControl::IsOpen())
- cControl::Shutdown();
- if(Queue)
- cXinelibPlayerControl::Queue(f);
- if(!cXinelibPlayerControl::IsOpen()) {
- if (Rewind)
- unlink(cString::sprintf("%s.resume", *f));
- cControl::Launch(GetCurrent()->IsDvd()
- ? new cXinelibDvdPlayerControl(f)
- : new cXinelibPlayerControl(m_Mode, f, GetCurrent()->SubFile()));
- }
- if(Queue)
- return osContinue;
- } else {
- /* image */
- char **files = new char*[Count()+1];
- int i = 0, index = 0;
- memset(files, 0, sizeof(char*)*(Count()+1));
- for(cFileListItem *it = (cFileListItem*)First(); it; it=(cFileListItem*)Next(it)) {
- if(it==Get(Current()))
- index = i;
- if(!it->IsDir())
- if(asprintf(&files[i++], "%s/%s", m_CurrentDir, it->Name()) < 0)
- i--;
- }
- cControl::Shutdown();
- cControl::Launch(new cXinelibImagesControl(files, index, i));
- }
- return osEnd;
- }
- return osContinue;
-}
-
-eOSState cMenuBrowseFiles::Info(void)
-{
- if(GetCurrent() && !GetCurrent()->IsDir()) {
- cString filename = cString::sprintf("%s/%s", m_CurrentDir, GetCurrent()->Name());
- return AddSubMenu(new cMetainfoMenu(filename));
- }
- return osContinue;
-}
-
-bool cMenuBrowseFiles::ScanDir(const char *DirName)
-{
- DIR *d = opendir(DirName);
- if (d) {
- struct dirent *e;
- while ((e = readdir(d)) != NULL) {
- if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
- cString buffer = cString::sprintf("%s/%s", DirName, e->d_name);
- struct stat st;
- if (stat(buffer, &st) == 0) {
-
- // check symlink destination
- if (S_ISLNK(st.st_mode)) {
- buffer = ReadLink(buffer);
- if (!*buffer || stat(buffer, &st))
- continue;
- }
-
- // folders
- if (S_ISDIR(st.st_mode)) {
-
- if(m_Mode == ShowImages || m_Mode == ShowMusic)
- Add(new cFileListItem(e->d_name, true));
- else
- Add(new cFileListItem(e->d_name, true, false, false,
- xc.IsDvdFolder(buffer), xc.IsBluRayFolder(buffer)));
-
- // regular files
- } else if(e->d_name[0] != '.') {
-
- // audio
- if (m_Mode == ShowMusic && xc.IsAudioFile(buffer)) {
- Add(new cFileListItem(e->d_name, false));
-
- // images
- } else if(m_Mode == ShowImages && xc.IsImageFile(buffer)) {
- Add(new cFileListItem(e->d_name, false));
-
- // DVD image (.iso)
- } else if (m_Mode == ShowFiles && xc.IsDvdImage(buffer)) {
- Add(new cFileListItem(e->d_name, false, false, false, true));
-
- // video
- } else if (m_Mode == ShowFiles && xc.IsVideoFile(buffer)) {
- cString subfile;
- cString resumefile;
-
- // separate subtitles ?
- cString basename = cString::sprintf("%s/%s", DirName, e->d_name);
- const char *p = strrchr(basename, '.');
- if (p)
- basename.Truncate(p - basename);
- int i;
- for(i=0; xc.s_subExts[i] && !*subfile; i++) {
- cString tmp = cString::sprintf("%s%s", *basename, xc.s_subExts[i]);
- if (stat(tmp, &st) == 0)
- subfile = tmp;
- }
-
- // resume file ?
- resumefile = cString::sprintf("%s/%s.resume", DirName, e->d_name);
- if (stat(resumefile, &st) != 0)
- resumefile = NULL;
-
- Add(new cFileListItem(e->d_name, false, *resumefile, subfile));
- }
- }
- }
- }
- }
- closedir(d);
- return true;
- }
- return false;
-}
-
-eOSState cMenuBrowseFiles::ProcessKey(eKeys Key)
-{
- eOSState state = cOsdMenu::ProcessKey(Key);
-
- if (state == osUnknown) {
- switch (Key) {
- case kPlay:
- case kOk: return Open(false, m_OnlyQueue);
- case kRed: if (help[0])
- return Open(true);
- break;
- case kGreen: if (help[1])
- return Open(true,
- m_Mode == ShowMusic ? m_OnlyQueue=true : false,
- m_Mode != ShowMusic);
- break;
- case kYellow: if (help[2])
- return Delete();
- break;
- case kBlue: if (help[3])
- return Info();
- break;
- default: break;
- }
- }
-
- if (state == osUnknown)
- state = osContinue;
-
- if (!HasSubMenu())
- SetHelpButtons();
-
- return state;
-}
-
-
-//----------------------------- cMenuXinelib ---------------------------------
-
-#include "tools/display_message.h"
-
-static cOsdItem *NewTitle(const char *s)
-{
- cString str = cString::sprintf("----- %s -----", s);
- cOsdItem *tmp = new cOsdItem(str);
- tmp->SetSelectable(false);
- return tmp;
-}
-
-
-extern cOsdObject *g_PendingMenuAction;
-
-time_t cMenuXinelib::g_LastHotkeyTime = 0;
-eKeys cMenuXinelib::g_LastHotkey = kNone;
-
-cMenuXinelib::cMenuXinelib()
-{
- field_order = xc.field_order;
- compression = xc.audio_compression;
- headphone = xc.headphone;
- autocrop = xc.autocrop;
- overscan = xc.overscan;
-
- hotkey_state = hkInit;
-
- novideo = cXinelibDevice::Instance().GetPlayMode() == pmAudioOnlyBlack ? 1 : 0;
-
- Add(NewTitle(tr("Media")));
- Add(new cOsdItem(tr("Play file >>"), osUser1));
- Add(new cOsdItem(tr("Play music >>"), osUser2));
- Add(new cOsdItem(tr("View images >>"), osUser3));
- if(xc.remote_mode)
- Add(new cOsdItem(tr("Play remote DVD >>"), osUser4));
- else
- Add(new cOsdItem(tr("Play DVD disc >>"), osUser4));
- if(xc.remote_mode)
- Add(new cOsdItem(tr("Play remote CD >>"), osUser6));
- else
- Add(new cOsdItem(tr("Play audio CD >>"), osUser6));
- Add(NewTitle(tr("Video settings")));
- Add(ctrl_novideo = new cMenuEditBoolItem(tr("Play only audio"),
- &novideo));
- Add(ctrl_autocrop = new cMenuEditBoolItem(tr("Crop letterbox 4:3 to 16:9"),
- &autocrop));
- Add(ctrl_overscan = new cMenuEditTypedIntItem(tr("Overscan (crop image borders)"), "%",
- &overscan, 0, 10,
- tr("Off")));
-#ifdef HAVE_XV_FIELD_ORDER
- Add(video_ctrl_interlace_order = new cMenuEditStraI18nItem(tr("Interlaced Field Order"),
- &field_order, 2, xc.s_fieldOrder));
-#endif
-
- Add(NewTitle(tr("Audio settings")));
-#ifdef ENABLE_TEST_POSTPLUGINS
- Add(ctrl_headphone = new cMenuEditBoolItem(tr("Headphone audio mode"),
- &headphone));
-#else
- ctrl_headphone = NULL;
-#endif
-
- Add(audio_ctrl_compress = new cMenuEditTypedIntItem(tr("Audio Compression"),"%",
- &compression, 100, 500, NULL, tr("Off")));
-
- Add(new cOsdItem(tr("Audio equalizer >>"), osUser7));
-
- switch(xc.main_menu_mode) {
- case ShowFiles: AddSubMenu(new cMenuBrowseFiles(ShowFiles)); break;
- case ShowMusic: AddSubMenu(new cMenuBrowseFiles(ShowMusic)); break;
- case ShowImages: AddSubMenu(new cMenuBrowseFiles(ShowImages)); break;
- default: break;
- }
-
- xc.main_menu_mode = ShowMenu;
-}
-
-cMenuXinelib::~cMenuXinelib()
-{
-#ifdef HAVE_XV_FIELD_ORDER
- if(xc.field_order != field_order )
- cXinelibDevice::Instance().ConfigureWindow(xc.fullscreen, xc.width, xc.height,
- xc.modeswitch, xc.modeline, xc.display_aspect,
- xc.scale_video, xc.field_order);
-#endif
-
- if(xc.audio_compression != compression)
- cXinelibDevice::Instance().ConfigurePostprocessing(xc.deinterlace_method, xc.audio_delay,
- xc.audio_compression, xc.audio_equalizer,
- xc.audio_surround, xc.speaker_type);
-
- if(xc.overscan != overscan)
- cXinelibDevice::Instance().ConfigureVideo(xc.hue, xc.saturation, xc.brightness, xc.sharpness,
- xc.noise_reduction, xc.contrast, xc.overscan,
- xc.vo_aspect_ratio);
-
- if(xc.headphone != headphone)
- cXinelibDevice::Instance().ConfigurePostprocessing("headphone",
- xc.headphone ? true : false);
-
- if(xc.autocrop != autocrop)
- cXinelibDevice::Instance().ConfigurePostprocessing("autocrop",
- xc.autocrop ? true : false,
- xc.AutocropOptions());
-
- int dev_novideo = cXinelibDevice::Instance().GetPlayMode() == pmAudioOnlyBlack ? 1 : 0;
- if(dev_novideo != novideo)
- cXinelibDevice::Instance().SetPlayMode(novideo ? pmAudioOnlyBlack : pmNone);
-}
-
-cOsdMenu *cMenuXinelib::CreateMenuBrowseFiles(eMainMenuMode mode, bool Queue)
-{
- return new cMenuBrowseFiles(mode, true);
-}
-
-eOSState cMenuXinelib::ProcessKey(eKeys Key)
-{
- /* Hot key support */
- if(hotkey_state == hkInit && Key == kNone)
- return osContinue;
- if(hotkey_state == hkInit && Key == HOTKEY_START) {
- hotkey_state = hkSeen;
- return osContinue;
- } else if(hotkey_state == hkSeen && Key != kNone) {
- hotkey_state = hkNone;
- return ProcessHotkey(Key);
- }
- hotkey_state = hkNone;
-
- cOsdItem *item = Get(Current());
-
- eOSState state = cMenuSetupPage::ProcessKey(Key);
-
- if(HasSubMenu())
- return state;
-
- switch(state) {
- case osUser1:
- AddSubMenu(new cMenuBrowseFiles(ShowFiles));
- return osUnknown;
- case osUser2:
- AddSubMenu(new cMenuBrowseFiles(ShowMusic));
- return osUnknown;
- case osUser3:
- AddSubMenu(new cMenuBrowseFiles(ShowImages));
- return osContinue;
- case osUser4:
- cControl::Shutdown();
- cControl::Launch(new cXinelibDvdPlayerControl("dvd:/"));
- return osEnd;
- case osUser6:
- cControl::Shutdown();
- cControl::Launch(new cXinelibPlayerControl(ShowMusic, "cdda:/"));
- return osEnd;
- case osUser7:
- if(!g_PendingMenuAction) {
- g_PendingMenuAction = new cEqualizer();
- return osPlugin;
- }
- return osContinue;
- default: ;
- }
-
- Key = NORMALKEY(Key);
-
- if(Key==kLeft || Key==kRight || ISNUMBERKEY(Key)) {
- if(item == audio_ctrl_compress)
- cXinelibDevice::Instance().ConfigurePostprocessing(xc.deinterlace_method, xc.audio_delay,
- compression, xc.audio_equalizer,
- xc.audio_surround, xc.speaker_type);
- else if(item == ctrl_overscan)
- cXinelibDevice::Instance().ConfigureVideo(xc.hue, xc.saturation, xc.brightness, xc.sharpness,
- xc.noise_reduction, xc.contrast, overscan,
- xc.vo_aspect_ratio);
- }
- if(Key==kLeft || Key==kRight) {
- if(item == ctrl_headphone)
- cXinelibDevice::Instance().ConfigurePostprocessing("headphone", headphone?true:false);
- else if(item == ctrl_autocrop)
- cXinelibDevice::Instance().ConfigurePostprocessing("autocrop", autocrop?true:false,
- xc.AutocropOptions());
- else if(item == ctrl_novideo)
- cXinelibDevice::Instance().SetPlayMode(novideo ? pmAudioOnlyBlack : pmNone);
-#ifdef HAVE_XV_FIELD_ORDER
- else if(video_ctrl_interlace_order && item == video_ctrl_interlace_order)
- cXinelibDevice::Instance().ConfigureWindow(xc.fullscreen, xc.width, xc.height,
- xc.modeswitch, xc.modeline,
- xc.display_aspect, xc.scale_video,
- field_order);
-#endif
- }
-
- return state;
-}
-
-void cMenuXinelib::Store(void)
-{
-#ifdef HAVE_XV_FIELD_ORDER
- xc.field_order = field_order;
-#endif
- xc.audio_compression = compression;
- xc.autocrop = autocrop;
- xc.overscan = overscan;
- xc.headphone = headphone;
-}
-
-eOSState cMenuXinelib::ProcessHotkey(eKeys Key)
-{
- eOSState NewState = osEnd;
- cString Message;
- time_t now = time(NULL);
- bool OnlyInfo = ((g_LastHotkeyTime < now-3) || g_LastHotkey != Key);
-
- switch(Key) {
- case HOTKEY_DVD:
- cControl::Shutdown();
- cControl::Launch(new cXinelibDvdPlayerControl("dvd:/"));
- break;
-
- case HOTKEY_DVD_TRACK1:
- cControl::Shutdown();
- cControl::Launch(new cXinelibDvdPlayerControl("dvd:/1"));
- break;
-
- case HOTKEY_LOCAL_FE:
- /* off, on */
- {
- int local_frontend = strstra(xc.local_frontend, xc.s_frontends, 0);
-
-#ifndef OLD_TOGGLE_FE
- if(local_frontend==FRONTEND_NONE)
- // no need to show current frontend if there is no output device ...
- OnlyInfo = false;
-#endif
- if(!OnlyInfo) {
-#ifndef OLD_TOGGLE_FE
- static int orig_frontend = -1;
- if(orig_frontend < 0)
- orig_frontend = local_frontend;
-
- if(orig_frontend == FRONTEND_NONE) {
- // no frontends were loaded at startup -> loop thru all frontends
- local_frontend++;
- } else {
- // frontend was loaded at startup -> toggle it on/off
- if(local_frontend == FRONTEND_NONE)
- local_frontend = orig_frontend;
- else
- local_frontend = FRONTEND_NONE;
- }
-#else
- local_frontend++;
-#endif
- if(local_frontend >= FRONTEND_count)
- local_frontend = 0;
- strn0cpy(xc.local_frontend, xc.s_frontends[local_frontend], sizeof(xc.local_frontend));
- cXinelibDevice::Instance().ConfigureWindow(
- xc.fullscreen, xc.width, xc.height, xc.modeswitch, xc.modeline,
- xc.display_aspect, xc.scale_video, xc.field_order);
- }
- Message = cString::sprintf("%s %s %s", tr("Local Frontend"),
- OnlyInfo ? ":" : "->",
- xc.s_frontendNames[local_frontend]);
- }
- break;
-
- case HOTKEY_NEXT_ASPECT:
- /* auto, 4:3, 16:9, ... */
- if(!OnlyInfo) {
- xc.display_aspect = (xc.display_aspect < ASPECT_count-1) ? xc.display_aspect+1 : 0;
- cXinelibDevice::Instance().ConfigureWindow(xc.fullscreen, xc.width, xc.height,
- xc.modeswitch, xc.modeline, xc.display_aspect,
- xc.scale_video, xc.field_order);
- }
- Message = cString::sprintf("%s %s %s", tr("Aspect ratio"),
- OnlyInfo ? ":" : "->",
- tr(xc.s_aspects[xc.display_aspect]));
- break;
-
- case HOTKEY_TOGGLE_VO_ASPECT:
- /* auto, square, 4:3, anamorphic or DVB */
- if(!OnlyInfo) {
- xc.vo_aspect_ratio = (xc.vo_aspect_ratio < VO_ASPECT_count-1) ? xc.vo_aspect_ratio + 1 : 0;
- cXinelibDevice::Instance().ConfigureVideo(xc.hue, xc.saturation, xc.brightness, xc.sharpness,
- xc.noise_reduction, xc.contrast, xc.overscan,
- xc.vo_aspect_ratio);
- }
- Message = cString::sprintf("%s %s %s", tr("Video aspect ratio"),
- OnlyInfo ? ":" : "->",
- tr(xc.s_vo_aspects[xc.vo_aspect_ratio]));
- break;
-
- case HOTKEY_TOGGLE_CROP:
- /* off, force, auto */
- if(!OnlyInfo) {
- if(!xc.autocrop) {
- xc.autocrop = 1;
- xc.autocrop_autodetect = 1;
- } else if(xc.autocrop_autodetect) {
- xc.autocrop_autodetect = 0;
- } else {
- xc.autocrop = 0;
- }
- cXinelibDevice::Instance().ConfigurePostprocessing("autocrop",
- xc.autocrop ? true : false,
- xc.AutocropOptions());
- }
-
- Message = cString::sprintf("%s %s %s", tr("Crop letterbox 4:3 to 16:9"),
- OnlyInfo ? ":" : "->",
- !xc.autocrop ? tr("Off") : xc.autocrop_autodetect ? tr("automatic") : tr("On"));
- break;
-
- case HOTKEY_DEINTERLACE:
- {
- /* off, on */
- int off = !strcmp(xc.deinterlace_method, "none");
- if(!OnlyInfo) {
- off = !off;
- if(off)
- strcpy(xc.deinterlace_method, "none");
- else
- strcpy(xc.deinterlace_method, "tvtime");
- cXinelibDevice::Instance().ConfigurePostprocessing(xc.deinterlace_method, xc.audio_delay,
- compression, xc.audio_equalizer,
- xc.audio_surround, xc.speaker_type);
- }
- Message = cString::sprintf("%s %s %s", tr("Deinterlacing"),
- OnlyInfo ? ":" : "->",
- tr(off ? "Off":"On"));
- }
- break;
-
- case HOTKEY_UPMIX:
- /* off, on */
- if(!OnlyInfo) {
- xc.audio_upmix = xc.audio_upmix ? 0 : 1;
- cXinelibDevice::Instance().ConfigurePostprocessing(
- "upmix", xc.audio_upmix ? true : false, NULL);
- }
- Message = cString::sprintf("%s %s %s",
- tr("Upmix stereo to 5.1"),
- OnlyInfo ? ":" : "->",
- tr(xc.audio_upmix ? "On" : "Off"));
- break;
-
- case HOTKEY_DOWNMIX:
- /* off, on */
- if(!OnlyInfo) {
- xc.audio_surround = xc.audio_surround ? 0 : 1;
- cXinelibDevice::Instance().ConfigurePostprocessing(
- xc.deinterlace_method, xc.audio_delay, xc.audio_compression,
- xc.audio_equalizer, xc.audio_surround, xc.speaker_type);
- }
- Message = cString::sprintf("%s %s %s",
- tr("Downmix AC3 to surround"),
- OnlyInfo ? ":" : "->",
- tr(xc.audio_surround ? "On":"Off"));
- break;
-
- case HOTKEY_PLAYLIST:
- /* Start replaying playlist or file pointed by
- symlink $(CONFDIR)/plugins/xineliboutput/default_playlist */
- {
- struct stat st;
- cString file = cString::sprintf("%s%s", cPlugin::ConfigDirectory("xineliboutput"), "/default_playlist");
- if (lstat(file, &st) == 0) {
- if (S_ISLNK(st.st_mode)) {
- cString buffer(ReadLink(file), true);
- if (!*buffer || stat(buffer, &st)) {
- Message = tr("Default playlist not found");
- } else {
- LOGDBG("Replaying default playlist: %s", *file);
- cControl::Shutdown();
- cControl::Launch(new cXinelibPlayerControl(CloseOsd, buffer));
- }
- } else {
- Message = tr("Default playlist is not symlink");
- }
- } else {
- Message = tr("Default playlist not defined");
- }
- }
- break;
-
- case HOTKEY_ADELAY_UP:
- /* audio delay up */
- if(!OnlyInfo) {
- xc.audio_delay++;
- cXinelibDevice::Instance().ConfigurePostprocessing(xc.deinterlace_method, xc.audio_delay,
- xc.audio_compression, xc.audio_equalizer,
- xc.audio_surround, xc.speaker_type);
- }
- Message = cString::sprintf("%s %s %d %s", tr("Delay"),
- OnlyInfo ? ":" : "->",
- xc.audio_delay, tr("ms"));
- break;
-
- case HOTKEY_ADELAY_DOWN:
- /* audio delay up */
- if(!OnlyInfo) {
- xc.audio_delay--;
- cXinelibDevice::Instance().ConfigurePostprocessing(xc.deinterlace_method, xc.audio_delay,
- xc.audio_compression, xc.audio_equalizer,
- xc.audio_surround, xc.speaker_type);
- }
- Message = cString::sprintf("%s %s %d %s", tr("Delay"),
- OnlyInfo ? ":" : "->",
- xc.audio_delay, tr("ms"));
- break;
-
- default:
- Message = cString::sprintf(tr("xineliboutput: hotkey %s not binded"), cKey::ToString(Key));
- break;
- }
-
- if(*Message) {
- if(!g_PendingMenuAction &&
- !cRemote::HasKeys() &&
- cRemote::CallPlugin("xineliboutput"))
- g_PendingMenuAction = new cDisplayMessage(Message);
- }
-
- g_LastHotkeyTime = now;
- g_LastHotkey = Key;
-
- return NewState;
-}