Implemented track number starts > 1 with .cue and v07t.txt files

This commit is contained in:
Thomas Schmitt 2012-01-08 13:23:16 +00:00
parent d35cb78a74
commit 6321bbc0f8
5 changed files with 59 additions and 56 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2012.01.07.190901" #define Cdrskin_timestamP "2012.01.08.132304"

View File

@ -453,6 +453,13 @@ There is a reader for Sony Input Sheet Version 0.7T:
int burn_session_input_sheet_v07t(struct burn_session *session, int burn_session_input_sheet_v07t(struct burn_session *session,
char *path, int block, int flag); char *path, int block, int flag);
CD-TEXT can be read from a CDRWIN cue sheet file which defines the tracks
of a session
int burn_session_by_cue_file(struct burn_session *session,
char *path, int fifo_size, struct burn_source **fifo,
unsigned char **text_packs, int *num_packs, int flag);
The session and track attributes can then be converted into an array of The session and track attributes can then be converted into an array of
text packs by: text packs by:
@ -485,12 +492,22 @@ and for removing attached attributes:
int burn_track_dispose_cdtext(struct burn_track *t, int block); int burn_track_dispose_cdtext(struct burn_track *t, int block);
CD-TEXT can be read from a CDRWIN cue sheet file which defines the tracks
of a session
int burn_session_by_cue_file(struct burn_session *session, UPC/EAN and ISRC not only affect CD-TEXT but also information that is written
char *path, int fifo_size, struct burn_source **fifo, along with the tracks in Q sub-channel. These can be influenced by
unsigned char **text_packs, int *num_packs, int flag); burn_session_input_sheet_v07t(), burn_session_by_cue_file() and by
void burn_write_opts_set_mediacatalog(struct burn_write_opts *opts,
unsigned char mediacatalog[13]);
void burn_write_opts_set_has_mediacatalog(struct burn_write_opts *opts,
int has_mediacatalog);
void burn_track_set_isrc(struct burn_track *t, char *country, char *owner,
unsigned char year, unsigned int serial);
int burn_track_set_isrc_string(struct burn_track *t, char isrc[13],
int flag);
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -572,11 +589,6 @@ If a track attribute is set, but the corresponding session attribute is not
defined or defined with empty text, then the session attribute gets attached defined or defined with empty text, then the session attribute gets attached
as empty test. (Normally empty content is ignored.) as empty test. (Normally empty content is ignored.)
libburn will always start track numbering by 1. So it adjusts all track
numbers from the input sheet file by subtracting (First Track Number - 1).
libburn ignores Last Track number because it will always write its own first
and last track numbers to pack type 0x8f.
Example cdrskin run with three tracks: Example cdrskin run with three tracks:

View File

@ -36,6 +36,7 @@ struct burn_pack_cursor {
int td_used; int td_used;
int hiseq[8]; int hiseq[8];
int pack_count[16]; int pack_count[16];
int track_offset;
}; };
@ -196,13 +197,10 @@ static int burn_create_bl_size_packs(int block, unsigned char *char_codes,
{ {
int i, ret; int i, ret;
unsigned char payload[12]; unsigned char payload[12];
/* Normal is track_offset = 0.
But if the CUE sheet supports offset, then it is needed here too */
int track_offset = 0;
payload[0] = char_codes[block]; payload[0] = char_codes[block];
payload[1] = 1 + track_offset; payload[1] = crs->track_offset;
payload[2] = num_tracks + track_offset; payload[2] = num_tracks + crs->track_offset - 1;
payload[3] = copyrights[block]; payload[3] = copyrights[block];
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
payload[i + 4] = crs->pack_count[i]; payload[i + 4] = crs->pack_count[i];
@ -318,9 +316,6 @@ static int burn_create_tybl_s_packs(struct burn_session *s,
{ {
int i, ret, idx, double_byte, use_tab; int i, ret, idx, double_byte, use_tab;
struct burn_cdtext *cdt; struct burn_cdtext *cdt;
/* Normal is track_offset = 0.
But if the CUE sheet supports offset, then it is needed here too */
int track_offset = 0;
cdt = s->cdtext[block]; cdt = s->cdtext[block];
idx = pack_type - Libburn_pack_type_basE; idx = pack_type - Libburn_pack_type_basE;
@ -347,7 +342,7 @@ static int burn_create_tybl_s_packs(struct burn_session *s,
else else
use_tab = 0; use_tab = 0;
ret = burn_create_tybl_t_packs(s->track[i], ret = burn_create_tybl_t_packs(s->track[i],
i + 1 + track_offset, pack_type, i + crs->track_offset, pack_type,
block, crs, use_tab); block, crs, use_tab);
if (ret <= 0) if (ret <= 0)
return ret; return ret;
@ -375,6 +370,7 @@ int burn_cdtext_from_session(struct burn_session *s,
*num_packs = 0; *num_packs = 0;
} }
memset(&crs, 0, sizeof(struct burn_pack_cursor)); memset(&crs, 0, sizeof(struct burn_pack_cursor));
crs.track_offset = s->firsttrack;
BURN_ALLOC_MEM(crs.packs, unsigned char, BURN_ALLOC_MEM(crs.packs, unsigned char,
Libburn_leadin_cdtext_packs_maX * 18); Libburn_leadin_cdtext_packs_maX * 18);
@ -627,7 +623,7 @@ int burn_session_input_sheet_v07t(struct burn_session *session,
char *path, int block, int flag) char *path, int block, int flag)
{ {
int ret = 0, num_tracks, char_codes[8], copyrights[8], languages[8], i; int ret = 0, num_tracks, char_codes[8], copyrights[8], languages[8], i;
int genre_code = -1, track_offset = 1, length, pack_type, tno; int genre_code = -1, track_offset = 1, length, pack_type, tno, tnum;
int session_attr_seen[16], track_attr_seen[16]; int session_attr_seen[16], track_attr_seen[16];
int int0x00 = 0x00, int0x01 = 0x01; int int0x00 = 0x00, int0x01 = 0x01;
struct stat stbuf; struct stat stbuf;
@ -865,15 +861,10 @@ bad_tno:;
ret = 0; goto ex; ret = 0; goto ex;
} else { } else {
track_offset = ret; track_offset = ret;
if (ret != 1) { ret = burn_session_set_start_tno(session,
sprintf(msg, track_offset, 0);
"First Track Number '%s' will be mapped to 1", if (ret <= 0)
payload); goto ex;
libdax_msgs_submit(libdax_messenger,-1,
0x00020195, LIBDAX_MSGS_SEV_WARNING,
LIBDAX_MSGS_PRIO_HIGH,
burn_printify(msg), 0, 0);
}
} }
} else if (strcmp(line, "Last Track Number") == 0) { } else if (strcmp(line, "Last Track Number") == 0) {
@ -890,18 +881,13 @@ bad_tno:;
} else if (strncmp(line, "Track ", 6) == 0) { } else if (strncmp(line, "Track ", 6) == 0) {
tno = -1; tno = -1;
sscanf(line + 6, "%d", &tno); sscanf(line + 6, "%d", &tno);
if (tno < 0 || tno - track_offset < 0 || if (tno < 1 || tno - track_offset < 0 ||
tno - track_offset >= num_tracks) { tno - track_offset >= num_tracks) {
track_txt[0] = line[6]; track_txt[0] = line[6];
track_txt[1] = line[7]; track_txt[1] = line[7];
track_txt[2] = 0; track_txt[2] = 0;
bad_track_no:; bad_track_no:;
if (track_offset != 1) sprintf(msg,
sprintf(msg,
"Inappropriate v07t Track number '%.3900s' (mapped to %2.2d)",
track_txt, tno - track_offset + 1);
else
sprintf(msg,
"Inappropriate v07t Track number '%.3900s'", "Inappropriate v07t Track number '%.3900s'",
track_txt); track_txt);
sprintf(msg + strlen(msg), sprintf(msg + strlen(msg),
@ -914,7 +900,7 @@ bad_track_no:;
burn_printify(msg), 0, 0); burn_printify(msg), 0, 0);
ret = 0; goto ex; ret = 0; goto ex;
} }
tno -= track_offset; tnum = tno - track_offset;
if (strcmp(line, "0x80") == 0 || if (strcmp(line, "0x80") == 0 ||
strcmp(line + 9, "Title") == 0) strcmp(line + 9, "Title") == 0)
@ -939,7 +925,7 @@ bad_track_no:;
pack_type = 0x8e; pack_type = 0x8e;
if (!(flag & 2)) { if (!(flag & 2)) {
ret = burn_track_set_isrc_string( ret = burn_track_set_isrc_string(
tracks[tno], payload, 0); tracks[tnum], payload, 0);
if (ret <= 0) if (ret <= 0)
goto ex; goto ex;
} }
@ -953,8 +939,8 @@ bad_track_no:;
burn_printify(msg), 0, 0); burn_printify(msg), 0, 0);
ret = 0; goto ex; ret = 0; goto ex;
} }
ret = v07t_cdtext_to_track(tracks[tno], block, payload, ret = v07t_cdtext_to_track(tracks[tnum], block,
&int0x00, pack_type, "", 0); payload, &int0x00, pack_type, "", 0);
if (ret <= 0) if (ret <= 0)
goto ex; goto ex;
track_attr_seen[pack_type - 0x80] = 1; track_attr_seen[pack_type - 0x80] = 1;
@ -963,22 +949,22 @@ bad_track_no:;
/* Track variation of UPC EAN = 0x8e */ /* Track variation of UPC EAN = 0x8e */
tno = -1; tno = -1;
sscanf(line + 5, "%d", &tno); sscanf(line + 5, "%d", &tno);
if (tno < 0 || tno - track_offset < 0 || if (tno <= 0 || tno - track_offset < 0 ||
tno - track_offset >= num_tracks) { tno - track_offset >= num_tracks) {
track_txt[0] = line[5]; track_txt[0] = line[5];
track_txt[1] = line[6]; track_txt[1] = line[6];
track_txt[2] = 0; track_txt[2] = 0;
goto bad_track_no; goto bad_track_no;
} }
tno -= track_offset; tnum = tno - track_offset;
if (!(flag & 2)) { if (!(flag & 2)) {
ret = burn_track_set_isrc_string( ret = burn_track_set_isrc_string(
tracks[tno], payload, 0); tracks[tnum], payload, 0);
if (ret <= 0) if (ret <= 0)
goto ex; goto ex;
} }
ret = v07t_cdtext_to_track(tracks[tno], block, payload, ret = v07t_cdtext_to_track(tracks[tnum], block,
&int0x00, 0x8e, "", 0); payload, &int0x00, 0x8e, "", 0);
if (ret <= 0) if (ret <= 0)
goto ex; goto ex;
track_attr_seen[0xe] = 1; track_attr_seen[0xe] = 1;

View File

@ -1871,7 +1871,7 @@ int burn_disc_remove_session(struct burn_disc *d, struct burn_session *s);
>>> supported FILE types: BINARY MOTOROLA WAVE >>> supported FILE types: BINARY MOTOROLA WAVE
>>> supported TRACK datatypes: AUDIO MODE1/2048 >>> supported TRACK datatypes: AUDIO MODE1/2048
>>> ignored commands: POSTGAP PREGAP >>> ignored commands: POSTGAP PREGAP
>>> not allowed: mixing of ADUIO and MODE1/2048 >>> not allowed: mixing of AUDIO and MODE1/2048
>>> not allowed: unsupported FILE types >>> not allowed: unsupported FILE types
>>> not allowed: unsupported TRACK datatypes >>> not allowed: unsupported TRACK datatypes
>>> >>>

View File

@ -1073,6 +1073,7 @@ struct burn_cue_file_cursor {
int swap_audio_bytes; int swap_audio_bytes;
int no_cdtext; int no_cdtext;
int no_catalog_isrc; int no_catalog_isrc;
int start_track_no;
struct burn_source *offst_source; struct burn_source *offst_source;
int current_file_ba; int current_file_ba;
struct burn_track *prev_track; struct burn_track *prev_track;
@ -1104,6 +1105,7 @@ static int cue_crs_new(struct burn_cue_file_cursor **reply, int flag)
crs->swap_audio_bytes = 0; crs->swap_audio_bytes = 0;
crs->no_cdtext = 0; crs->no_cdtext = 0;
crs->no_catalog_isrc = 0; crs->no_catalog_isrc = 0;
crs->start_track_no = 1;
crs->offst_source = NULL; crs->offst_source = NULL;
crs->current_file_ba = -1000000000; crs->current_file_ba = -1000000000;
crs->prev_track = NULL; crs->prev_track = NULL;
@ -1236,14 +1238,18 @@ static int cue_attach_track(struct burn_session *session,
0, 0); 0, 0);
return 0; return 0;
} }
if (crs->track_no > 1 && session->tracks == 0) { if (session->tracks == 0) {
crs->start_track_no = crs->track_no;
/* >>> ??? implement ? */; ret = burn_session_set_start_tno(session, crs->track_no, 0);
if (ret <= 0)
libdax_msgs_submit(libdax_messenger, -1, 0x00020195, return ret;
LIBDAX_MSGS_SEV_WARNING, LIBDAX_MSGS_PRIO_HIGH, }
"In cue sheet file: TRACK numbering does not start with 01", if (session->tracks + crs->start_track_no - 1 > 99) {
0, 0); libdax_msgs_submit(libdax_messenger, -1, 0x0002019b,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"CD track number exceeds 99",
0, 0);
return 0;
} }
ret = burn_session_add_track(session, crs->track, BURN_POS_END); ret = burn_session_add_track(session, crs->track, BURN_POS_END);
if (ret <= 0) if (ret <= 0)
@ -1312,7 +1318,6 @@ static int cue_open_audioxtr(char *path, struct burn_cue_file_cursor *crs,
BURN_ALLOC_MEM(msg, char, 4096); BURN_ALLOC_MEM(msg, char, 4096);
/* >>> obtain fd by libdax_audioxtr */;
ret= libdax_audioxtr_new(&xtr, path, 0); ret= libdax_audioxtr_new(&xtr, path, 0);
if (ret <= 0) if (ret <= 0)
return ret; return ret;