--- setcd.c +++ setcd.c @@ -1,5 +1,6 @@ /* Setcd.c: Set various flags to control the behaviour of your cdrom device. (c) 1997 David A. van Leeuwen + (c) 2004 Thomas Fritzsche $Id: setcd.c,v 1.4 1999/08/24 19:07:34 david Exp $ @@ -23,7 +24,7 @@ #include #include /* tolower */ #include /* lseek, read */ -#include /* strncmp */ +#include /* strncmp, memset */ #include /* ioctl */ #include #ifndef CDC_CLOSE_TRAY /* moved into cdrom.h... */ @@ -248,7 +249,49 @@ if (set || clear || status) print_options(flags, set | clear | ~0 * status); if (speed>=0) { - if (ioctl(fd, CDROM_SELECT_SPEED, speed)<0) { + struct cdrom_generic_command cgc; + struct request_sense sense; + unsigned char buffer[28]; + unsigned long rw_size; + 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) { + /* set Restore Drive Defaults */ + buffer[0] = 4; + } + 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) + && (ioctl(fd, CDROM_SELECT_SPEED, speed) < 0)) { perror("can't set speed"); exit(-6); } else {