|
|
|
@ -920,40 +920,45 @@ void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
|
|
|
|
ret= isoburn_find_emulator(&o, drive, 0); |
|
|
|
|
if(ret<0) |
|
|
|
|
goto ex; |
|
|
|
|
if(o!=NULL) { |
|
|
|
|
o->wrote_well= -1; |
|
|
|
|
if(o->emulation_mode!=0) { |
|
|
|
|
burn_write_opts_set_multi(opts, 0); |
|
|
|
|
if(o->emulation_mode>0 && o->nwa >= 0) { |
|
|
|
|
nwa= o->nwa; |
|
|
|
|
|
|
|
|
|
/* This caters for unwritten formatted DVD-RW. They need to be written
|
|
|
|
|
sequentially on the first use. Only written areas are random access. |
|
|
|
|
If the first session is not written to LBA 0, then re-opening of |
|
|
|
|
formatting and padding is needed.
|
|
|
|
|
This can be done. But when the track gets closed after padding, |
|
|
|
|
this lasts a long time. There is a high risk that an app will not |
|
|
|
|
poll the message queue while waiting for isoburn_disc_write() to |
|
|
|
|
return. The pacifier loop usually happens only afterwards. |
|
|
|
|
So automatic formatting might cause a nervous clueless user. |
|
|
|
|
if(o == NULL) { |
|
|
|
|
sprintf(msg, |
|
|
|
|
"Program error: Cannot find isoburn object associated to the drive"); |
|
|
|
|
isoburn_msgs_submit(o, 0x00060000, msg, 0, "FAILURE", 0); |
|
|
|
|
burn_drive_cancel(drive); |
|
|
|
|
goto ex; |
|
|
|
|
} |
|
|
|
|
o->wrote_well= -1; |
|
|
|
|
if(o->emulation_mode!=0) { |
|
|
|
|
burn_write_opts_set_multi(opts, 0); |
|
|
|
|
if(o->emulation_mode>0 && o->nwa >= 0) { |
|
|
|
|
nwa= o->nwa; |
|
|
|
|
|
|
|
|
|
/* This caters for unwritten formatted DVD-RW. They need to be written
|
|
|
|
|
sequentially on the first use. Only written areas are random access. |
|
|
|
|
If the first session is not written to LBA 0, then re-opening of |
|
|
|
|
formatting and padding is needed.
|
|
|
|
|
This can be done. But when the track gets closed after padding, |
|
|
|
|
this lasts a long time. There is a high risk that an app will not |
|
|
|
|
poll the message queue while waiting for isoburn_disc_write() to |
|
|
|
|
return. The pacifier loop usually happens only afterwards. |
|
|
|
|
So automatic formatting might cause a nervous clueless user. |
|
|
|
|
*/ |
|
|
|
|
ret= isoburn_is_intermediate_dvd_rw(drive, 0); |
|
|
|
|
if(ret>0 && nwa>0 && nwa <= o->zero_nwa) { |
|
|
|
|
/* actually this should not happen since such media get recognized
|
|
|
|
|
by isoburn_welcome_media and o->zero_nwa gets set to 0 |
|
|
|
|
*/ |
|
|
|
|
ret= isoburn_is_intermediate_dvd_rw(drive, 0); |
|
|
|
|
if(ret>0 && nwa>0 && nwa <= o->zero_nwa) { |
|
|
|
|
/* actually this should not happen since such media get recognized
|
|
|
|
|
by isoburn_welcome_media and o->zero_nwa gets set to 0 |
|
|
|
|
*/ |
|
|
|
|
sprintf(msg, |
|
|
|
|
"DVD-RW insufficiently formatted. (Intermediate State, size unknown)"); |
|
|
|
|
isoburn_msgs_submit(o, 0x00060000, msg, 0, "FAILURE", 0); |
|
|
|
|
sprintf(msg, |
|
|
|
|
"It might help to first deformat it and then format it again"); |
|
|
|
|
isoburn_msgs_submit(o, 0x00060000, msg, 0, "HINT", 0); |
|
|
|
|
burn_drive_cancel(drive); /* mark run as failure */ |
|
|
|
|
goto ex; |
|
|
|
|
} |
|
|
|
|
/* end of DVD-RW oriented check */ |
|
|
|
|
burn_write_opts_set_start_byte(opts, nwa * (off_t) 2048); |
|
|
|
|
sprintf(msg, |
|
|
|
|
"DVD-RW insufficiently formatted. (Intermediate State, size unknown)"); |
|
|
|
|
isoburn_msgs_submit(o, 0x00060000, msg, 0, "FAILURE", 0); |
|
|
|
|
sprintf(msg, |
|
|
|
|
"It might help to first deformat it and then format it again"); |
|
|
|
|
isoburn_msgs_submit(o, 0x00060000, msg, 0, "HINT", 0); |
|
|
|
|
burn_drive_cancel(drive); /* mark run as failure */ |
|
|
|
|
goto ex; |
|
|
|
|
} |
|
|
|
|
/* end of DVD-RW oriented check */ |
|
|
|
|
burn_write_opts_set_start_byte(opts, nwa * (off_t) 2048); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|