Classified media with TOC read error as unsuitable (rather than as blank)

This commit is contained in:
Thomas Schmitt 2006-10-20 15:16:29 +00:00
parent af44cbccf2
commit 4718ad99f9
6 changed files with 67 additions and 6 deletions

View File

@ -171,6 +171,7 @@ or
#define Cdrskin_libburn_has_burn_aborT 1 #define Cdrskin_libburn_has_burn_aborT 1
#define Cdrskin_libburn_has_audioxtR 1 #define Cdrskin_libburn_has_audioxtR 1
#define Cdrskin_libburn_has_get_start_end_lbA 1 #define Cdrskin_libburn_has_get_start_end_lbA 1
#define Cdrskin_libburn_has_burn_disc_unsuitablE 1
#endif #endif
#ifndef Cdrskin_libburn_versioN #ifndef Cdrskin_libburn_versioN
@ -3156,6 +3157,18 @@ int Cdrskin_report_disc_status(struct CdrskiN *skin, enum burn_disc_status s,
"BURN_DISC_APPENDABLE \"There is an incomplete disc in the drive\"\n"); "BURN_DISC_APPENDABLE \"There is an incomplete disc in the drive\"\n");
} else if(s==BURN_DISC_EMPTY) { } else if(s==BURN_DISC_EMPTY) {
printf("BURN_DISC_EMPTY \"There is no disc at all in the drive\"\n"); printf("BURN_DISC_EMPTY \"There is no disc at all in the drive\"\n");
} else if(s==BURN_DISC_UNREADY) {
printf("BURN_DISC_UNREADY \"The current status is not yet known\"\n");
#ifdef Cdrskin_libburn_has_burn_disc_unsuitablE
} else if(s==BURN_DISC_UNGRABBED) {
printf("BURN_DISC_UNGRABBED \"API usage error: drive not grabbed\"\n");
} else if(s==BURN_DISC_UNSUITABLE) {
printf("BURN_DISC_UNSUITABLE \"Media is not suitable\"\n");
#endif /* Cdrskin_libburn_has_burn_disc_unsuitablE */
} else } else
printf("-unknown status code-\n"); printf("-unknown status code-\n");
return(1); return(1);

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2006.10.20.113421" #define Cdrskin_timestamP "2006.10.20.151602"

View File

@ -45,7 +45,8 @@ void burn_drive_free(struct burn_drive *d)
sg_close_drive(d); sg_close_drive(d);
free((void *) d->idata); free((void *) d->idata);
free((void *) d->mdata); free((void *) d->mdata);
free((void *) d->toc_entry); if(d->toc_entry != NULL)
free((void *) d->toc_entry);
free(d->devname); free(d->devname);
d->global_index = -1; d->global_index = -1;
} }
@ -162,7 +163,10 @@ int burn_drive_grab(struct burn_drive *d, int le)
d->load(d); d->load(d);
d->lock(d); d->lock(d);
d->status = BURN_DISC_BLANK;
/* ts A61020 : this was BURN_DISC_BLANK as pure guess */
d->status = BURN_DISC_UNREADY;
if (d->mdata->cdr_write || d->mdata->cdrw_write || if (d->mdata->cdr_write || d->mdata->cdrw_write ||
d->mdata->dvdr_write || d->mdata->dvdram_write) { d->mdata->dvdr_write || d->mdata->dvdram_write) {
@ -186,6 +190,8 @@ int burn_drive_grab(struct burn_drive *d, int le)
old_erasable = new_erasable; old_erasable = new_erasable;
d->read_disc_info(d); d->read_disc_info(d);
if(d->status == BURN_DISC_UNSUITABLE)
break;
new_speed = burn_drive_get_write_speed(d); new_speed = burn_drive_get_write_speed(d);
new_erasable = burn_disc_erasable(d); new_erasable = burn_disc_erasable(d);
@ -309,7 +315,7 @@ void burn_drive_release(struct burn_drive *d, int le)
d->status = BURN_DISC_UNREADY; d->status = BURN_DISC_UNREADY;
d->released = 1; d->released = 1;
if (d->toc_entry) if (d->toc_entry != NULL)
free(d->toc_entry); free(d->toc_entry);
d->toc_entry = NULL; d->toc_entry = NULL;
d->toc_entries = 0; d->toc_entries = 0;
@ -1118,3 +1124,15 @@ int burn_drive_get_start_end_lba(struct burn_drive *d,
*end_lba= d->end_lba; *end_lba= d->end_lba;
return 1; return 1;
} }
/* ts A61020 API function */
int burn_disc_pretend_blank(struct burn_drive *d)
{
if (d->status != BURN_DISC_UNREADY &&
d->status != BURN_DISC_UNSUITABLE)
return 0;
d->status = BURN_DISC_BLANK;
return 1;
}

View File

@ -176,7 +176,11 @@ enum burn_disc_status
/* ts A61007 */ /* ts A61007 */
/** The drive was not grabbed when the status was inquired */ /** The drive was not grabbed when the status was inquired */
BURN_DISC_UNGRABBED BURN_DISC_UNGRABBED,
/* ts A61020 */
/** The media seems not to be suitable for burning */
BURN_DISC_UNSUITABLE
}; };
@ -628,6 +632,16 @@ void burn_drive_release(struct burn_drive *drive, int eject);
enum burn_disc_status burn_disc_get_status(struct burn_drive *drive); enum burn_disc_status burn_disc_get_status(struct burn_drive *drive);
/* ts A61020 */
/** WARNING: This revives an old bug-like behavior that might be dangerous.
Sets the drive status to BURN_DISC_BLANK if it is BURN_DISC_UNREADY
or BURN_DISC_UNSUITABLE. Thus marking media as writable which actually
failed to declare themselves either blank or (partially) filled.
@return 1 drive status has been set , 0 = unsuitable drive status
*/
int burn_disc_pretend_blank(struct burn_drive *d);
/* ts A61020 */ /* ts A61020 */
/** Returns start and end lba of the media which is currently inserted /** Returns start and end lba of the media which is currently inserted
in the given drive. The drive has to be grabbed to have hope for reply. in the given drive. The drive has to be grabbed to have hope for reply.

View File

@ -318,7 +318,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
0x0002010a (FATAL,HIGH) = Unsuitable track mode 0x0002010a (FATAL,HIGH) = Unsuitable track mode
0x0002010b (FATAL,HIGH) = Burn run failed 0x0002010b (FATAL,HIGH) = Burn run failed
0x0002010c (FATAL,HIGH) = Failed to transfer command to drive 0x0002010c (FATAL,HIGH) = Failed to transfer command to drive
0x0002010d 0x0002010d (DEBUG,HIGH) = Could not inquire TOC
0x0002010e 0x0002010e
0x0002010f 0x0002010f
0x00020110 (FATAL,HIGH) = Persistent drive address too long 0x00020110 (FATAL,HIGH) = Persistent drive address too long

View File

@ -286,7 +286,23 @@ void mmc_read_toc(struct burn_drive *d)
d->issue_command(d, &c); d->issue_command(d, &c);
if (c.error) { if (c.error) {
/* ts A61020 : this snaps on non-blank DVD media */
/* Very unsure wether this old measure is ok.
Obviously higher levels do not care about this.
DVD+RW burns go on after passing through here.
d->busy = BURN_DRIVE_IDLE; d->busy = BURN_DRIVE_IDLE;
*/
libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002010d,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
"Could not inquire TOC (non-blank DVD media ?)", 0,0);
d->status = BURN_DISC_UNSUITABLE;
d->toc_entries = 0;
/* Prefering memory leaks over fandangos */
d->toc_entry = malloc(sizeof(struct burn_toc_entry));
return; return;
} }