-
Notifications
You must be signed in to change notification settings - Fork 18
/
dvdspeed.c
66 lines (54 loc) · 1.39 KB
/
dvdspeed.c
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
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/cdrom.h>
#include "hdparm.h"
/*
* dvdspeed - use SET STREAMING command to set the speed of DVD-drives
*
* Copyright (c) 2004 Thomas Fritzsche <[email protected]>
* A bit mangled in 2006 and 2008 by Thomas Orgis <[email protected]>
*
*/
int set_dvdspeed(int fd, int speed)
{
struct cdrom_generic_command cgc;
struct request_sense sense;
unsigned char buffer[28];
unsigned long rwsize = 177 * speed;
memset(&cgc, 0, sizeof(cgc));
memset(&sense, 0, sizeof(sense));
memset(&buffer, 0, sizeof(buffer));
cgc.cmd[0] = 0xb6; // SET_STREAMING
cgc.cmd[10] = 28; // parameter list length (28 bytes)
cgc.sense = &sense;
cgc.buffer = buffer;
cgc.buflen = sizeof(buffer);
cgc.data_direction = CGC_DATA_WRITE;
if (speed == 0) // reset to default speed?
buffer[0] = 4;
buffer[ 8] = 0xff;
buffer[ 9] = 0xff;
buffer[10] = 0xff;
buffer[11] = 0xff;
// read size:
buffer[12] = rwsize >> 24;
buffer[13] = rwsize >> 16;
buffer[14] = rwsize >> 8;
buffer[15] = rwsize;
// read time = 1 second:
buffer[18] = 0x03;
buffer[19] = 0xE8;
// write size:
buffer[20] = rwsize >> 24;
buffer[21] = rwsize >> 16;
buffer[22] = rwsize >> 8;
buffer[23] = rwsize;
// write time = 1 second:
buffer[26] = 0x03;
buffer[27] = 0xE8;
return ioctl(fd, CDROM_SEND_PACKET, &cgc);
}