From 6c22b982354b60daf9cd345a4779668c28132836 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sat, 11 Nov 2006 12:22:53 +0000 Subject: [PATCH] New API function burn_disc_track_lba_nwa() --- cdrskin/cdrskin_timestamp.h | 2 +- libburn/drive.c | 28 ++++++++++++++++++++++++++++ libburn/libburn.h | 19 +++++++++++++++++++ libburn/libdax_msgs.h | 2 ++ libburn/mmc.c | 24 ++++++++++++++++-------- libburn/mmc.h | 6 +++++- libburn/transport.h | 2 +- libburn/write.c | 16 ++++++++-------- 8 files changed, 80 insertions(+), 19 deletions(-) diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index 2223a98..2a91332 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2006.11.10.185209" +#define Cdrskin_timestamP "2006.11.11.122402" diff --git a/libburn/drive.c b/libburn/drive.c index 93d64dd..cf79bcf 100644 --- a/libburn/drive.c +++ b/libburn/drive.c @@ -1202,3 +1202,31 @@ int burn_disc_read_atip(struct burn_drive *d) return 1; } +/* ts A61110 : new API function */ +int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o, + int trackno, int *lba, int *nwa) +{ + int ret; + + if (burn_drive_is_released(d)) { + libdax_msgs_submit(libdax_messenger, + d->global_index, 0x0002011b, + LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, + "Attempt to read track info from ungrabbed drive", + 0, 0); + return -1; + } + if (d->busy != BURN_DRIVE_IDLE) { + libdax_msgs_submit(libdax_messenger, + d->global_index, 0x0002011c, + LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, + "Attempt to read track info from busy drive", + 0, 0); + return -1; + } + if (o!=NULL) + d->send_write_parameters(d, o); + ret = d->get_nwa(d, trackno, lba, nwa); + return ret; +} + diff --git a/libburn/libburn.h b/libburn/libburn.h index d256335..f0f9d93 100644 --- a/libburn/libburn.h +++ b/libburn/libburn.h @@ -41,6 +41,10 @@ struct burn_session; /** References a single track on a disc */ struct burn_track; +/* ts A61111 */ +/** References a set of write parameters */ +struct burn_write_opts; + /** Session format for normal audio or data discs */ #define BURN_CDROM 0 /** Session format for obsolete CD-I discs */ @@ -691,6 +695,21 @@ int burn_disc_read_atip(struct burn_drive *drive); int burn_drive_get_start_end_lba(struct burn_drive *drive, int *start_lba, int *end_lba, int flag); +/* ts A61110 */ +/** Read start lba and Next Writeable Address of a track from media. + Usually a track lba is obtained from the result of burn_track_get_entry(). + This call retrieves an updated lba, eventual nwa, and can address the + invisible track to come. + The drive must be grabbed for this call. One may not issue this call + during ongoing burn_disc_write() or burn_disc_erase(). + @param d The drive to query. + @param o If not NULL: write parameters to be set on drive before query + @param trackno 0=next track to come, >0 number of existing track + @return 1=nwa is valid , 0=nwa is not valid , -1=error +*/ +int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o, + int trackno, int *lba, int *nwa); + /** Tells whether a disc can be erased or not @return Non-zero means erasable diff --git a/libburn/libdax_msgs.h b/libburn/libdax_msgs.h index f17a97e..cb0ffc4 100644 --- a/libburn/libdax_msgs.h +++ b/libburn/libdax_msgs.h @@ -332,6 +332,8 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff 0x00020118 (DEBUG,HIGH) = Closing track 0x00020119 (DEBUG,HIGH) = Closing session 0x0002011a (NOTE,HIGH) = Padding up track to minimum size + 0x0002011b (FATAL,HIGH) = Attempt to read track info from ungrabbed drive + 0x0002011c (FATAL,HIGH) = Attempt to read track info from busy drive libdax_audioxtr: 0x00020200 (SORRY,HIGH) = Cannot open audio source file diff --git a/libburn/mmc.c b/libburn/mmc.c index 867163d..671caca 100644 --- a/libburn/mmc.c +++ b/libburn/mmc.c @@ -99,7 +99,9 @@ void mmc_send_cue_sheet(struct burn_drive *d, struct cue_sheet *s) d->issue_command(d, &c); } -int mmc_get_nwa(struct burn_drive *d) +/* ts A61110 : added parameters trackno, lba, nwa. Redefined return value. + @return 1=nwa is valid , 0=nwa is not valid , -1=error */ +int mmc_get_nwa(struct burn_drive *d, int trackno, int *lba, int *nwa) { struct buffer buf; struct command c; @@ -110,21 +112,27 @@ int mmc_get_nwa(struct burn_drive *d) c.oplen = sizeof(MMC_TRACK_INFO); memcpy(c.opcode, MMC_TRACK_INFO, sizeof(MMC_TRACK_INFO)); c.opcode[1] = 1; - c.opcode[5] = 0xFF; + if(trackno<=0) + c.opcode[5] = 0xFF; + else + c.opcode[5] = trackno; c.page = &buf; c.dir = FROM_DRIVE; d->issue_command(d, &c); data = c.page->data; - /* ts A61106 : >>> MMC-1 Table 142 : NWA_V = NWA Valid Flag - What to do if this is not 1 ? */ - if (!(data[7]&1)) + *lba = (data[8] << 24) + (data[9] << 16) + + (data[10] << 8) + data[11]; + *nwa = (data[12] << 24) + (data[13] << 16) + + (data[14] << 8) + data[15]; + /* ts A61106 : MMC-1 Table 142 : NWA_V = NWA Valid Flag */ + if (!(data[7]&1)) { libdax_msgs_submit(libdax_messenger, -1, 0x00000002, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, "mmc_get_nwa: Track Info Block: NWA_V == 0", 0, 0); - - return (data[12] << 24) + (data[13] << 16) - + (data[14] << 8) + data[15]; + return 0; + } + return 1; } /* ts A61009 : function is obviously unused. */ diff --git a/libburn/mmc.h b/libburn/mmc.h index 02a0332..b2f873f 100644 --- a/libburn/mmc.h +++ b/libburn/mmc.h @@ -37,7 +37,11 @@ void mmc_set_speed(struct burn_drive *, int, int); void mmc_read_lead_in(struct burn_drive *, struct buffer *); void mmc_perform_opc(struct burn_drive *); void mmc_get_configuration(struct burn_drive *); -int mmc_get_nwa(struct burn_drive *); + +/* ts A61110 : added parameters trackno, lba, nwa. Redefined return value. + @return 1=nwa is valid , 0=nwa is not valid , -1=error */ +int mmc_get_nwa(struct burn_drive *d, int trackno, int *lba, int *nwa); + void mmc_send_cue_sheet(struct burn_drive *, struct cue_sheet *); /* ts A61023 : get size and free space of drive buffer */ diff --git a/libburn/transport.h b/libburn/transport.h index ebb0916..6f73217 100644 --- a/libburn/transport.h +++ b/libburn/transport.h @@ -182,7 +182,7 @@ struct burn_drive void (*send_cue_sheet) (struct burn_drive *, struct cue_sheet *); void (*sync_cache) (struct burn_drive *); int (*get_erase_progress) (struct burn_drive *); - int (*get_nwa) (struct burn_drive *); + int (*get_nwa) (struct burn_drive *, int trackno, int *lba, int *nwa); /* ts A61009 : removed d in favor of o->drive */ /* void (*close_disc) (struct burn_drive * d, diff --git a/libburn/write.c b/libburn/write.c index 46fecbc..479619d 100644 --- a/libburn/write.c +++ b/libburn/write.c @@ -570,7 +570,7 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s, { struct burn_track *t = s->track[tnum]; struct burn_drive *d = o->drive; - int i, tmp = 0, open_ended = 0, ret, nwa; + int i, tmp = 0, open_ended = 0, ret, nwa, lba; int sectors; char msg[80]; @@ -609,9 +609,10 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s, d->send_write_parameters(d, o); /* ts A61103 */ - nwa = d->get_nwa(d); - sprintf(msg, "pre-track %2.2d : get_nwa()= %d , d->nwa= %d\n", - tnum+1, nwa, d->nwa); + ret = d->get_nwa(d, -1, &lba, &nwa); + sprintf(msg, + "pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d\n", + tnum+1, nwa, ret, d->nwa); libdax_msgs_submit(libdax_messenger, d->global_index, 0x000002, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg,0,0); @@ -749,8 +750,7 @@ void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc) struct burn_drive *d = o->drive; struct buffer buf; struct burn_track *lt; - int first = 1, i; - int nwa; + int first = 1, i, ret, lba, nwa; char msg[80]; /* ts A60924 : libburn/message.c gets obsoleted @@ -778,8 +778,8 @@ return crap. so we send the command, then ignore the result. d->send_write_parameters(d, o); - nwa = d->get_nwa(d); - sprintf(msg, "Inquired nwa: %d", nwa); + ret = d->get_nwa(d, -1, &lba, &nwa); + sprintf(msg, "Inquired nwa: %d (ret=%d)", nwa, ret); libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,