diff options
Diffstat (limited to 'filebrowser.c')
-rw-r--r-- | filebrowser.c | 202 |
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; |