New -read_speed prefixes "soft_force:" and "soft_corr:"

This commit is contained in:
2020-08-26 16:29:40 +02:00
parent f23b23fd17
commit ffb7fe64c9
10 changed files with 283 additions and 119 deletions

View File

@ -1,7 +1,7 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2019 Thomas Schmitt, <scdbackup@gmx.net>
Copyright 2007-2020 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later.
@ -204,6 +204,42 @@ ex:;
}
/* @param flag: bit0= set read speed
bit1= set write speed
*/
int Xorriso_set_speed(struct XorrisO *xorriso, struct burn_drive *drive,
int read_speed, int write_speed, int flag)
{
int r_speed = 0, w_speed = 0, ret = 0, profile_no= 0;
char profile_name[80];
if((flag & 3) == 0)
return(0);
if(xorriso->read_speed == -2) {
if(!(flag & 2))
return(0);
}
if(flag & 1)
r_speed= read_speed;
if(flag & 2)
w_speed= write_speed;
ret= burn_disc_get_profile(drive, &profile_no, profile_name);
if(ret <= 0)
profile_no= 0;
if((r_speed > 0 || w_speed > 0) && profile_no >= 0x10) {
ret= burn_drive_set_speed_exact(drive, r_speed, w_speed);
if(ret > 0)
goto ex;
}
burn_drive_set_speed(drive, r_speed, w_speed);
ret= 2;
ex:;
Xorriso_process_msg_queues(xorriso,0);
return(ret);
}
/* @param flag bit0= acquire as isoburn input drive
bit1= acquire as libburn output drive (as isoburn drive if bit0)
bit2= regard overwritable media as blank
@ -573,8 +609,7 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, char *show_adr,
if(ret <= 0)
goto ex;
}
if(xorriso->read_speed != -2)
burn_drive_set_speed(drive, xorriso->read_speed, 0);
Xorriso_set_speed(xorriso, drive, xorriso->read_speed, 0, 1);
read_ret= ret= isoburn_read_image(drive, ropts, &volset);
/* <<< Resetting to normal thresholds */
@ -2308,12 +2343,13 @@ int Xorriso_scsi_log(struct XorrisO *xorriso, int flag)
int Xorriso_check_md5_range(struct XorrisO *xorriso, off_t start_lba,
off_t end_lba, char md5[16], int flag)
{
int ret;
int ret, us_corr = 0;
struct burn_drive_info *dinfo= NULL;
struct burn_drive *drive= NULL;
off_t pos, data_count, to_read;
off_t pos, data_count, to_read, slowdown_count= 0;
char *data= NULL, data_md5[16];
void *ctx = NULL;
struct timeval prev_time;
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
"on attempt to check session MD5 checksum", 0);
@ -2327,8 +2363,10 @@ int Xorriso_check_md5_range(struct XorrisO *xorriso, off_t start_lba,
Xorriso_no_malloc_memory(xorriso, NULL, 0);
goto ex;
}
if(xorriso->read_speed != -2)
burn_drive_set_speed(drive, xorriso->read_speed, 0);
if(xorriso->read_speed_force > 0) /* initialize forced speed limit */
burn_nominal_slowdown(xorriso->read_speed_force, xorriso->read_speed_corr,
&prev_time, &us_corr, (off_t) 0, 1);
Xorriso_set_speed(xorriso, drive, xorriso->read_speed, 0, 1);
Xorriso_process_msg_queues(xorriso,0);
for(pos= start_lba; pos < end_lba; pos+= 32) {
to_read= 32;
@ -2339,6 +2377,15 @@ int Xorriso_check_md5_range(struct XorrisO *xorriso, off_t start_lba,
if(ret <= 0)
goto ex;
iso_md5_compute(ctx, data, (int) data_count);
if(xorriso->read_speed_force > 0 && pos + to_read <= end_lba) {
slowdown_count+= data_count;
if(slowdown_count >= 128 * 1024) {
burn_nominal_slowdown(xorriso->read_speed_force,
xorriso->read_speed_corr,
&prev_time, &us_corr, slowdown_count, 0);
slowdown_count= 0;
}
}
xorriso->pacifier_count+= data_count;
xorriso->pacifier_byte_count+= data_count;
Xorriso_pacifier_callback(xorriso, "content bytes read",
@ -2741,7 +2788,7 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
{
int i, j, ret, total_count= 0, sectors= -1, sector_size= -1, skip_reading;
int prev_quality= -1, quality= -1, retry= 0, profile_no, is_cd= 0;
int eccb_size= 16;
int eccb_size= 16, us_corr = 0;
int start_sec, end_sec, first_value, fret, suspect_tao_end= 0;
char profile_name[80];
int start_lba= 0;
@ -2749,6 +2796,8 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
struct burn_drive_info *dinfo;
char *data= NULL, *data_pt;
off_t data_count, to_read, read_count= 0, write_amount, skipped_to_read;
off_t slowdown_count= 0;
struct timeval prev_time;
double pre_read_time, post_read_time, time_diff, total_time_diff= 0;
double last_abort_file_time= 0;
void *ctx= NULL;
@ -2861,8 +2910,10 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
goto ex;
}
if(xorriso->read_speed != -2)
burn_drive_set_speed(drive, xorriso->read_speed, 0);
if(xorriso->read_speed_force > 0) /* initialize forced speed limit */
burn_nominal_slowdown(xorriso->read_speed_force, xorriso->read_speed_corr,
&prev_time, &us_corr, (off_t) 0, 1);
Xorriso_set_speed(xorriso, drive, xorriso->read_speed, 0, 1);
Xorriso_process_msg_queues(xorriso,0);
start_lba= from_lba;
to_read= read_chunk;
@ -3020,6 +3071,15 @@ abort_check:;
if(job->data_to_limit >= 0 && read_count > job->data_to_limit)
write_amount-= (read_count - job->data_to_limit);
}
if(xorriso->read_speed_force > 0) {
slowdown_count+= data_count;
if(slowdown_count >= 128 * 1024) {
burn_nominal_slowdown(xorriso->read_speed_force,
xorriso->read_speed_corr,
&prev_time, &us_corr, slowdown_count, 0);
slowdown_count= 0;
}
}
if(write_amount > 0) {
if(job->data_to_fd >= 0) {
ret= lseek(job->data_to_fd,