mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	Improved DVD handling
This commit is contained in:
		
							
								
								
									
										41
									
								
								dvd.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								dvd.c
									
									
									
									
									
								
							@@ -6,7 +6,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * Initially written by Andreas Schultz <aschultz@warp10.net>
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: dvd.c 1.1 2001/08/03 12:35:38 kls Exp $
 | 
			
		||||
 * $Id: dvd.c 1.2 2001/08/05 15:00:45 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//XXX //#define DVDDEBUG        1
 | 
			
		||||
@@ -46,6 +46,17 @@ cDVD::~cDVD()
 | 
			
		||||
  Close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int cDVD::Command(int Cmd)
 | 
			
		||||
{
 | 
			
		||||
  int result = -1;
 | 
			
		||||
  int f;
 | 
			
		||||
  if ((f = open(deviceName, O_RDONLY | O_NONBLOCK)) > 0) {
 | 
			
		||||
     result = ioctl(f, Cmd, 0);
 | 
			
		||||
     close(f);
 | 
			
		||||
     }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cDVD::SetDeviceName(const char *DeviceName)
 | 
			
		||||
{
 | 
			
		||||
  deviceName = strdup(DeviceName);
 | 
			
		||||
@@ -56,6 +67,23 @@ const char *cDVD::DeviceName(void)
 | 
			
		||||
  return deviceName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cDVD::DriveExists(void)
 | 
			
		||||
{
 | 
			
		||||
  return access(deviceName, F_OK) == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cDVD::DiscOk(void)
 | 
			
		||||
{
 | 
			
		||||
  return Command(CDROM_DRIVE_STATUS) == CDS_DISC_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cDVD::Eject(void)
 | 
			
		||||
{
 | 
			
		||||
  if (dvdInstance)
 | 
			
		||||
     dvdInstance->Close();
 | 
			
		||||
  Command(CDROMEJECT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cDVD::Open(void)
 | 
			
		||||
{
 | 
			
		||||
  if (!dvd)
 | 
			
		||||
@@ -81,17 +109,6 @@ void cDVD::Close(void)
 | 
			
		||||
  dvd = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cDVD::Eject(void)
 | 
			
		||||
{
 | 
			
		||||
  int fd;
 | 
			
		||||
  Close();
 | 
			
		||||
  // ignore all errors try our best :-)
 | 
			
		||||
  if ((fd = open(deviceName, O_RDONLY)) > 0) {
 | 
			
		||||
     ioctl(fd, CDROMEJECT, 0);
 | 
			
		||||
     close(fd);
 | 
			
		||||
     }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ifo_handle_t *cDVD::openVMG(void)
 | 
			
		||||
{
 | 
			
		||||
  if (!isValid())
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								dvd.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								dvd.h
									
									
									
									
									
								
							@@ -6,7 +6,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * Initially written by Andreas Schultz <aschultz@warp10.net>
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: dvd.h 1.1 2001/08/03 12:35:42 kls Exp $
 | 
			
		||||
 * $Id: dvd.h 1.2 2001/08/05 15:00:23 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __DVD_H
 | 
			
		||||
@@ -28,19 +28,22 @@ private:
 | 
			
		||||
  ifo_handle_t *vmg_file;
 | 
			
		||||
  ifo_handle_t *vts_file;
 | 
			
		||||
  int titleset;
 | 
			
		||||
  static int Command(int Cmd);
 | 
			
		||||
public:
 | 
			
		||||
  cDVD(void);
 | 
			
		||||
  ~cDVD();
 | 
			
		||||
  static void SetDeviceName(const char *DeviceName);
 | 
			
		||||
  static const char *DeviceName(void);
 | 
			
		||||
  static bool DriveExists(void);
 | 
			
		||||
  static bool DiscOk(void);
 | 
			
		||||
  static void Eject(void);
 | 
			
		||||
  void Open(void);
 | 
			
		||||
  void Close(void);
 | 
			
		||||
  void Eject(void);
 | 
			
		||||
  bool isValid(void) { return (dvd != NULL); }
 | 
			
		||||
  ifo_handle_t *openVMG(void);
 | 
			
		||||
  ifo_handle_t *openVTS(int TitleSet);
 | 
			
		||||
  dvd_file_t *openTitle(int Title, dvd_read_domain_t domain);
 | 
			
		||||
  static cDVD *getDVD(void);
 | 
			
		||||
  static void SetDeviceName(const char *DeviceName);
 | 
			
		||||
  static const char *DeviceName(void);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
#endif //__DVD_H
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								menu.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								menu.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: menu.c 1.93 2001/08/05 12:47:14 kls Exp $
 | 
			
		||||
 * $Id: menu.c 1.94 2001/08/05 15:11:35 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "menu.h"
 | 
			
		||||
@@ -1794,6 +1794,7 @@ cMenuMain::cMenuMain(bool Replaying)
 | 
			
		||||
  Add(new cOsdItem(hk(tr("Channels")),   osChannels));
 | 
			
		||||
  Add(new cOsdItem(hk(tr("Timers")),     osTimers));
 | 
			
		||||
  Add(new cOsdItem(hk(tr("Recordings")), osRecordings));
 | 
			
		||||
  if (cDVD::DriveExists())
 | 
			
		||||
  Add(new cOsdItem(hk(tr("DVD")),        osDVD));
 | 
			
		||||
  Add(new cOsdItem(hk(tr("Setup")),      osSetup));
 | 
			
		||||
  if (Commands.Count())
 | 
			
		||||
@@ -1809,7 +1810,7 @@ cMenuMain::cMenuMain(bool Replaying)
 | 
			
		||||
        }
 | 
			
		||||
  if (cVideoCutter::Active())
 | 
			
		||||
     Add(new cOsdItem(hk(tr(" Cancel editing")), osCancelEdit));
 | 
			
		||||
  SetHelp(tr("Record"), cDvbApi::PrimaryDvbApi->CanToggleAudioTrack() ? tr("Language") : NULL, /*XXX only if DVD loaded?*/tr("Eject DVD"), cReplayControl::LastReplayed() ? tr("Resume") : NULL);
 | 
			
		||||
  SetHelp(tr("Record"), cDvbApi::PrimaryDvbApi->CanToggleAudioTrack() ? tr("Language") : NULL, cDVD::DiscOk() ? tr("Eject DVD") : NULL, cReplayControl::LastReplayed() ? tr("Resume") : NULL);
 | 
			
		||||
  Display();
 | 
			
		||||
  lastActivity = time(NULL);
 | 
			
		||||
  SetHasHotkeys();
 | 
			
		||||
@@ -1865,9 +1866,8 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
 | 
			
		||||
                                }
 | 
			
		||||
                             break;
 | 
			
		||||
               case kYellow: if (!HasSubMenu()) {
 | 
			
		||||
                                cDVD *dvd;
 | 
			
		||||
                                if ((dvd = cDVD::getDVD())) {
 | 
			
		||||
                                   dvd->Eject();
 | 
			
		||||
                                if (cDVD::DiscOk()) {
 | 
			
		||||
                                   cDVD::Eject();
 | 
			
		||||
                                   state = osEnd;
 | 
			
		||||
                                   }
 | 
			
		||||
                                }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								vdr.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								vdr.c
									
									
									
									
									
								
							@@ -22,7 +22,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * The project's page is at http://www.cadsoft.de/people/kls/vdr
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: vdr.c 1.59 2001/08/02 13:48:51 kls Exp $
 | 
			
		||||
 * $Id: vdr.c 1.60 2001/08/05 12:58:12 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <getopt.h>
 | 
			
		||||
@@ -163,6 +163,10 @@ int main(int argc, char *argv[])
 | 
			
		||||
                          optarg[strlen(optarg) - 1] = 0;
 | 
			
		||||
                    break;
 | 
			
		||||
          case 'V': cDVD::SetDeviceName(optarg);
 | 
			
		||||
                    if (!cDVD::DriveExists()) {
 | 
			
		||||
                       fprintf(stderr, "vdr: DVD drive not found: %s\n", optarg);
 | 
			
		||||
                       return 2;
 | 
			
		||||
                       }
 | 
			
		||||
                    break;
 | 
			
		||||
          case 'w': if (isnumber(optarg)) {
 | 
			
		||||
                       int t = atoi(optarg);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user