New option -list_speeds
This commit is contained in:
@ -800,7 +800,7 @@ int Xorriso_toc(struct XorrisO *xorriso, int flag)
|
||||
int track_count= 0, session_no, track_no, profile_no= -1, track_size;
|
||||
int last_track_start= 0, last_track_size= -1, num_data= 0, is_data= 0;
|
||||
int is_inout_drive= 0, drive_role, status, num_formats, emul_lba;
|
||||
int num_payload= 0, num_wasted= 0, num_nondata= 0, not_reconizable= 0;
|
||||
int num_payload= 0, not_reconizable= 0;
|
||||
char profile_name[80],*respt,*devadr, *typetext= "";
|
||||
struct burn_toc_entry toc_entry;
|
||||
struct burn_drive_info *dinfo;
|
||||
@ -1065,8 +1065,12 @@ int Xorriso_toc(struct XorrisO *xorriso, int flag)
|
||||
}
|
||||
if(xorriso->request_to_abort)
|
||||
{ret= 1; goto ex;}
|
||||
/*
|
||||
int num_wasted= 0, num_nondata= 0;
|
||||
|
||||
num_wasted= lba - num_payload;
|
||||
num_nondata= lba - num_data;
|
||||
*/
|
||||
|
||||
Sfile_scale(((double) num_data) * 2048.0, mem_text,5,1e4,1);
|
||||
sprintf(respt, "Media summary: %d session%s, %d data blocks, %s data",
|
||||
@ -1280,6 +1284,127 @@ ex:;
|
||||
}
|
||||
|
||||
|
||||
/* @return <=0 error, 1 success
|
||||
*/
|
||||
int Xorriso_list_speeds(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, high= -1, low= 0x7fffffff, int_cd_speed, is_cd= 0;
|
||||
char *respt, *speed_unit= "D";
|
||||
double speed_factor= 1385000.0, cd_factor= 75.0 * 2352;
|
||||
struct burn_drive_info *dinfo;
|
||||
struct burn_drive *drive;
|
||||
struct burn_speed_descriptor *speed_list= NULL, *item, *other;
|
||||
|
||||
respt= xorriso->result_line;
|
||||
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to obtain speed descriptor list", 1 | 2);
|
||||
if(ret<=0)
|
||||
return(0);
|
||||
if(ret == 2)
|
||||
goto ex;
|
||||
ret= burn_drive_get_speedlist(drive, &speed_list);
|
||||
if(ret <= 0) {
|
||||
sprintf(xorriso->info_text, "Cannot obtain speed list info");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
ret= Xorriso_toc(xorriso, 3);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
for (item= speed_list; item != NULL; item= item->next) {
|
||||
if(item->profile_loaded >= 0x08 && item->profile_loaded <= 0x0a)
|
||||
is_cd= 1;
|
||||
if(item->source == 1) {
|
||||
/* CD mode page 2Ah : report only if not same speed by GET PERFORMANCE */
|
||||
for(other= speed_list; other != NULL; other= other->next)
|
||||
if(other->source == 2 && item->write_speed == other->write_speed)
|
||||
break;
|
||||
if(other != NULL)
|
||||
continue;
|
||||
}
|
||||
speed_unit= "D";
|
||||
speed_factor= 1385000.0;
|
||||
|
||||
/* Does this look like an integer CD speed ? */
|
||||
int_cd_speed= ((double) item->write_speed) * 1000.0 / cd_factor;
|
||||
if(abs((int) ((double) int_cd_speed) * cd_factor / 1000.0 -
|
||||
((double) item->write_speed)) > 5 ||
|
||||
int_cd_speed > 64)
|
||||
int_cd_speed= 0;
|
||||
|
||||
if(((item->profile_loaded < 0x08 || item->profile_loaded >= 0x100) &&
|
||||
int_cd_speed) ||
|
||||
(item->profile_loaded >= 0x08 && item->profile_loaded <= 0x0a)) {
|
||||
speed_unit= "C";
|
||||
speed_factor= 75.0 * 2352.0;
|
||||
} else if(item->profile_loaded >= 0x41 && item->profile_loaded <= 0x43) {
|
||||
speed_unit= "B";
|
||||
speed_factor= 4495625.0;
|
||||
}
|
||||
sprintf(respt, "Write speed : ");
|
||||
sprintf(respt + strlen(respt), " %5dk , %4.1fx%s\n",
|
||||
item->write_speed,
|
||||
((double) item->write_speed) * 1000.0 / speed_factor,
|
||||
speed_unit);
|
||||
Xorriso_result(xorriso,0);
|
||||
if(item->write_speed > high)
|
||||
high= item->write_speed;
|
||||
if(item->write_speed < low)
|
||||
low= item->write_speed;
|
||||
}
|
||||
|
||||
/* Maybe there is ATIP info */
|
||||
if(is_cd) {
|
||||
ret= burn_disc_read_atip(drive);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret > 0) {
|
||||
ret= burn_drive_get_min_write_speed(drive);
|
||||
if(ret > 0) {
|
||||
if(ret > low) {
|
||||
sprintf(respt, "Write speed l: ");
|
||||
sprintf(respt + strlen(respt), " %5dk , %4.1fx%s\n",
|
||||
ret, ((double) ret) * 1000.0 / cd_factor, "C");
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
if(ret > high)
|
||||
high= ret;
|
||||
low= ret;
|
||||
}
|
||||
ret= burn_drive_get_write_speed(drive);
|
||||
if(ret > 0) {
|
||||
if(ret < high) {
|
||||
sprintf(respt, "Write speed h: ");
|
||||
sprintf(respt + strlen(respt), " %5dk , %4.1fx%s\n",
|
||||
ret, ((double) ret) * 1000.0 / cd_factor, "C");
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
high= ret;
|
||||
if(ret < low)
|
||||
low= ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(high > -1) {
|
||||
sprintf(respt, "Write speed L: ");
|
||||
sprintf(respt + strlen(respt), " %5dk , %4.1fx%s\n",
|
||||
low, ((double) low) * 1000.0 / speed_factor, speed_unit);
|
||||
Xorriso_result(xorriso,0);
|
||||
sprintf(respt, "Write speed H: ");
|
||||
sprintf(respt + strlen(respt), " %5dk , %4.1fx%s\n",
|
||||
high, ((double) high) * 1000.0 / speed_factor, speed_unit);
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(speed_list != NULL)
|
||||
burn_drive_free_speedlist(&speed_list);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= cdrecord style
|
||||
bit1= obtain outdrive, else indrive
|
||||
@return <=0 error, 1 success
|
||||
|
Reference in New Issue
Block a user