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);
|