Implemented track number starts > 1 with .cue and v07t.txt files
This commit is contained in:
parent
d35cb78a74
commit
6321bbc0f8
@ -1 +1 @@
|
|||||||
#define Cdrskin_timestamP "2012.01.07.190901"
|
#define Cdrskin_timestamP "2012.01.08.132304"
|
||||||
|
@ -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:
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
>>>
|
>>>
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user