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:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
|
diff -Nu dvd.old/i18n.c dvd/i18n.c
--- dvd.old/i18n.c 2007-09-16 18:36:41.000000000 +0200
+++ dvd/i18n.c 2008-01-11 10:44:40.000000000 +0100
@@ -280,6 +280,32 @@
#endif
},
{
+ "Setup.DVD$DVD-ROM Speed", // English
+ "DVD-ROM-Geschwindigkeit", // Deutsch
+ "DVD-ROM Speed", // Slovenski
+ "DVD-ROM Speed", // Italiano
+ "DVD-ROM Speed", // Nederlands
+ "DVD-ROM Speed", // Português
+ "DVD-ROM Speed", // Français
+ "DVD-ROM Speed", // Norsk
+ "DVD-ROM Speed", // suomi
+ "DVD-ROM Speed", // Polski
+ "DVD-ROM Speed", // Español
+ "DVD-ROM Speed", // ÅëëçíéêÜ (Greek)
+ "DVD-ROM Speed", // Svenska
+ "DVD-ROM Speed", // Romaneste
+ "DVD-ROM Speed", // Magyar
+ "DVD-ROM Speed", // Català
+ "DVD-ROM Speed", // ÀãááÚØÙ (Russian)
+ "DVD-ROM Speed", // Hrvatski (Croatian)
+ "DVD-ROM Speed", // Eesti
+ "DVD-ROM Speed", // Dansk
+ "DVD-ROM Speed", // Czech
+#if VDRVERSNUM >= 10502
+ "DVD-ROM Speed" // Türkçe
+#endif
+ },
+ {
"Setup.DVD$Gain (analog)",
"Verstärkung (analog)", // Deutsch
"Ojaèanje (analogno)", // Slovenski
Gemeinsame Unterverzeichnisse: dvd.old/patches und dvd/patches.
diff -Nu dvd.old/player-dvd.c dvd/player-dvd.c
--- dvd.old/player-dvd.c 2007-09-17 21:04:43.000000000 +0200
+++ dvd/player-dvd.c 2008-01-11 10:44:41.000000000 +0100
@@ -35,6 +35,11 @@
#include "control-dvd.h"
#include "dvd.h"
+/* Needed for DvdSetSpeed() */
+#include <linux/cdrom.h>
+#include <scsi/sg.h>
+#include <sys/ioctl.h>
+
/**
* this was "weak"'s solution of a forced
* SPU only stream choice,
@@ -252,6 +257,7 @@
bool cDvdPlayer::HasBitStreamOut = false;
bool cDvdPlayer::HasSoftDeviceOut = false;
bool cDvdPlayer::SoftDeviceOutActive = false;
+bool cDvdPlayer::DvdSetSpeedActive = false;
const int cDvdPlayer::MaxAudioTracks = 0x20;
const int cDvdPlayer::AudioTrackMask = 0x1F;
@@ -565,6 +571,88 @@
#endif
}
+/* This function was inspired by mplayer */
+void cDvdPlayer::DvdSetSpeed(const char *device, int speed)
+{
+#if defined(SG_IO) && defined(GPCMD_SET_STREAMING)
+ int fd;
+ unsigned char buffer[28];
+ unsigned char cmd[12];
+ struct sg_io_hdr sghdr;
+ struct stat st;
+
+ memset(&st, 0, sizeof(st));
+
+ if (stat(device, &st) == -1) {
+ esyslog("ERROR: dvd-plugin: DVD device %s doesn't exist", device);
+ return;
+ }
+
+ if (!S_ISBLK(st.st_mode)) {
+ esyslog("ERROR: dvd-plugin: DVD device %s is not a block device", device);
+ return;
+ }
+
+ switch (speed) {
+ case 0: /* don't touch speed setting */
+ return;
+ case -1: /* restore default value */
+ isyslog("dvd-plugin: Restoring initial DVD drive speed");
+ break;
+ default: /* limit to <speed> KB/s */
+ /* speed times 1350KB/s (DVD single speed) */
+ speed *= 1350;
+ isyslog("dvd-plugin: Limiting speed to %d KB/s", speed);
+ break;
+ }
+
+ memset(&sghdr, 0, sizeof(sghdr));
+ sghdr.interface_id = 'S';
+ sghdr.timeout = 5000;
+ sghdr.dxfer_direction = SG_DXFER_TO_DEV;
+ sghdr.dxfer_len = sizeof(buffer);
+ sghdr.dxferp = buffer;
+ sghdr.cmd_len = sizeof(cmd);
+ sghdr.cmdp = cmd;
+
+ memset(cmd, 0, sizeof(cmd));
+ cmd[0] = GPCMD_SET_STREAMING;
+ cmd[10] = sizeof(buffer);
+
+ memset(buffer, 0, sizeof(buffer));
+
+ if (speed == -1)
+ buffer[0] = 4; /* restore default */
+ else {
+ buffer[8] = 0xff; /* first sector 0, last sector 0xffffffff */
+ buffer[9] = 0xff;
+ buffer[10] = 0xff;
+ buffer[11] = 0xff;
+
+ buffer[12] = buffer[20] = (speed >> 24) & 0xff; /* <speed> kilobyte */
+ buffer[13] = buffer[21] = (speed >> 16) & 0xff;
+ buffer[14] = buffer[22] = (speed >> 8) & 0xff;
+ buffer[15] = buffer[23] = speed & 0xff;
+
+ buffer[18] = buffer[26] = 0x03; /* 1 second */
+ buffer[19] = buffer[27] = 0xe8;
+ }
+
+ if ((fd = open(device, O_RDWR | O_NONBLOCK)) == -1) {
+ esyslog("ERROR: dvd-plugin: Failed to open DVD device %s O_RDWR | O_NONBLOCK", device);
+ return;
+ }
+
+ if (ioctl(fd, SG_IO, &sghdr) < 0)
+ esyslog("ERROR: dvd-plugin: DVD speed limiting failed");
+ else {
+ isyslog("dvd-plugin: DVD speed limiting successful");
+ DvdSetSpeedActive = true;
+ }
+ close(fd);
+#endif
+}
+
void cDvdPlayer::Action(void) {
memset(event_buf, 0, sizeof(uint8_t)*4096);
@@ -590,12 +678,21 @@
}
dsyslog("dvd-plugin: SoftDeviceOutActive=%d, HasSoftDeviceOut=%d", SoftDeviceOutActive, HasSoftDeviceOut);
+ /* Try to reduce drive speed if the user wants us to */
+ if (DVDSetup.Speed)
+ DvdSetSpeed(const_cast<char *>(cDVD::getDVD()->DeviceName()), DVDSetup.Speed);
+
if (dvdnav_open(&nav, const_cast<char *>(cDVD::getDVD()->DeviceName())) != DVDNAV_STATUS_OK) {
Skins.Message(mtError, tr("Error.DVD$Error opening DVD!"));
esyslog("ERROR: dvd-plugin cannot open dvdnav device %s -> input thread ended (pid=%d) !", const_cast<char *>(cDVD::getDVD()->DeviceName()), getpid());
active = running = false;
nav=NULL;
fflush(NULL);
+ /* Try to restore drive speed if it was previously changed */
+ if (DvdSetSpeedActive) {
+ DvdSetSpeed(const_cast<char *>(cDVD::getDVD()->DeviceName()), -1);
+ DvdSetSpeedActive = false;
+ }
return;
}
dvdnav_set_readahead_flag(nav, DVDSetup.ReadAHead);
@@ -1203,6 +1300,12 @@
dvdnav_close(nav);
nav=NULL;
+ /* Try to restore drive speed if it was previously changed */
+ if (DvdSetSpeedActive) {
+ DvdSetSpeed(const_cast<char *>(cDVD::getDVD()->DeviceName()), -1);
+ DvdSetSpeedActive = false;
+ }
+
DEBUGDVD("%s:%d: input thread ended (pid=%d)\n", __FILE__, __LINE__, getpid());
fflush(NULL);
}
diff -Nu dvd.old/player-dvd.h dvd/player-dvd.h
--- dvd.old/player-dvd.h 2007-09-17 21:04:43.000000000 +0200
+++ dvd/player-dvd.h 2008-01-11 10:44:41.000000000 +0100
@@ -168,6 +168,7 @@
static bool HasBitStreamOut;
static bool SoftDeviceOutActive; // currently used to switch for xine
static bool HasSoftDeviceOut; // currently used to switch for xine
+ static bool DvdSetSpeedActive;
//dvd stuff
int currButtonN;
@@ -229,6 +230,7 @@
void DrawSPU();
void HideSPU();
void EmptySPU();
+ void DvdSetSpeed(const char*, int);
void Pause(void);
void Play(void);
diff -Nu dvd.old/setup-dvd.c dvd/setup-dvd.c
--- dvd.old/setup-dvd.c 2007-08-12 18:57:22.000000000 +0200
+++ dvd/setup-dvd.c 2008-01-11 10:44:41.000000000 +0100
@@ -35,6 +35,7 @@
Gain = 4;
AC3dynrng = 0;
+ Speed = 0;
}
bool cDVDSetup::SetupParse(const char *Name, const char *Value)
@@ -47,6 +48,7 @@
else if (!strcasecmp(Name, "ShowSubtitles")) ShowSubtitles = atoi(Value);
else if (!strcasecmp(Name, "HideMainMenu")) HideMainMenu = atoi(Value);
else if (!strcasecmp(Name, "ReadAHead")) ReadAHead = atoi(Value);
+ else if (!strcasecmp(Name, "Speed")) Speed = atoi(Value);
else if (!strcasecmp(Name, "Gain")) Gain = atoi(Value);
else
return false;
@@ -72,6 +74,7 @@
Add(new cMenuEditBoolItem(tr("Setup.DVD$Display subtitles"), &data.ShowSubtitles));
Add(new cMenuEditBoolItem(tr("Setup.DVD$Hide Mainmenu Entry"), &data.HideMainMenu));
Add(new cMenuEditBoolItem(tr("Setup.DVD$ReadAHead"), &data.ReadAHead));
+ Add(new cMenuEditIntItem( tr("Setup.DVD$DVD-ROM Speed"), &data.Speed, 0, 4));
Add(new cMenuEditIntItem( tr("Setup.DVD$Gain (analog)"), &data.Gain, 0, 10));
}
@@ -85,6 +88,7 @@
SetupStore("ShowSubtitles", DVDSetup.ShowSubtitles );
SetupStore("HideMainMenu", DVDSetup.HideMainMenu );
SetupStore("ReadAHead", DVDSetup.ReadAHead );
+ SetupStore("Speed", DVDSetup.Speed );
SetupStore("Gain", DVDSetup.Gain );
}
diff -Nu dvd.old/setup-dvd.h dvd/setup-dvd.h
--- dvd.old/setup-dvd.h 2005-01-05 17:32:21.000000000 +0100
+++ dvd/setup-dvd.h 2008-01-11 10:44:41.000000000 +0100
@@ -23,6 +23,7 @@
int HideMainMenu;
int ReadAHead;
int Gain;
+ int Speed;
// AC3 stuff
int AC3dynrng;
|