diff --git a/libburn/trunk/libburn/drive.c b/libburn/trunk/libburn/drive.c index ad023582..18d4e6c2 100644 --- a/libburn/trunk/libburn/drive.c +++ b/libburn/trunk/libburn/drive.c @@ -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) diff --git a/libburn/trunk/libburn/drive.h b/libburn/trunk/libburn/drive.h index f511966b..ca9ca868 100644 --- a/libburn/trunk/libburn/drive.h +++ b/libburn/trunk/libburn/drive.h @@ -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 */ diff --git a/libburn/trunk/libburn/write.c b/libburn/trunk/libburn/write.c index 45046b49..c3ae3419 100644 --- a/libburn/trunk/libburn/write.c +++ b/libburn/trunk/libburn/write.c @@ -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; diff --git a/libburn/trunk/test/libburner.c b/libburn/trunk/test/libburner.c index e6f53271..b63b61ae 100644 --- a/libburn/trunk/test/libburner.c +++ b/libburn/trunk/test/libburner.c @@ -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,