Browse Source

Ticket 91: update media state model after content change

tags/ZeroThreeZero
Thomas Schmitt 13 years ago
parent
commit
56ab215db0
4 changed files with 74 additions and 69 deletions
  1. +65
    -39
      libburn/drive.c
  2. +5
    -0
      libburn/drive.h
  3. +4
    -0
      libburn/write.c
  4. +0
    -30
      test/libburner.c

+ 65
- 39
libburn/drive.c View File

@@ -135,33 +135,15 @@ unsigned int burn_drive_count(void)
return drivetop + 1;
}

int burn_drive_grab(struct burn_drive *d, int le)
{
int errcode;
int was_equal = 0, must_equal = 3, max_loop = 20;

/* ts A61125 : media status aspects of burn_drive_grab() */
int burn_drive_inquire_media(struct burn_drive *d)
{
/* ts A60907 */
int was_equal = 0, must_equal = 3, max_loop = 20;
int loop_count, old_speed = -1234567890, new_speed = -987654321;
int old_erasable = -1234567890, new_erasable = -987654321;

if (!d->released) {
burn_print(1, "can't grab - already grabbed\n");
return 0;
}
errcode = d->grab(d);

if (errcode == 0) {
burn_print(1, "low level drive grab failed\n");
return 0;
}
d->busy = BURN_DRIVE_GRABBING;

if (le)
d->load(d);

d->lock(d);
d->start_unit(d);

/* ts A61020 : this was BURN_DISC_BLANK as pure guess */
d->status = BURN_DISC_UNREADY;

@@ -169,6 +151,7 @@ int burn_drive_grab(struct burn_drive *d, int le)
d->mdata->dvdr_write || d->mdata->dvdram_write) {

#ifdef Libburn_grab_release_and_grab_agaiN
/* This code demanded the app to release and re-grab. */

d->read_disc_info(d);

@@ -178,8 +161,7 @@ int burn_drive_grab(struct burn_drive *d, int le)
without closing and re-opening the drive */
/* This seems to work for burn_disc_erasable() .
Speed values on RIP-14 and LITE-ON 48125S are stable
and false, nevertheless. So cdrskin -atip is still
forced to finish-initialize. */
and false, nevertheless. */
/*
fprintf(stderr,"libburn: experimental: read_disc_info()\n");
*/
@@ -216,6 +198,38 @@ int burn_drive_grab(struct burn_drive *d, int le)
return 1;
}


int burn_drive_grab(struct burn_drive *d, int le)
{
int errcode;
/* ts A61125 */
int ret;

if (!d->released) {
burn_print(1, "can't grab - already grabbed\n");
return 0;
}
errcode = d->grab(d);

if (errcode == 0) {
burn_print(1, "low level drive grab failed\n");
return 0;
}
d->busy = BURN_DRIVE_GRABBING;

if (le)
d->load(d);

d->lock(d);

/* ts A61118 */
d->start_unit(d);

/* ts A61125 : outsourced media state inquiry aspects */
ret = burn_drive_inquire_media(d);
return ret;
}

struct burn_drive *burn_drive_register(struct burn_drive *d)
{
#ifdef Libburn_ticket_62_re_register_is_possiblE
@@ -311,6 +325,26 @@ struct burn_drive *burn_drive_finish_enum(struct burn_drive *d)
}


/* ts A61125 : model aspects of burn_drive_release */
int burn_drive_mark_unready(struct burn_drive *d)
{
/* ts A61020 : mark media info as invalid */
d->start_lba= -2000000000;
d->end_lba= -2000000000;

d->status = BURN_DISC_UNREADY;
if (d->toc_entry != NULL)
free(d->toc_entry);
d->toc_entry = NULL;
d->toc_entries = 0;
if (d->disc != NULL) {
burn_disc_free(d->disc);
d->disc = NULL;
}
return 1;
}


void burn_drive_release(struct burn_drive *d, int le)
{
if (d->released) {
@@ -334,26 +368,14 @@ void burn_drive_release(struct burn_drive *d, int le)
return;
}

/* ts A61020 : mark media info as invalid */
d->start_lba= -2000000000;
d->end_lba= -2000000000;

d->unlock(d);
if (le)
d->eject(d);

d->release(d);

d->status = BURN_DISC_UNREADY;
d->released = 1;
if (d->toc_entry != NULL)
free(d->toc_entry);
d->toc_entry = NULL;
d->toc_entries = 0;
if (d->disc != NULL) {
burn_disc_free(d->disc);
d->disc = NULL;
}

/* ts A61125 : outsourced model aspects */
burn_drive_mark_unready(d);
}


@@ -435,6 +457,10 @@ void burn_disc_erase_sync(struct burn_drive *d, int fast)
sleep(1);
d->progress.sector = 0x10000;
d->busy = BURN_DRIVE_IDLE;

/* ts A61125 : update media state records */
burn_drive_mark_unready(d);
burn_drive_inquire_media(d);
}

enum burn_disc_status burn_disc_get_status(struct burn_drive *d)


+ 5
- 0
libburn/drive.h View File

@@ -69,5 +69,10 @@ int burn_setup_drive(struct burn_drive *d, char *fname);
*/
struct burn_drive *burn_drive_finish_enum(struct burn_drive *d);

/* ts A61125 : media status aspects of burn_drive_grab() */
int burn_drive_inquire_media(struct burn_drive *d);

/* ts A61125 : model aspects of burn_drive_release */
int burn_drive_mark_unready(struct burn_drive *d);

#endif /* __DRIVE */

+ 4
- 0
libburn/write.c View File

@@ -923,6 +923,10 @@ return crap. so we send the command, then ignore the result.
burn_print(1, "done\n");
d->busy = BURN_DRIVE_IDLE;

/* ts A61125 : update media state records */
burn_drive_mark_unready(d);
burn_drive_inquire_media(d);

/* ts A61012 : This return was traditionally missing. I suspect this
to have caused Cdrskin_eject() failures */
return;


+ 0
- 30
test/libburner.c View File

@@ -25,8 +25,6 @@
libburner_aquire_by_driveno() demonstrates a scan-and-choose approach
With that aquired drive you can blank a CD-RW
libburner_blank_disc()
Between blanking and burning one eventually has to reload the drive status
libburner_regrab()
With the aquired drive you can burn to CD-R or blank CD-RW
libburner_payload()
When everything is done, main() releases the drive and shuts down libburn:
@@ -287,27 +285,6 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
}


/** This gesture is necessary to get the drive info after blanking.
It opens a small gap for losing the drive to another libburn instance.
We will work on closing this gap.
*/
int libburner_regrab(struct burn_drive *drive) {
int ret;

printf("Releasing and regrabbing drive ...\n");
if (drive_is_grabbed)
burn_drive_release(drive, 0);
drive_is_grabbed = 0;
ret = burn_drive_grab(drive, 0);
if (ret != 0) {
drive_is_grabbed = 1;
printf("Done\n");
} else
printf("FAILED\n");
return !!ret;
}


/** Brings preformatted track images (ISO 9660, audio, ...) onto media.
To make sure a data image is fully readable on any Linux machine, this
function adds 300 kB of padding to the (usualy single) track.
@@ -606,13 +583,6 @@ int main(int argc, char **argv)
do_blank == 1);
if (ret<=0)
{ ret = 36; goto release_drive; }
if (ret != 2 && source_adr_count > 0)
ret = libburner_regrab(drive_list[driveno].drive);
if (ret<=0) {
fprintf(stderr,
"FATAL: Cannot release and grab again drive after blanking\n");
{ ret = 37; goto finish_libburn; }
}
}
if (source_adr_count > 0) {
ret = libburner_payload(drive_list[driveno].drive,


Loading…
Cancel
Save