New API call burn_write_opts_set_bdr_obs_exempt()

This commit is contained in:
Thomas Schmitt 2021-09-12 10:41:59 +02:00
parent 27e15689e5
commit 31591b8196
6 changed files with 39 additions and 13 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2021.09.02.181259" #define Cdrskin_timestamP "2021.09.12.084139"

View File

@ -3389,6 +3389,21 @@ void burn_write_opts_set_dvd_obs(struct burn_write_opts *opts, int obs);
void burn_write_opts_set_obs_pad(struct burn_write_opts *opts, int pad); void burn_write_opts_set_obs_pad(struct burn_write_opts *opts, int pad);
/* ts C10909 */
/** Exempts BD-R media from the elsewise unavoidable automatic padding of the
last write chunk to its full size.
Even if this exempt is granted it gets into effect only if stream recording
is disabled and burn_write_opts_set_obs_pad() is set to 0.
@param opts The write opts to change
@param value 1= possibly exempt BD-R from end chunk padding.
0= always act on BD-R as if
burn_write_opts_set_obs_pad(opts, 1) is in effect.
@since 1.5.6
*/
void burn_write_opts_set_bdr_obs_exempt(struct burn_write_opts *opts,
int value);
/* ts A91115 */ /* ts A91115 */
/** Sets the rhythm by which stdio pseudo drives force their output data to /** Sets the rhythm by which stdio pseudo drives force their output data to
be consumed by the receiving storage device. This forcing keeps the memory be consumed by the receiving storage device. This forcing keeps the memory

View File

@ -186,6 +186,7 @@ burn_write_opts_auto_write_type;
burn_write_opts_free; burn_write_opts_free;
burn_write_opts_get_drive; burn_write_opts_get_drive;
burn_write_opts_new; burn_write_opts_new;
burn_write_opts_set_bdr_obs_exempt;
burn_write_opts_set_dvd_obs; burn_write_opts_set_dvd_obs;
burn_write_opts_set_fail21h_sev; burn_write_opts_set_fail21h_sev;
burn_write_opts_set_fillup; burn_write_opts_set_fillup;

View File

@ -55,6 +55,7 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive)
opts->obs_pad = 0; opts->obs_pad = 0;
#endif #endif
opts->bdr_obs_exempt = 0;
opts->start_byte = -1; opts->start_byte = -1;
opts->fill_up_media = 0; opts->fill_up_media = 0;
opts->force_is_set = 0; opts->force_is_set = 0;
@ -535,6 +536,14 @@ void burn_write_opts_set_obs_pad(struct burn_write_opts *opts, int pad)
} }
/* ts C10909: API */
void burn_write_opts_set_bdr_obs_exempt(struct burn_write_opts *opts,
int value)
{
opts->bdr_obs_exempt = !!value;
}
/* ts A91115: API */ /* ts A91115: API */
void burn_write_opts_set_stdio_fsync(struct burn_write_opts *opts, int rhythm) void burn_write_opts_set_stdio_fsync(struct burn_write_opts *opts, int rhythm)
{ {

View File

@ -46,6 +46,9 @@ struct burn_write_opts
2 indicates burn_write_opts_set_obs_pad(,1) 2 indicates burn_write_opts_set_obs_pad(,1)
*/ */
/* 1= do not apply obs_pad=1 to BD-R if not stream recording. */
int bdr_obs_exempt;
/* ts A61222 : Start address for media which offer a choice */ /* ts A61222 : Start address for media which offer a choice */
off_t start_byte; off_t start_byte;

View File

@ -1658,16 +1658,6 @@ int burn_disc_open_track_dvd_plus_r(struct burn_write_opts *o,
size += (off_t) (o->obs - (size % o->obs)); size += (off_t) (o->obs - (size % o->obs));
} }
/* <<< Only for now until the first DVD+R succeeded */
if (!o->obs_pad) {
sprintf(msg, "Program error: encountered DVD+R without chunk padding");
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00000004,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
{ret = 0; goto ex;}
}
ret = d->reserve_track(d, size); ret = d->reserve_track(d, size);
if (ret <= 0) { if (ret <= 0) {
sprintf(msg, "Cannot reserve track of %.f bytes", sprintf(msg, "Cannot reserve track of %.f bytes",
@ -2436,9 +2426,17 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
msg, 0, 0); msg, 0, 0);
goto early_failure; goto early_failure;
} }
/* ??? padding needed ??? cowardly doing it for now */ /* Unaligned BD-R track end works with various drives and
if (o->obs_pad < 2) produces exact READ CAPACITY results.
Nevertheless stream recording hates unaligned WRITE.
With DVD+R it seems that obs_pad is silently applied by the
drive if a non-aligned final WRITE is received.
*/
if (o->obs_pad < 2 &&
!(d->current_profile == 0x41 && !d->do_stream_recording &&
o->bdr_obs_exempt))
o->obs_pad = 1; /* fill-up track's last obs buffer */ o->obs_pad = 1; /* fill-up track's last obs buffer */
if (d->current_profile == 0x41) /* BD-R */ if (d->current_profile == 0x41) /* BD-R */
o->obs = Libburn_bd_r_obS; o->obs = Libburn_bd_r_obS;
if (d->do_stream_recording) { if (d->do_stream_recording) {