diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index 0576132..7e75b0c 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2014.02.14.200129" +#define Cdrskin_timestamP "2014.02.16.203859" diff --git a/libburn/spc.c b/libburn/spc.c index 1fc78f7..b252c43 100644 --- a/libburn/spc.c +++ b/libburn/spc.c @@ -406,6 +406,32 @@ void spc_allow(struct burn_drive *d) d->issue_command(d, c); } + +/* ts B40216 : Outsourced from spc_sense_caps_al(). + To be called by spc_sense_caps() after spc_sense_caps_al() +*/ +static int spc_try_get_performance(struct burn_drive *d, int flag) +{ + int ret; + struct burn_feature_descr *feature_descr; + + /* ts B40107 : Feature 0x107 announces availability of GET PERFORMANCE + Its WSPD bit announces Type 3. + Try this even if the feature is not current. + */ + ret = burn_drive_has_feature(d, 0x107, &feature_descr, 0); + if (ret <= 0) + return ret; + if (feature_descr->data_lenght <= 0) + return 1; + if (feature_descr->data[0] & 2) /* WSPD */ + ret = mmc_get_write_performance(d); + /* Get read performance */ + mmc_get_performance(d, 0x00, 0); + return 1; +} + + /* ts A70518 - A90603 : Do not call with *alloc_len < 10 */ @@ -423,7 +449,6 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag) struct command *c = NULL; struct burn_speed_descriptor *sd; char *msg = NULL; - struct burn_feature_descr *feature_descr; /* ts A61225 : 1 = report about post-MMC-1 speed descriptors */ static int speed_debug = 0; @@ -552,7 +577,7 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag) /* ts A61225 : end of MMC-1 , begin of MMC-3 */ if (page_length < 30) /* no write speed descriptors ? */ - goto try_mmc_get_performance; + goto no_speed_descriptors; m->cur_write_speed = page[28] * 256 + page[29]; @@ -606,26 +631,8 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag) "LIBBURN_DEBUG: 5Ah,2Ah min_write_speed = %d , max_write_speed = %d\n", m->min_write_speed, m->max_write_speed); -try_mmc_get_performance:; - /* ts B40107 : Feature 0x107 announces availability of GET PERFORMANCE - Its WSPD bit announces Type 3. - Try this even if the feature is not current. - */ - ret = burn_drive_has_feature(d, 0x107, &feature_descr, 0); - if (ret > 0) { - if (feature_descr->data_lenght > 0) { - if (feature_descr->data[0] & 2) { /* WSPD */ - ret = mmc_get_write_performance(d); - if (ret > 0 && speed_debug) - fprintf(stderr, - "LIBBURN_DEBUG: ACh min_write_speed = %d , max_write_speed = %d\n", - m->min_write_speed, - m->max_write_speed); - } - /* Get read performance */ - mmc_get_performance(d, 0x00, 0); - } - } +no_speed_descriptors:; + ret = !was_error; ex: BURN_FREE_MEM(msg); @@ -654,7 +661,7 @@ void spc_sense_caps(struct burn_drive *d) */ ret = spc_sense_caps_al(d, &alloc_len, 1); if (ret == 2) - return; + goto try_get_performance; } /* ts B11103: qemu ATAPI DVD-ROM delivers only 28. @@ -664,6 +671,9 @@ void spc_sense_caps(struct burn_drive *d) if (alloc_len >= minimum_len && ret > 0) /* second execution with announced length */ spc_sense_caps_al(d, &alloc_len, 0); + +try_get_performance:; + spc_try_get_performance(d, 0); }