summaryrefslogtreecommitdiff
path: root/filebrowser.c
diff options
context:
space:
mode:
Diffstat (limited to 'filebrowser.c')
-rw-r--r--filebrowser.c202
1 files changed, 157 insertions, 45 deletions
diff --git a/filebrowser.c b/filebrowser.c
index c187b40..287e7a6 100644
--- a/filebrowser.c
+++ b/filebrowser.c
@@ -2,6 +2,12 @@
#include <string>
#include <algorithm>
+#ifdef USE_DISC
+#include <cdio/cdio.h>
+#include <sys/mount.h>
+#include <libmount/libmount.h>
+#endif
+
#include "filebrowser.h"
#include "mpv_service.h"
@@ -12,10 +18,11 @@ using std::sort;
string cMpvFilebrowser::currentDir = "";
string cMpvFilebrowser::currentItem = "";
-cMpvFilebrowser::cMpvFilebrowser(string RootDir)
+cMpvFilebrowser::cMpvFilebrowser(string RootDir, string DiscDevice)
:cOsdMenu("Filebrowser")
{
rootDir = RootDir;
+ discDevice = DiscDevice;
if (currentDir == "")
currentDir = rootDir;
ShowDirectory(currentDir);
@@ -61,7 +68,11 @@ void cMpvFilebrowser::ShowDirectory(string Path)
if (rootDir != Path)
MenuTitle += " (" + Path.substr(rootDir.size() + 1, string::npos) + ")";
SetTitle(MenuTitle.c_str());
+#ifdef USE_DISC
+ SetHelp("Disc", NULL, "Shuffle", NULL);
+#else
SetHelp(NULL, NULL, "Shuffle", NULL);
+#endif
Display();
}
@@ -75,54 +86,66 @@ void cMpvFilebrowser::AddItem(string Path, string Text, bool IsDir)
eOSState cMpvFilebrowser::ProcessKey(eKeys Key)
{
- //TODO since we get more and more Keys we should use switch again
- if (Key == kOk)
+ string newPath = "";
+ cMpvFilebrowserMenuItem *item;
+ eOSState State;
+ switch (Key)
{
- cMpvFilebrowserMenuItem *item = (cMpvFilebrowserMenuItem *) Get(Current());
- string newPath = item->Path() + "/" + item->Text();
- if (item->IsDirectory())
- {
- currentDir = newPath;
- currentItem = "";
- ShowDirectory(newPath);
+ case kOk:
+ item = (cMpvFilebrowserMenuItem *) Get(Current());
+ newPath = item->Path() + "/" + item->Text();
+ if (item->IsDirectory())
+ {
+ currentDir = newPath;
+ currentItem = "";
+ ShowDirectory(newPath);
+ return osContinue;
+ }
+ else
+ {
+ currentItem = item->Text();
+ PlayFile(newPath);
+ return osEnd;
+ }
+ break;
+
+ case kBack:
+ // we reached our root, so don't go back further and let VDR handle this (close submenu)
+ if (currentDir == rootDir)
+ return cOsdMenu::ProcessKey(Key);
+ currentItem = currentDir.substr(currentDir.find_last_of("/")+1, string::npos);
+ currentDir = currentDir.substr(0,currentDir.find_last_of("/"));
+ ShowDirectory(currentDir);
return osContinue;
- }
- else
- {
+
+ case kLeft:
+ case kRight:
+ case kUp:
+ case kDown:
+ // first let VDR handle those keys or we get the previous item
+ State = cOsdMenu::ProcessKey(Key);
+ item = (cMpvFilebrowserMenuItem *) Get(Current());
currentItem = item->Text();
- PlayFile(newPath);
- return osEnd;
- }
- }
- else if (Key == kBack)
- {
- // we reached our root, so don't go back further and let VDR handle this (close submenu)
- if (currentDir == rootDir)
- return cOsdMenu::ProcessKey(Key);
- currentItem = currentDir.substr(currentDir.find_last_of("/")+1, string::npos);
- currentDir = currentDir.substr(0,currentDir.find_last_of("/"));
- ShowDirectory(currentDir);
- return osContinue;
- }
- else if (Key == kLeft || Key == kRight || Key == kUp || Key == kDown)
- {
- // first let VDR handle those keys or we get the previous item
- eOSState State = cOsdMenu::ProcessKey(Key);
- cMpvFilebrowserMenuItem *item = (cMpvFilebrowserMenuItem *) Get(Current());
- currentItem = item->Text();
return State;
- }
- else if (Key == kYellow)
- {
- cMpvFilebrowserMenuItem *item = (cMpvFilebrowserMenuItem *) Get(Current());
- string newPath = item->Path() + "/" + item->Text();
- if (!item->IsDirectory())
- {
- currentItem = item->Text();
- PlayFile(newPath, true);
- return osEnd;
- }
- return osContinue;
+
+ case kRed:
+ if (PlayDisc())
+ return osEnd;
+ break;
+
+ case kYellow:
+ item = (cMpvFilebrowserMenuItem *) Get(Current());
+ newPath = item->Path() + "/" + item->Text();
+ if (!item->IsDirectory())
+ {
+ currentItem = item->Text();
+ PlayFile(newPath, true);
+ return osEnd;
+ }
+ return osContinue;
+
+ default:
+ break;
}
return cOsdMenu::ProcessKey(Key);
@@ -152,6 +175,95 @@ bool cMpvFilebrowser::PlayFile(string Filename, bool Shuffle)
return false;
}
+// returns true if play is started, false otherwise
+bool cMpvFilebrowser::PlayDisc()
+{
+#ifdef USE_DISC
+ CdIo_t *hCdio = cdio_open(discDevice.c_str(), DRIVER_DEVICE);
+ discmode_t DiscMode = cdio_get_discmode(hCdio);
+ cdio_destroy(hCdio);
+ switch (DiscMode)
+ {
+ case CDIO_DISC_MODE_CD_DA:
+ PlayFile("cdda://");
+ break;
+
+ case CDIO_DISC_MODE_DVD_ROM:
+ case CDIO_DISC_MODE_DVD_RAM:
+ case CDIO_DISC_MODE_DVD_R:
+ case CDIO_DISC_MODE_DVD_RW:
+ case CDIO_DISC_MODE_HD_DVD_ROM:
+ case CDIO_DISC_MODE_HD_DVD_RAM:
+ case CDIO_DISC_MODE_HD_DVD_R:
+ case CDIO_DISC_MODE_DVD_PR:
+ case CDIO_DISC_MODE_DVD_PRW:
+ case CDIO_DISC_MODE_DVD_PRW_DL:
+ case CDIO_DISC_MODE_DVD_PR_DL:
+ case CDIO_DISC_MODE_DVD_OTHER:
+ if (!Mount(discDevice))
+ break;
+ struct stat DirInfo;
+ if (stat("tmp/mpv_mount/VIDEO_TS", &DirInfo) == 0)
+ {
+ Unmount();
+ return PlayFile("dvd://");
+ }
+ else if (stat("tmp/mpv_mount/BDMV", &DirInfo) == 0)
+ {
+ Unmount();
+ return PlayFile("bd://");
+ }
+ Unmount();
+ break;
+
+ case CDIO_DISC_MODE_CD_XA:
+ case CDIO_DISC_MODE_CD_MIXED:
+ case CDIO_DISC_MODE_NO_INFO:
+ case CDIO_DISC_MODE_ERROR:
+ case CDIO_DISC_MODE_CD_I:
+ default:
+ break;
+ }
+#endif
+return false;
+}
+
+bool cMpvFilebrowser::Mount(string Path)
+{
+#ifdef USE_DISC
+ Unmount();
+ string MountPoint = "/tmp/mpv_mount";
+ if (mkdir(MountPoint.c_str(), S_IRWXU))
+ {
+ dsyslog("[mpv] create mount point failed");
+ return false;
+ }
+
+ struct libmnt_context *hMount = mnt_new_context();
+ mnt_context_set_source(hMount, Path.c_str());
+ mnt_context_set_target(hMount, MountPoint.c_str());
+ mnt_context_set_mflags(hMount, MS_RDONLY);
+
+ int res = mnt_context_mount(hMount);
+ mnt_free_context(hMount);
+ if (res == 0)
+ return true;
+#endif
+ return false;
+}
+
+bool cMpvFilebrowser::Unmount()
+{
+#ifdef USE_DISC
+ string MountPoint = "/tmp/mpv_mount";
+ int res = umount(MountPoint.c_str());
+ rmdir(MountPoint.c_str());
+ if (res == 0)
+ return true;
+#endif
+ return false;
+}
+
cMpvFilebrowserMenuItem::cMpvFilebrowserMenuItem(string Path, string Item, bool IsDir)
{
isDir = IsDir;