Allowed finalizing of DVD+R

This commit is contained in:
2007-03-30 20:11:36 +00:00
parent 7fdea3f6fd
commit 9658d1fba3
3 changed files with 38 additions and 34 deletions

View File

@ -1075,9 +1075,31 @@ int burn_disc_close_track_dvd_minus_r(struct burn_write_opts *o,
}
/* ts A70229 */
int burn_disc_finalize_dvd_plus_r(struct burn_write_opts *o)
{
struct burn_drive *d = o->drive;
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
"Finalizing DVD+R ...", 0, 0);
/* CLOSE SESSION, 101b, Finalize with minimal radius */
d->close_track_session(d, 2, 1); /* (2<<1)|1 = 5 */
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
"... finalizing DVD+R done ", 0, 0);
return 1;
}
/* ts A70226 */
int burn_disc_close_track_dvd_plus_r(struct burn_write_opts *o,
struct burn_session *s, int tnum)
struct burn_session *s, int tnum, int is_last_track)
{
struct burn_drive *d = o->drive;
char msg[80];
@ -1093,8 +1115,11 @@ int burn_disc_close_track_dvd_plus_r(struct burn_write_opts *o,
/* Each session becomes a single logical track. So to distinguish them,
it is mandatory to close the session together with each track. */
d->close_track_session(d, 1, 0); /* CLOSE SESSION, 010b */
if (is_last_track && !o->multi)
burn_disc_finalize_dvd_plus_r(o);
else
d->close_track_session(d, 1, 0); /* CLOSE SESSION, 010b */
d->busy = BURN_DRIVE_WRITING;
d->last_track_no++;
return 1;
@ -1103,7 +1128,7 @@ int burn_disc_close_track_dvd_plus_r(struct burn_write_opts *o,
/* ts A61218 - A70129 */
int burn_dvd_write_track(struct burn_write_opts *o,
struct burn_session *s, int tnum)
struct burn_session *s, int tnum, int is_last_track)
{
struct burn_track *t = s->track[tnum];
struct burn_drive *d = o->drive;
@ -1189,7 +1214,8 @@ int burn_dvd_write_track(struct burn_write_opts *o,
goto ex;
} else if (d->current_profile == 0x1b || d->current_profile == 0x2b) {
/* DVD+R , DVD+R/DL */
ret = burn_disc_close_track_dvd_plus_r(o, s, tnum);
ret = burn_disc_close_track_dvd_plus_r(o, s, tnum,
is_last_track);
if (ret <= 0)
goto ex;
}
@ -1268,7 +1294,7 @@ int burn_disc_close_session_dvd_minus_r(struct burn_write_opts *o,
/* ts A61218 */
int burn_dvd_write_session(struct burn_write_opts *o,
struct burn_session *s)
struct burn_session *s, int is_last_session)
{
int i,ret;
struct burn_drive *d = o->drive;
@ -1276,7 +1302,8 @@ int burn_dvd_write_session(struct burn_write_opts *o,
/* >>> open_session ? */
for (i = 0; i < s->tracks; i++) {
ret = burn_dvd_write_track(o, s, i);
ret = burn_dvd_write_track(o, s, i,
is_last_session && i == (s->tracks - 1));
if (ret <= 0)
break;
}
@ -1428,24 +1455,6 @@ int burn_disc_setup_dvd_plus_r(struct burn_write_opts *o,
}
/* ts A70229 */
int burn_disc_finalize_dvd_plus_r(struct burn_write_opts *o)
{
struct burn_drive *d = o->drive;
/* <<< FOR NOW: avoid finalizing media */
return 3;
if (o->multi)
return 2;
d->busy = BURN_DRIVE_CLOSING_SESSION;
/* CLOSE SESSION, 101b, Finalize with minimal radius */
d->close_track_session(d, 2, 1); /* (2<<1)|1 = 5 */
d->busy = BURN_DRIVE_WRITING;
return 1;
}
/* ts A61218 - A70129 */
int burn_dvd_write_sync(struct burn_write_opts *o,
struct burn_disc *disc)
@ -1700,7 +1709,8 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
d->progress.session = i;
d->progress.tracks = disc->session[i]->tracks;
ret = burn_dvd_write_session(o, disc->session[i]);
ret = burn_dvd_write_session(o, disc->session[i],
i == (disc->sessions - 1));
if (ret <= 0)
goto ex;