summaryrefslogtreecommitdiff
path: root/plugins/dvd/dvd-cvs20071024_speedcontrol.diff
blob: 2dd21a9825e554e440578f9d7883eefd998bd52c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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 <vdr/tools.h>
 
 #ifndef __QNXNTO__
 #include <linux/cdrom.h>
@@ -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);