diff --git a/libburn/trunk/cdrskin/cdrskin_timestamp.h b/libburn/trunk/cdrskin/cdrskin_timestamp.h index 5f22650d..b041fffd 100644 --- a/libburn/trunk/cdrskin/cdrskin_timestamp.h +++ b/libburn/trunk/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2009.08.23.130326" +#define Cdrskin_timestamP "2009.08.24.131146" diff --git a/libburn/trunk/libburn/drive.c b/libburn/trunk/libburn/drive.c index 2a345aeb..e247908f 100644 --- a/libburn/trunk/libburn/drive.c +++ b/libburn/trunk/libburn/drive.c @@ -533,6 +533,20 @@ int burn_drive_release_fl(struct burn_drive *d, int flag) } +/* API */ +/* ts A90824 + @param flag bit0= wake up (else start snoozing) +*/ +int burn_drive_snooze(struct burn_drive *d, int flag) +{ + if (flag & 1) + d->start_unit(d); + else + d->stop_unit(d); + return 1; +} + + /* API */ void burn_drive_release(struct burn_drive *d, int le) { diff --git a/libburn/trunk/libburn/libburn.h b/libburn/trunk/libburn/libburn.h index 04392e80..910ab644 100644 --- a/libburn/trunk/libburn/libburn.h +++ b/libburn/trunk/libburn/libburn.h @@ -1029,6 +1029,22 @@ int burn_drive_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int burn_drive_grab(struct burn_drive *drive, int load); +/* ts A90824 */ +/** Calm down or alert a drive. Some drives stay alert after reading for + quite some time. This saves time with the startup for the next read + operation but also causes noise and consumes extra energy. It makes + sense to calm down the drive if no read operation is expected for the + next few seconds. The drive will get alert automatically if operations + are required. + @param drive The drive to influence. + @param flag Bitfield for control purposes + bit0= become alert (else start snoozing) + This is not mandatory to allow further drive operations + @since 0.7.0 +*/ +int burn_drive_snooze(struct burn_drive *d, int flag); + + /** Release a drive. This should not be done until the drive is no longer busy (see burn_drive_get_status). Linux: The drive device file is not reserved afterwards. (O_EXCL, F_SETLK). diff --git a/libburn/trunk/libburn/sbc.c b/libburn/trunk/libburn/sbc.c index b7726bed..3c7a31e8 100644 --- a/libburn/trunk/libburn/sbc.c +++ b/libburn/trunk/libburn/sbc.c @@ -21,6 +21,7 @@ int mmc_function_spy(struct burn_drive *d, char * text); static unsigned char SBC_LOAD[] = { 0x1b, 0, 0, 0, 3, 0 }; static unsigned char SBC_UNLOAD[] = { 0x1b, 0, 0, 0, 2, 0 }; static unsigned char SBC_START_UNIT[] = { 0x1b, 0, 0, 0, 1, 0 }; +static unsigned char SBC_STOP_UNIT[] = { 0x1b, 0, 0, 0, 0, 0 }; void sbc_load(struct burn_drive *d) { @@ -84,15 +85,8 @@ int sbc_start_unit(struct burn_drive *d) return 0; scsi_init_command(&c, SBC_START_UNIT, sizeof(SBC_START_UNIT)); -/* - memcpy(c.opcode, SBC_START_UNIT, sizeof(SBC_START_UNIT)); - c.oplen = sizeof(SBC_START_UNIT); - c.page = NULL; -*/ c.retry = 1; - c.opcode[1] |= 1; /* ts A70918 : Immed */ - c.dir = NO_TRANSFER; d->issue_command(d, &c); if (c.error) @@ -101,6 +95,25 @@ int sbc_start_unit(struct burn_drive *d) return spc_wait_unit_attention(d, 1800, "START UNIT", 0); } +/* ts A90824 : Trying to reduce drive noise */ +int sbc_stop_unit(struct burn_drive *d) +{ + struct command c; + + if (mmc_function_spy(d, "stop_unit") <= 0) + return 0; + + scsi_init_command(&c, SBC_STOP_UNIT, sizeof(SBC_STOP_UNIT)); + c.retry = 1; + c.opcode[1] |= 1; /* Immed */ + c.dir = NO_TRANSFER; + d->issue_command(d, &c); + if (c.error) + return 0; + return spc_wait_unit_attention(d, 1800, "STOP UNIT", 0); +} + + /* ts A61021 : the sbc specific part of sg.c:enumerate_common() */ @@ -109,6 +122,7 @@ int sbc_setup_drive(struct burn_drive *d) d->eject = sbc_eject; d->load = sbc_load; d->start_unit = sbc_start_unit; + d->stop_unit = sbc_stop_unit; return 1; } diff --git a/libburn/trunk/libburn/transport.h b/libburn/trunk/libburn/transport.h index a5ff247c..2f312002 100644 --- a/libburn/trunk/libburn/transport.h +++ b/libburn/trunk/libburn/transport.h @@ -317,6 +317,7 @@ struct burn_drive void (*eject) (struct burn_drive *); void (*load) (struct burn_drive *); int (*start_unit) (struct burn_drive *); + int (*stop_unit) (struct burn_drive *); void (*read_disc_info) (struct burn_drive *); void (*read_sectors) (struct burn_drive *, int start,