Prepared eventual closing of spoiled BD-R media by a pseudo write run

This commit is contained in:
Thomas Schmitt 2009-01-11 10:28:05 +00:00
parent 4c92d6d41b
commit 9c78678a15
3 changed files with 51 additions and 1 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2009.01.09.161704" #define Cdrskin_timestamP "2009.01.11.102711"

View File

@ -543,6 +543,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
0x00020168 (FAILURE,HIGH) = Media not properly formatted. Cannot write. 0x00020168 (FAILURE,HIGH) = Media not properly formatted. Cannot write.
0x00020169 (WARNING,HIGH) = Last session on media is still open 0x00020169 (WARNING,HIGH) = Last session on media is still open
0x00020170 (NOTE,HIGH) = Closing open session before writing new one 0x00020170 (NOTE,HIGH) = Closing open session before writing new one
0x00020171 (NOTE,HIGH) = Closing BD-R with accidently open session
libdax_audioxtr: libdax_audioxtr:
0x00020200 (SORRY,HIGH) = Cannot open audio source file 0x00020200 (SORRY,HIGH) = Cannot open audio source file

View File

@ -1406,6 +1406,52 @@ int burn_dvd_write_session(struct burn_write_opts *o,
if (d->current_profile == 0x41 && d->status == BURN_DISC_APPENDABLE && if (d->current_profile == 0x41 && d->status == BURN_DISC_APPENDABLE &&
d->state_of_last_session == 1) { d->state_of_last_session == 1) {
/* last session on BD-R is still open */; /* last session on BD-R is still open */;
/* BR-R were not closed by libburn-0.6.0.pl00 if o->multi==0.
This leads to an unreadable, but recoverable) media state.
Technically they are appendable although the last session
is not readable.
By default the open session gets closed here before the new
session is written. E.g. after writing a small dummy seesion
number 2 one can read session 1 and write session 3 which
points to data of session 1.
For the case that no media with 3 sessions is desired it is
possible to activate the following coarse single-session
closing code:
No new session will be written but calling programs will
report success. Quite misleading.
Activate only if really needed by
# define Libburn_bug_A90108_close_disC yes
*/
#ifdef Libburn_bug_A90108_close_disC
/* Close open session and media.
That was the goal of the failed run which led to the
unreadable (but recoverable) media state.
It is not easy to implement a general close function for
all media types. Therefore this pseudo write code is under
control of #ifdef.
*/
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020171,
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
"Closing BD-R with accidently open session",
0, 0);
d->close_track_session(d, 3, 0); /* CLOSE SESSION, 110b */
d->state_of_last_session = 3; /* mark as complete session */
d->status = BURN_DISC_FULL;
sleep(3); /* The caller might need time to arrange itself */
return 1;
#else /* Libburn_bug_A90108_close_disC */
/* This is the default mode.
*/
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020170, 0x00020170,
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
@ -1413,6 +1459,9 @@ int burn_dvd_write_session(struct burn_write_opts *o,
0, 0); 0, 0);
d->close_track_session(d, 1, 0); /* CLOSE SESSION, 010b */ d->close_track_session(d, 1, 0); /* CLOSE SESSION, 010b */
d->state_of_last_session = 3; /* mark as complete session */ d->state_of_last_session = 3; /* mark as complete session */
#endif /* ! Libburn_bug_A90108_close_disC */
} }
for (i = 0; i < s->tracks; i++) { for (i = 0; i < s->tracks; i++) {