New API call burn_track_set_isrc_string()

This commit is contained in:
Thomas Schmitt 2011-12-27 11:56:54 +00:00
parent 3559c91cc2
commit 16a228da03
5 changed files with 98 additions and 20 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2011.12.25.110440"
#define Cdrskin_timestamP "2011.12.27.115645"

View File

@ -1862,7 +1862,8 @@ int burn_disc_remove_session(struct burn_disc *d, struct burn_session *s);
>>> supported TRACK datatypes: AUDIO MODE1/2048
>>> ignored commands: POSTGAP PREGAP FLAGS
>>> ignored INDEX numbers: 00, 02 to 99
>>> ignored CUE SHEET features: CATALOG and ISRC (but supported as CD-TEXT)
>>> ignored CUE SHEET features: CATALOG and ISRC
>>> (not yet transmitted by mode page 5)
>>> ignored FLAGS: DCP 4CH PRE SCMS
>>> not allowed: mixing of ADUIO and MODE1/2048
>>> not allowed: unsupported FILE types
@ -1891,6 +1892,8 @@ int burn_disc_remove_session(struct burn_disc *d, struct burn_session *s);
@param flag Bitfield for control purposes.
bit0= Do not attach CD-TEXT information to session and
tracks. Do not load text_packs.
bit1= Do not use media catalog string of session or ISRC
strings of tracks for writing to Q sub-channel.
@return > 0 indicates success, <= 0 indicates failure
@since 1.2.0
*/
@ -2149,7 +2152,9 @@ int burn_session_get_cdtext(struct burn_session *s, int block,
shall be read and interpreted.
@param block Number of the language block in which the attributes
shall appear. Possible values: 0 to 7.
@param flag Bitfield for control purposes. Unused yet. Submit 0.
@param flag Bitfield for control purposes.
bit1= Do not use media catalog string of session or ISRC
strings of tracks for writing to Q sub-channel.
@return > 0 indicates success , <= 0 is failure
@since 1.2.0
*/
@ -2328,7 +2333,8 @@ int burn_track_dispose_cdtext(struct burn_track *t, int block);
int burn_track_set_cdxa_conv(struct burn_track *t, int value);
/** Set the ISRC details for a track
/** Set the ISRC details for a track. When writing to CD media, ISRC will get
written into the Q sub-channel.
@param t The track to change
@param country the 2 char country code. Each character must be
only numbers or letters.
@ -2340,11 +2346,25 @@ int burn_track_set_cdxa_conv(struct burn_track *t, int value);
void burn_track_set_isrc(struct burn_track *t, char *country, char *owner,
unsigned char year, unsigned int serial);
/* ts B11226 */
/** Set the composed ISRC string for a track. This is an alternative to
burn_track_set_isrc().
@param t The track to be manipulated
@param isrc 12 characters which are composed from ISRC details.
Format is CCOOOYYSSSSS, terminated by a 0-byte:
Country, Owner, Year(decimal digits), Serial(decimal digits).
@param flag Bitfield for control purposes. Unused yet. Submit 0.
@return > 0 indicates success, <= 0 means failure
@since 1.2.0
*/
int burn_track_set_isrc_string(struct burn_track *t, char isrc[13], int flag);
/** Disable ISRC parameters for a track
@param t The track to change
*/
void burn_track_clear_isrc(struct burn_track *t);
/** Hide the first track in the "pre gap" of the disc
@param s session to change
@param onoff 1 to enable hiding, 0 to disable
@ -2801,9 +2821,24 @@ int burn_write_opts_set_underrun_proof(struct burn_write_opts *opts,
*/
void burn_write_opts_set_perform_opc(struct burn_write_opts *opts, int opc);
void burn_write_opts_set_has_mediacatalog(struct burn_write_opts *opts, int has_mediacatalog);
void burn_write_opts_set_mediacatalog(struct burn_write_opts *opts, unsigned char mediacatalog[13]);
/** The Q sub-channel of a CD may contain a Media Catalog Number of 13 decimal
digits. This call sets the string of digits, but does not yet activate it
for writing.
@param opts The write opts to change
@param mediacatalog The 13 decimal digits as ASCII bytes. I.e. '0' = 0x30.
*/
void burn_write_opts_set_mediacatalog(struct burn_write_opts *opts,
unsigned char mediacatalog[13]);
/** This call activates the Media Catalog Number for writing. The digits of
that number have to be set by call burn_write_opts_set_mediacatalog().
@param opts The write opts to change
@param has_mediacatalog 1= activate writing of catalog to Q sub-channel
0= deactivate it
*/
void burn_write_opts_set_has_mediacatalog(struct burn_write_opts *opts,
int has_mediacatalog);
/* ts A61106 */

View File

@ -154,6 +154,7 @@ burn_track_set_cdxa_conv;
burn_track_set_cdtext;
burn_track_set_default_size;
burn_track_set_isrc;
burn_track_set_isrc_string;
burn_track_set_size;
burn_track_set_source;
burn_version;

View File

@ -99,6 +99,7 @@ struct burn_session *burn_session_create(void)
s->cdtext_copyright[i] = 0x00;
}
s->cdtext_language[0] = 0x09; /* Single-block default is English */
s->mediacatalog[0] = 0;
return s;
}
@ -359,6 +360,9 @@ void burn_track_set_isrc(struct burn_track *t, char *country, char *owner,
{
int i;
/* ts B11226 */
t->isrc.has_isrc = 0;
for (i = 0; i < 2; ++i) {
/* ts A61008 : This is always true */
@ -412,6 +416,26 @@ is_not_allowed:;
return;
}
/* ts B11226 API */
int burn_track_set_isrc_string(struct burn_track *t, char isrc[13], int flag)
{
unsigned char year;
unsigned int serial = 2000000000;
if (strlen(isrc) != 12 ||
isrc[5] < '0' || isrc[5] > '9' || isrc[6] < '0' || isrc[6] > '9') {
libdax_msgs_submit(libdax_messenger, -1, 0x00020114,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"Attempt to set ISRC with bad data", 0, 0);
return 0;
}
year = (isrc[5] - '0') * 10 + (isrc[6] - '0');
isrc[12] = 0;
sscanf(isrc + 7, "%u", &serial);
burn_track_set_isrc(t, isrc, isrc + 2, year, serial);
return t->isrc.has_isrc;
}
void burn_track_clear_isrc(struct burn_track *t)
{
t->isrc.has_isrc = 0;
@ -992,6 +1016,7 @@ struct burn_cue_file_cursor {
struct burn_source *fifo;
int swap_audio_bytes;
int no_cdtext;
int no_catalog_isrc;
struct burn_source *offst_source;
int current_file_ba;
struct burn_track *prev_track;
@ -1021,6 +1046,7 @@ static int cue_crs_new(struct burn_cue_file_cursor **reply, int flag)
crs->fifo = NULL;
crs->swap_audio_bytes = 0;
crs->no_cdtext = 0;
crs->no_catalog_isrc = 0;
crs->offst_source = NULL;
crs->current_file_ba = -1000000000;
crs->prev_track = NULL;
@ -1261,13 +1287,22 @@ static int cue_interpret_line(struct burn_session *session, char *line,
}
if (strcmp(cmd, "CATALOG") == 0) {
for (cpt = apt; (cpt - apt) < 13 && *cpt == (*cpt & 0x7f);
cpt++);
if ((cpt - apt) < 13) {
libdax_msgs_submit(libdax_messenger, -1, 0x00020194,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"In cue sheet file: Inappropriate content of CATALOG",
0, 0);
ret = 0; goto ex;
}
ret = cue_set_cdtext(session, NULL, 0x8e, apt, crs, 0);
if (ret <= 0)
goto ex;
/* >>> ??? data for burn_write_opts_set_mediacatalog ?
(not implemented yet in SAO) */
if (!crs->no_catalog_isrc) {
memcpy(session->mediacatalog, apt, 13);
session->mediacatalog[13] = 0;
}
} else if (strcmp(cmd, "CDTEXTFILE") == 0) {
if (crs->no_cdtext) {
@ -1477,9 +1512,11 @@ overlapping_ba:;
1 | 2);
if (ret <= 0)
goto ex;
/* >>> ??? burn_track_set_isrc ?
(not implemented yet in SAO) */
if (!crs->no_catalog_isrc) {
ret = burn_track_set_isrc_string(crs->track, apt, 0);
if (ret <= 0)
goto ex;
}
} else if (strcmp(cmd, "PERFORMER") == 0) {
ret = cue_set_cdtext(session, crs->track, 0x81, apt, crs, 2);
@ -1593,6 +1630,8 @@ ex:;
/* ts B11216 API */
/* @param flag bit0= do not attach CD-TEXT information to session and tracks
bit1= do not attach CATALOG to session or ISRC to track for
writing to Q sub-channel
*/
int burn_session_by_cue_file(struct burn_session *session, char *path,
int fifo_size, struct burn_source **fifo,
@ -1620,6 +1659,7 @@ int burn_session_by_cue_file(struct burn_session *session, char *path,
if (ret <= 0)
goto ex;
crs->no_cdtext = (flag & 1);
crs->no_catalog_isrc = !!(flag & 2);
crs->fifo_size = fifo_size;
crs->block_size_locked = 1; /* No mixed sessions for now */

View File

@ -123,6 +123,8 @@ struct burn_session
unsigned char cdtext_copyright[8];
unsigned char cdtext_language[8];
/* ts B11226 */
unsigned char mediacatalog[14]; /* overrideable by burn_write_opts */
};
struct burn_disc