mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Improved DVD handling
This commit is contained in:
parent
8c1fc6560d
commit
57692504cd
41
dvd.c
41
dvd.c
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Initially written by Andreas Schultz <aschultz@warp10.net>
|
* 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
|
//XXX //#define DVDDEBUG 1
|
||||||
@ -46,6 +46,17 @@ cDVD::~cDVD()
|
|||||||
Close();
|
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)
|
void cDVD::SetDeviceName(const char *DeviceName)
|
||||||
{
|
{
|
||||||
deviceName = strdup(DeviceName);
|
deviceName = strdup(DeviceName);
|
||||||
@ -56,6 +67,23 @@ const char *cDVD::DeviceName(void)
|
|||||||
return deviceName;
|
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)
|
void cDVD::Open(void)
|
||||||
{
|
{
|
||||||
if (!dvd)
|
if (!dvd)
|
||||||
@ -81,17 +109,6 @@ void cDVD::Close(void)
|
|||||||
dvd = NULL;
|
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)
|
ifo_handle_t *cDVD::openVMG(void)
|
||||||
{
|
{
|
||||||
if (!isValid())
|
if (!isValid())
|
||||||
|
11
dvd.h
11
dvd.h
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Initially written by Andreas Schultz <aschultz@warp10.net>
|
* 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
|
#ifndef __DVD_H
|
||||||
@ -28,19 +28,22 @@ private:
|
|||||||
ifo_handle_t *vmg_file;
|
ifo_handle_t *vmg_file;
|
||||||
ifo_handle_t *vts_file;
|
ifo_handle_t *vts_file;
|
||||||
int titleset;
|
int titleset;
|
||||||
|
static int Command(int Cmd);
|
||||||
public:
|
public:
|
||||||
cDVD(void);
|
cDVD(void);
|
||||||
~cDVD();
|
~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 Open(void);
|
||||||
void Close(void);
|
void Close(void);
|
||||||
void Eject(void);
|
|
||||||
bool isValid(void) { return (dvd != NULL); }
|
bool isValid(void) { return (dvd != NULL); }
|
||||||
ifo_handle_t *openVMG(void);
|
ifo_handle_t *openVMG(void);
|
||||||
ifo_handle_t *openVTS(int TitleSet);
|
ifo_handle_t *openVTS(int TitleSet);
|
||||||
dvd_file_t *openTitle(int Title, dvd_read_domain_t domain);
|
dvd_file_t *openTitle(int Title, dvd_read_domain_t domain);
|
||||||
static cDVD *getDVD(void);
|
static cDVD *getDVD(void);
|
||||||
static void SetDeviceName(const char *DeviceName);
|
|
||||||
static const char *DeviceName(void);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__DVD_H
|
#endif //__DVD_H
|
||||||
|
10
menu.c
10
menu.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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"
|
#include "menu.h"
|
||||||
@ -1794,6 +1794,7 @@ cMenuMain::cMenuMain(bool Replaying)
|
|||||||
Add(new cOsdItem(hk(tr("Channels")), osChannels));
|
Add(new cOsdItem(hk(tr("Channels")), osChannels));
|
||||||
Add(new cOsdItem(hk(tr("Timers")), osTimers));
|
Add(new cOsdItem(hk(tr("Timers")), osTimers));
|
||||||
Add(new cOsdItem(hk(tr("Recordings")), osRecordings));
|
Add(new cOsdItem(hk(tr("Recordings")), osRecordings));
|
||||||
|
if (cDVD::DriveExists())
|
||||||
Add(new cOsdItem(hk(tr("DVD")), osDVD));
|
Add(new cOsdItem(hk(tr("DVD")), osDVD));
|
||||||
Add(new cOsdItem(hk(tr("Setup")), osSetup));
|
Add(new cOsdItem(hk(tr("Setup")), osSetup));
|
||||||
if (Commands.Count())
|
if (Commands.Count())
|
||||||
@ -1809,7 +1810,7 @@ cMenuMain::cMenuMain(bool Replaying)
|
|||||||
}
|
}
|
||||||
if (cVideoCutter::Active())
|
if (cVideoCutter::Active())
|
||||||
Add(new cOsdItem(hk(tr(" Cancel editing")), osCancelEdit));
|
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();
|
Display();
|
||||||
lastActivity = time(NULL);
|
lastActivity = time(NULL);
|
||||||
SetHasHotkeys();
|
SetHasHotkeys();
|
||||||
@ -1865,9 +1866,8 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kYellow: if (!HasSubMenu()) {
|
case kYellow: if (!HasSubMenu()) {
|
||||||
cDVD *dvd;
|
if (cDVD::DiscOk()) {
|
||||||
if ((dvd = cDVD::getDVD())) {
|
cDVD::Eject();
|
||||||
dvd->Eject();
|
|
||||||
state = osEnd;
|
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
|
* 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>
|
#include <getopt.h>
|
||||||
@ -163,6 +163,10 @@ int main(int argc, char *argv[])
|
|||||||
optarg[strlen(optarg) - 1] = 0;
|
optarg[strlen(optarg) - 1] = 0;
|
||||||
break;
|
break;
|
||||||
case 'V': cDVD::SetDeviceName(optarg);
|
case 'V': cDVD::SetDeviceName(optarg);
|
||||||
|
if (!cDVD::DriveExists()) {
|
||||||
|
fprintf(stderr, "vdr: DVD drive not found: %s\n", optarg);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'w': if (isnumber(optarg)) {
|
case 'w': if (isnumber(optarg)) {
|
||||||
int t = atoi(optarg);
|
int t = atoi(optarg);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user