summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorphintuka <phintuka>2006-07-21 23:01:55 +0000
committerphintuka <phintuka>2006-07-21 23:01:55 +0000
commitf96ac8223fe87f6abe4d0738e37393e32344580b (patch)
tree6cf8b13276b85d7e79e02ab55877a49c2371e5dd
parent45cc8c729c0790336f69288fc032014cbf9f2d14 (diff)
downloadxineliboutput-f96ac8223fe87f6abe4d0738e37393e32344580b.tar.gz
xineliboutput-f96ac8223fe87f6abe4d0738e37393e32344580b.tar.bz2
Support direct DVD playback from filesystem (media player / file browser)
Support DVD playback from frontend local DVD device Added menu to select DVD SPU stream (used when DVD SPUs are present in VDR recording, ex. when .VOB files are just renamed to .vdr files)
-rw-r--r--menu.c126
1 files changed, 106 insertions, 20 deletions
diff --git a/menu.c b/menu.c
index 991d68e8..51265cc5 100644
--- a/menu.c
+++ b/menu.c
@@ -4,7 +4,7 @@
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
- * $Id: menu.c,v 1.1 2006-06-03 10:01:17 phintuka Exp $
+ * $Id: menu.c,v 1.2 2006-07-21 23:01:55 phintuka Exp $
*
*/
@@ -38,7 +38,7 @@ class cMenuBrowseFiles : public cOsdMenu
char *m_ConfigLastDir;
virtual bool ScanDir(const char *DirName);
- virtual eOSState Open(bool Parent=false);
+ virtual eOSState Open(bool ForceOpen = false, bool Parent = false);
virtual eOSState Delete(void);
virtual eOSState Info(void);
virtual void Set(void);
@@ -57,10 +57,11 @@ static char *ParentDir(const char *dir)
{
char *result = strdup(dir);
char *pt = strrchr(result, '/');
- if(pt)
+ if(pt) {
*(pt+1)=0;
- if(pt != result)
- *pt = 0;
+ if(pt != result)
+ *pt = 0;
+ }
return result;
}
@@ -95,6 +96,11 @@ void cMenuBrowseFiles::Set(void)
if(!m_CurrentDir)
m_CurrentDir = strdup(m_ConfigLastDir);
+ if(m_CurrentDir[0] != '/') {
+ free(m_CurrentDir);
+ m_CurrentDir = strdup("/video");
+ }
+
// find deepest accessible directory from path
while(!ScanDir(m_CurrentDir) && strlen(m_CurrentDir) > 1) {
char *n = ParentDir(m_CurrentDir);
@@ -142,9 +148,12 @@ void cMenuBrowseFiles::StoreConfig(void)
void cMenuBrowseFiles::SetHelpButtons(void)
{
- bool isDir = !GetCurrent() || GetCurrent()->IsDir();
- SetHelp(tr("Button$Select"), strlen(m_CurrentDir) > 1 ? "[..]" : NULL,
- isDir ? NULL : tr("Button$Delete"), isDir ? NULL : tr("Button$Info"));
+ bool isDir = !GetCurrent() || GetCurrent()->IsDir();
+ bool isDvd = GetCurrent() && GetCurrent()->IsDvd();
+ SetHelp(isDvd ? tr("Button$Open") : tr("Button$Play"),
+ strlen(m_CurrentDir) > 1 ? "[..]" : NULL,
+ (isDir && !isDvd) ? NULL : tr("Button$Delete"),
+ isDir ? NULL : tr("Button$Info"));
Display();
}
@@ -176,7 +185,7 @@ eOSState cMenuBrowseFiles::Delete(void)
return osContinue;
}
-eOSState cMenuBrowseFiles::Open(bool Parent)
+eOSState cMenuBrowseFiles::Open(bool ForceOpen, bool Parent)
{
if(!GetCurrent()) {
return osContinue;
@@ -192,6 +201,15 @@ eOSState cMenuBrowseFiles::Open(bool Parent)
/* directory */
} else if (GetCurrent()->IsDir()) {
+
+ if(!ForceOpen && GetCurrent()->IsDvd()) {
+ /* play dvd */
+ char *f = NULL;
+ asprintf(&f, "dvd://%s/%s", m_CurrentDir, GetCurrent()->Name());
+ cControl::Launch(new cXinelibDvdPlayerControl(f));
+ free(f);
+ return osEnd;
+ }
const char *d = GetCurrent()->Name();
char *buffer = NULL;
asprintf(&buffer, "%s/%s", m_CurrentDir, d);
@@ -199,7 +217,7 @@ eOSState cMenuBrowseFiles::Open(bool Parent)
m_CurrentDir = buffer;
Set();
return osContinue;
-
+
/* regular file */
} else {
char *f = NULL;
@@ -296,7 +314,7 @@ bool cMenuBrowseFiles::ScanDir(const char *DirName)
struct dirent *e;
while ((e = readdir(d)) != NULL) {
if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
- char *buffer;
+ char *buffer = NULL;
asprintf(&buffer, "%s/%s", DirName, e->d_name);
struct stat st;
if (stat(buffer, &st) == 0) {
@@ -316,9 +334,24 @@ bool cMenuBrowseFiles::ScanDir(const char *DirName)
// folders
if (S_ISDIR(st.st_mode)) {
if(m_Images)
- Add(new cFileListItem(e->d_name,true));
- else
- Add(new cFileListItem(e->d_name,true,false,false));
+ Add(new cFileListItem(e->d_name, true));
+ else {
+ // check if DVD
+ bool dvd = false;
+ free(buffer);
+ buffer = NULL;
+ asprintf(&buffer, "%s/%s/VIDEO_TS/VIDEO_TS.IFO", DirName, e->d_name);
+ if (stat(buffer, &st) == 0)
+ dvd = true;
+ else {
+ free(buffer);
+ buffer = NULL;
+ asprintf(&buffer, "%s/%s/video_ts/video_ts.ifo", DirName, e->d_name);
+ if (stat(buffer, &st) == 0)
+ dvd = true;
+ }
+ Add(new cFileListItem(e->d_name, true, false, false, dvd));
+ }
// regular files
} else {
@@ -360,10 +393,10 @@ eOSState cMenuBrowseFiles::ProcessKey(eKeys Key)
if (state == osUnknown) {
switch (Key) {
- case kPlay: if(!GetCurrent()->IsDir()) return Open();
- case kOk:
- case kRed: return Open();
- case kGreen: return Open(true);
+ case kPlay:
+ case kOk: return Open();
+ case kRed: return Open(true);
+ case kGreen: return Open(false, true);
case kYellow: return Delete();
case kBlue: return Info();
default: break;
@@ -555,6 +588,54 @@ eOSState cTestBitmap::ProcessKey(eKeys key)
return state;
}
+//-------------------------- cDvdSpuTrackSelect ------------------------------
+
+class cDvdSpuTrackSelect : public cOsdMenu
+{
+ public:
+ cDvdSpuTrackSelect(void);
+ virtual eOSState ProcessKey(eKeys Key);
+};
+
+cDvdSpuTrackSelect::cDvdSpuTrackSelect(void) :
+ cOsdMenu(tr("Select DVD SPU Track"))
+{
+ int count = cXinelibDevice::Instance().NumDvdSpuTracks();
+ int id = 0;
+ int current = cXinelibDevice::Instance().GetCurrentDvdSpuTrack();
+ Add(new cOsdItem("None", osUser1));
+ while(count && id < 64) {
+ if(cXinelibDevice::Instance().HasDvdSpuTrack(id)) {
+ char name[64];
+ sprintf(name, "Track %d", id);
+ Add(new cOsdItem(name, osUser1));
+ count--;
+ if(id == current)
+ SetCurrent(Get(Count()-1));
+ }
+ id++;
+ }
+}
+
+eOSState cDvdSpuTrackSelect::ProcessKey(eKeys Key)
+{
+ eOSState state = cOsdMenu::ProcessKey(Key);
+
+ switch(state) {
+ case osUser1:
+ {
+ const char *txt = Get(Current())->Text();
+ int id = -1; /* -> DVD SPU off */
+ sscanf(txt, "Track %d", &id);
+ cXinelibDevice::Instance().SetCurrentDvdSpuTrack(id);
+ AddSubMenu(new cMenuBrowseFiles(tr("Play file")));
+ return osEnd;
+ }
+ default: break;
+ }
+ return state;
+}
+
//----------------------------- cMenuXinelib ---------------------------------
static cOsdItem *NewTitle(const char *s)
@@ -583,8 +664,10 @@ cMenuXinelib::cMenuXinelib()
Add(new cOsdItem(tr("Play file >>"), osUser1));
Add(new cOsdItem(tr("View images >>"), osUser2));
-#if 0
Add(new cOsdItem(tr("Play remote DVD >>"), osUser4));
+#if 1
+ if(cXinelibDevice::Instance().NumDvdSpuTracks() > 0)
+ Add(new cOsdItem(tr("Select DVD SPU Track >>"), osUser5));
#endif
#ifdef ENABLE_TEST_POSTPLUGINS
#warning Experimental post plugins enabled !
@@ -667,8 +750,11 @@ eOSState cMenuXinelib::ProcessKey(eKeys Key)
}
state = osContinue;
case osUser4:
- cControl::Launch(new cXinelibPlayerControl("dvd://"));
+ cControl::Launch(new cXinelibDvdPlayerControl("dvd://"));
return osEnd;
+ case osUser5:
+ AddSubMenu(new cDvdSpuTrackSelect());
+ return osContinue;
case osUser8:
if(!g_PendingMenuAction) {
g_PendingMenuAction = new cTestGrayscale();