diff -ruN dvd-cvs20071024/control-dvd.c dvd-cvs20071024-patched/control-dvd.c --- dvd-cvs20071024/control-dvd.c 2007-09-18 22:26:17.000000000 +0200 +++ dvd-cvs20071024-patched/control-dvd.c 2007-10-24 23:20:07.000000000 +0200 @@ -20,6 +20,7 @@ #include "tools-dvd.h" #include "player-dvd.h" #include "control-dvd.h" +#include "dvddev.h" #define MENUTIMEOUT 120 // seconds #define MAXWAIT4EPGINFO 10 // seconds @@ -51,6 +52,7 @@ inputActive = NoneInput; inputHide = true; forceDvdNavigation = false; + cDVD::SpeedControl(2); player->setController(this); cStatus::MsgReplaying(this, "DVD", NULL, true); } @@ -63,6 +65,7 @@ assert(dvd_active == true); dvd_active = false; delete player; + cDVD::SpeedControl(0); } bool cDvdPlayerControl::Active(void) diff -ruN dvd-cvs20071024/dvddev.c dvd-cvs20071024-patched/dvddev.c --- dvd-cvs20071024/dvddev.c 2004-06-30 08:18:24.000000000 +0200 +++ dvd-cvs20071024-patched/dvddev.c 2007-10-24 23:22:15.000000000 +0200 @@ -21,6 +21,7 @@ #endif #include "dvddev.h" +#include #ifndef __QNXNTO__ #include @@ -70,6 +71,73 @@ return result; } +bool cDVD::SpeedControl(int speed) +{ + int fd; + unsigned long rw_size; + unsigned char buffer[28]; + struct cdrom_generic_command cgc; + struct request_sense sense; + + fd = open(cDVD::DeviceName(), O_RDONLY | O_NONBLOCK); + if (fd < 0) { + esyslog("SpeedControl() Can't open device %s", cDVD::DeviceName()); + return false; + } + + memset(&cgc, 0, sizeof(cgc)); + memset(&sense, 0, sizeof(sense)); + memset(&buffer, 0, sizeof(buffer)); + + /* SET STREAMING command */ + cgc.cmd[0] = 0xb6; + /* 28 byte parameter list length */ + cgc.cmd[10] = 28; + + cgc.sense = &sense; + cgc.buffer = buffer; + cgc.buflen = sizeof(buffer); + cgc.data_direction = CGC_DATA_WRITE; + cgc.quiet = 1; + + if (speed == 0) buffer[0] = 4;// set Restore Drive Defaults + + buffer[8] = 0xff; + buffer[9] = 0xff; + buffer[10] = 0xff; + buffer[11] = 0xff; + rw_size = 177 * speed; + + /* read size */ + buffer[12] = (rw_size >> 24) & 0xff; + buffer[13] = (rw_size >> 16) & 0xff; + buffer[14] = (rw_size >> 8) & 0xff; + buffer[15] = rw_size & 0xff; + + /* read time 1 sec. */ + buffer[18] = 0x03; + buffer[19] = 0xE8; + + /* write size */ + buffer[20] = (rw_size >> 24) & 0xff; + buffer[21] = (rw_size >> 16) & 0xff; + buffer[22] = (rw_size >> 8) & 0xff; + buffer[23] = rw_size & 0xff; + + /* write time 1 sec. */ + buffer[26] = 0x03; + buffer[27] = 0xE8; + + if (ioctl(fd, CDROM_SEND_PACKET, &cgc) != 0) + if (ioctl(fd, CDROM_SELECT_SPEED, speed) != 0) { + esyslog("SpeedControl() Command failed"); + return false; + } + + close(fd); + return true; +} + void cDVD::SetDeviceName(const char *DeviceName) { deviceName = strdup(DeviceName); diff -ruN dvd-cvs20071024/dvddev.h dvd-cvs20071024-patched/dvddev.h --- dvd-cvs20071024/dvddev.h 2004-06-11 17:27:05.000000000 +0200 +++ dvd-cvs20071024-patched/dvddev.h 2007-10-24 23:19:56.000000000 +0200 @@ -20,6 +20,7 @@ public: cDVD(void); ~cDVD(); + static bool SpeedControl(int speed); static void SetDeviceName(const char *DeviceName); static const char *DeviceName(void); static bool DriveExists(void);