Transmitting CATALOG by mode page 5. ISRC too, if TAO.
This commit is contained in:
parent
cc8e069672
commit
48d56d759f
@ -1 +1 @@
|
|||||||
#define Cdrskin_timestamP "2011.12.27.133733"
|
#define Cdrskin_timestamP "2011.12.28.104044"
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
Guided by Leon Merten Lohse via libcdio-devel@gnu.org
|
Guided by Leon Merten Lohse via libcdio-devel@gnu.org
|
||||||
by reading mmc3r10g.pdf from http://www.t10.org/ftp/t10/drafts/mmc3/
|
by reading mmc3r10g.pdf from http://www.t10.org/ftp/t10/drafts/mmc3/
|
||||||
by docs and results of cdtext.zip from http://www.sonydadc.com/file/
|
by docs and results of cdtext.zip from http://www.sonydadc.com/file/
|
||||||
by reading syntax from http://digitalx.org/cue-sheet/
|
by reading http://digitalx.org/cue-sheet/syntax
|
||||||
by reading source of libcdio from http://www.gnu.org/s/libcdio
|
by reading source of libcdio from http://www.gnu.org/s/libcdio
|
||||||
which quotes source of cdrecord from ftp://ftp.berlios.de/pub/cdrecord/alpha
|
which quotes source of cdrecord from ftp://ftp.berlios.de/pub/cdrecord/alpha
|
||||||
|
|
||||||
@ -132,6 +132,10 @@ Pack type 0x8e is documented by Sony as "UPC/EAN Code (POS Code) of the album.
|
|||||||
This field typically consists of 13 characters." Always ASCII encoded.
|
This field typically consists of 13 characters." Always ASCII encoded.
|
||||||
It applies to tracks as "ISRC code [which] typically consists of 12 characters"
|
It applies to tracks as "ISRC code [which] typically consists of 12 characters"
|
||||||
and is always ISO-8859-1 encoded.
|
and is always ISO-8859-1 encoded.
|
||||||
|
MMC calls these information entities Media Catalog Number and ISRC.
|
||||||
|
The catalog number consists of 13 decimal digits.
|
||||||
|
ISRC consists of 12 characters: 2 country code [0-9A-Z], 3 owner code [0-9A-Z],
|
||||||
|
2 year digits (00 to 99), 5 serial number digits (00000 to 99999).
|
||||||
|
|
||||||
Pack type 0x8f summarizes the whole list of text packs of a block.
|
Pack type 0x8f summarizes the whole list of text packs of a block.
|
||||||
See below, Format of CD-TEXT packs, for details.
|
See below, Format of CD-TEXT packs, for details.
|
||||||
@ -631,12 +635,12 @@ attributes (CATALOG, TITLE, PERFORMER, SONGWRITER, ISRC), track block types
|
|||||||
The rules for CDRWIN cue sheet files are described at
|
The rules for CDRWIN cue sheet files are described at
|
||||||
http://digitalx.org/cue-sheet/syntax/
|
http://digitalx.org/cue-sheet/syntax/
|
||||||
|
|
||||||
----------------------------------------------------------
|
--------------------------------------
|
||||||
Example of a CDRWIN cue sheet file :
|
Example of a CDRWIN cue sheet file :
|
||||||
----------------------------------------------------------
|
--------------------------------------
|
||||||
|
|
||||||
FILE "cdtext.bin" BINARY
|
|
||||||
CATALOG 1234567890123
|
CATALOG 1234567890123
|
||||||
|
FILE "cdtext.bin" BINARY
|
||||||
TITLE "Joyful Nights"
|
TITLE "Joyful Nights"
|
||||||
TRACK 01 AUDIO
|
TRACK 01 AUDIO
|
||||||
TITLE "Song of Joy"
|
TITLE "Song of Joy"
|
||||||
@ -657,14 +661,13 @@ TITLE "Joyful Nights"
|
|||||||
ISRC XYBLG1100006
|
ISRC XYBLG1100006
|
||||||
INDEX 01 13:20:33
|
INDEX 01 13:20:33
|
||||||
|
|
||||||
----------------------------------------------------------
|
--------------------------------------
|
||||||
|
|
||||||
Several restrictions apply in the libburn call burn_session_by_cue_file():
|
Several restrictions apply in the libburn call burn_session_by_cue_file():
|
||||||
|
|
||||||
Commands FLAGS, POSTGAP, PREGAP are ignored. Only FILE types BINARY, MOTOROLA
|
Commands FLAGS, POSTGAP, PREGAP are ignored. Only FILE types BINARY, MOTOROLA
|
||||||
are allowed. Only TRACK datatypes AUDIO, MODE1/2048 are allowed. They may not
|
are allowed. Only TRACK datatypes AUDIO, MODE1/2048 are allowed. They may not
|
||||||
be mixed in the same session. INDEX numbers 00, 02 to 99 are ignored.
|
be mixed in the same session. INDEX numbers 00, 02 to 99 are ignored.
|
||||||
CATALOG and ISRC are not yet written into Q sub-channel, but only into CD-TEXT.
|
|
||||||
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
@ -98,6 +98,10 @@ parameters:
|
|||||||
Data Block Type Layout of payload blocks 8 for 2048 byte data blocks
|
Data Block Type Layout of payload blocks 8 for 2048 byte data blocks
|
||||||
0 for 2352 byte audio blocks
|
0 for 2352 byte audio blocks
|
||||||
Audio Pause Length 150 = 2 seconds
|
Audio Pause Length 150 = 2 seconds
|
||||||
|
Media Catalog Number A property of the disc 0x80 if valid
|
||||||
|
13 decimal digits as ASCII
|
||||||
|
ISRC A property of the track 0x80 if valid
|
||||||
|
12 letters and digits, ASCII
|
||||||
Any other parameters may be set to 0.
|
Any other parameters may be set to 0.
|
||||||
Mode page data as of MMC-5 table 644 are preceded by a Mode Parameter Header
|
Mode page data as of MMC-5 table 644 are preceded by a Mode Parameter Header
|
||||||
as of SPC-3 table 240. This 8-byte header may be filled with zeros.
|
as of SPC-3 table 240. This 8-byte header may be filled with zeros.
|
||||||
@ -347,9 +351,9 @@ A Write Parameters mode page 05h has to be composed and transmitted via
|
|||||||
Track Mode Describes frame type 0 (is ignored)
|
Track Mode Describes frame type 0 (is ignored)
|
||||||
Data Block Type Layout of payload blocks 0 (is ignored)
|
Data Block Type Layout of payload blocks 0 (is ignored)
|
||||||
Audio Pause Length 150 = 2 seconds (ignored ?)
|
Audio Pause Length 150 = 2 seconds (ignored ?)
|
||||||
|
Media Catalog Number 0x80 if valid
|
||||||
>>> CATALOG
|
See also Cue Sheet ADR 02h 13 decimal digits as ASCII
|
||||||
>>> no ISRC with SAO
|
(With SAO, ISRC is transmitted only by the Cue Sheet.)
|
||||||
|
|
||||||
Any other parameters may be set to 0.
|
Any other parameters may be set to 0.
|
||||||
Mode page data as of MMC-5 table 644 are preceded by a Mode Parameter Header
|
Mode page data as of MMC-5 table 644 are preceded by a Mode Parameter Header
|
||||||
|
@ -340,7 +340,7 @@ int burn_drive_send_default_page_05(struct burn_drive *d, int flag)
|
|||||||
else
|
else
|
||||||
burn_write_opts_set_write_type(opts,
|
burn_write_opts_set_write_type(opts,
|
||||||
BURN_WRITE_SAO, BURN_BLOCK_SAO);
|
BURN_WRITE_SAO, BURN_BLOCK_SAO);
|
||||||
d->send_write_parameters(d, opts);
|
d->send_write_parameters(d, NULL, 0, opts);
|
||||||
burn_write_opts_free(opts);
|
burn_write_opts_free(opts);
|
||||||
d->sent_default_page_05 = 1;
|
d->sent_default_page_05 = 1;
|
||||||
return 1;
|
return 1;
|
||||||
@ -2469,7 +2469,7 @@ int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
|
|||||||
if (d->drive_role != 1)
|
if (d->drive_role != 1)
|
||||||
return 0;
|
return 0;
|
||||||
if (o != NULL)
|
if (o != NULL)
|
||||||
d->send_write_parameters(d, o);
|
d->send_write_parameters(d, NULL, 0, o);
|
||||||
ret = d->get_nwa(d, trackno, lba, nwa);
|
ret = d->get_nwa(d, trackno, lba, nwa);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -2522,7 +2522,7 @@ off_t burn_disc_available_space(struct burn_drive *d,
|
|||||||
(off_t) (512 * 1024 * 1024 - 1) * (off_t) 2048);
|
(off_t) (512 * 1024 * 1024 - 1) * (off_t) 2048);
|
||||||
} else {
|
} else {
|
||||||
if (o != NULL)
|
if (o != NULL)
|
||||||
d->send_write_parameters(d, o);
|
d->send_write_parameters(d, NULL, 0, o);
|
||||||
d->get_nwa(d, -1, &lba, &nwa);
|
d->get_nwa(d, -1, &lba, &nwa);
|
||||||
}
|
}
|
||||||
if (o != NULL) {
|
if (o != NULL) {
|
||||||
|
@ -1855,15 +1855,13 @@ int burn_disc_remove_session(struct burn_disc *d, struct burn_session *s);
|
|||||||
CD-TEXT according to the content of the file.
|
CD-TEXT according to the content of the file.
|
||||||
For a description of CDRWIN file format see
|
For a description of CDRWIN file format see
|
||||||
http://digitalx.org/cue-sheet/syntax/
|
http://digitalx.org/cue-sheet/syntax/
|
||||||
>>> supported commands: CDTEXTFILE PERFORMER REM SONGWRITER TITLE
|
>>> supported commands: CATALOG CDTEXTFILE ISRC PERFORMER REM SONGWRITER TITLE
|
||||||
>>> partly supported commands: CATALOG FILE ISRC INDEX TRACK
|
>>> partly supported commands: FILE INDEX TRACK
|
||||||
>>> supported FILE types: BINARY MOTOROLA
|
>>> supported FILE types: BINARY MOTOROLA
|
||||||
>>> supported FLAGS:
|
>>> supported FLAGS:
|
||||||
>>> supported TRACK datatypes: AUDIO MODE1/2048
|
>>> supported TRACK datatypes: AUDIO MODE1/2048
|
||||||
>>> ignored commands: POSTGAP PREGAP FLAGS
|
>>> ignored commands: POSTGAP PREGAP FLAGS
|
||||||
>>> ignored INDEX numbers: 00, 02 to 99
|
>>> ignored INDEX numbers: 00, 02 to 99
|
||||||
>>> ignored CUE SHEET features: CATALOG and ISRC
|
|
||||||
>>> (not yet transmitted by mode page 5)
|
|
||||||
>>> ignored FLAGS: DCP 4CH PRE SCMS
|
>>> ignored FLAGS: DCP 4CH PRE SCMS
|
||||||
>>> not allowed: mixing of ADUIO and MODE1/2048
|
>>> not allowed: mixing of ADUIO and MODE1/2048
|
||||||
>>> not allowed: unsupported FILE types
|
>>> not allowed: unsupported FILE types
|
||||||
|
@ -539,7 +539,7 @@ void mmc_close_disc(struct burn_write_opts *o)
|
|||||||
/* a ssert(o->drive == d); */
|
/* a ssert(o->drive == d); */
|
||||||
|
|
||||||
o->multi = 0;
|
o->multi = 0;
|
||||||
spc_select_write_params(d, o);
|
spc_select_write_params(d, NULL, 0, o);
|
||||||
mmc_close(d, 1, 0);
|
mmc_close(d, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -560,7 +560,7 @@ void mmc_close_session(struct burn_write_opts *o)
|
|||||||
/* a ssert(o->drive == d); */
|
/* a ssert(o->drive == d); */
|
||||||
|
|
||||||
o->multi = 3;
|
o->multi = 3;
|
||||||
spc_select_write_params(d, o);
|
spc_select_write_params(d, NULL, 0, o);
|
||||||
mmc_close(d, 1, 0);
|
mmc_close(d, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3981,10 +3981,14 @@ int mmc_get_write_performance(struct burn_drive *d)
|
|||||||
memset(pd, 0, 2 + d->mdata->write_page_length);
|
memset(pd, 0, 2 + d->mdata->write_page_length);
|
||||||
is the eventual duty of the caller.
|
is the eventual duty of the caller.
|
||||||
*/
|
*/
|
||||||
int mmc_compose_mode_page_5(struct burn_drive *d,
|
int mmc_compose_mode_page_5(struct burn_drive *d, struct burn_session *s,
|
||||||
const struct burn_write_opts *o,
|
int tno, const struct burn_write_opts *o,
|
||||||
unsigned char *pd)
|
unsigned char *pd)
|
||||||
{
|
{
|
||||||
|
unsigned char *catalog = NULL;
|
||||||
|
char isrc_text[13];
|
||||||
|
struct isrc *isrc;
|
||||||
|
|
||||||
pd[0] = 5;
|
pd[0] = 5;
|
||||||
pd[1] = d->mdata->write_page_length;
|
pd[1] = d->mdata->write_page_length;
|
||||||
|
|
||||||
@ -4094,6 +4098,39 @@ fprintf(stderr, "libburn_EXPERIMENTAL: block_type = %d, pd[4]= %u\n",
|
|||||||
/*XXX need session format! */
|
/*XXX need session format! */
|
||||||
/* ts A61229 : but session format (pd[8]) = 0 seems ok */
|
/* ts A61229 : but session format (pd[8]) = 0 seems ok */
|
||||||
|
|
||||||
|
/* Media Catalog Number at byte 16 to 31,
|
||||||
|
MMC-5, 7.5, Tables 664, 670
|
||||||
|
*/
|
||||||
|
if (o->has_mediacatalog)
|
||||||
|
catalog = (unsigned char *) o->mediacatalog;
|
||||||
|
else if (s != NULL) {
|
||||||
|
if (s->mediacatalog[0])
|
||||||
|
catalog = s->mediacatalog;
|
||||||
|
}
|
||||||
|
if (catalog != NULL && d->mdata->write_page_length >= 30) {
|
||||||
|
pd[16] = 0x80; /* MCVAL */
|
||||||
|
memcpy(pd + 17, catalog, 13);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ISRC at bytes 32 to 47. Tables 664, 671 */
|
||||||
|
isrc_text[0] = 0;
|
||||||
|
if (s != NULL && o->write_type == BURN_WRITE_TAO)
|
||||||
|
if (tno >= 1 && tno <= s->tracks)
|
||||||
|
if (s->track[tno - 1]->isrc.has_isrc) {
|
||||||
|
isrc = &(s->track[tno - 1]->isrc);
|
||||||
|
isrc_text[0] = isrc->country[0];
|
||||||
|
isrc_text[1] = isrc->country[1];
|
||||||
|
isrc_text[2] = isrc->owner[0];
|
||||||
|
isrc_text[3] = isrc->owner[1];
|
||||||
|
isrc_text[4] = isrc->owner[2];
|
||||||
|
sprintf(isrc_text + 5, "%-2.2u%-5.5u",
|
||||||
|
(unsigned int) isrc->year,
|
||||||
|
isrc->serial);
|
||||||
|
}
|
||||||
|
if (isrc_text[0] != 0 && d->mdata->write_page_length >= 46) {
|
||||||
|
pd[32] = 0x80; /* TCVAL */
|
||||||
|
memcpy(pd + 33, isrc_text, 12);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -71,6 +71,7 @@ int mmc_get_write_performance(struct burn_drive *d);
|
|||||||
is the eventual duty of the caller.
|
is the eventual duty of the caller.
|
||||||
*/
|
*/
|
||||||
int mmc_compose_mode_page_5(struct burn_drive *d,
|
int mmc_compose_mode_page_5(struct burn_drive *d,
|
||||||
|
struct burn_session *s, int tno,
|
||||||
const struct burn_write_opts *o,
|
const struct burn_write_opts *o,
|
||||||
unsigned char *pd);
|
unsigned char *pd);
|
||||||
|
|
||||||
|
@ -721,8 +721,8 @@ Although command MODE SELECT is SPC, the content of the
|
|||||||
Write Parameters Mode Page (05h) is MMC (Table 108 in MMC-1).
|
Write Parameters Mode Page (05h) is MMC (Table 108 in MMC-1).
|
||||||
Thus the filling of the mode page is done by mmc_compose_mode_page_5().
|
Thus the filling of the mode page is done by mmc_compose_mode_page_5().
|
||||||
*/
|
*/
|
||||||
void spc_select_write_params(struct burn_drive *d,
|
void spc_select_write_params(struct burn_drive *d, struct burn_session *s,
|
||||||
const struct burn_write_opts *o)
|
int tno, const struct burn_write_opts *o)
|
||||||
{
|
{
|
||||||
struct buffer *buf = NULL;
|
struct buffer *buf = NULL;
|
||||||
struct command *c = NULL;
|
struct command *c = NULL;
|
||||||
@ -779,7 +779,7 @@ void spc_select_write_params(struct burn_drive *d,
|
|||||||
c->page->bytes = alloc_len;
|
c->page->bytes = alloc_len;
|
||||||
|
|
||||||
/* ts A61229 */
|
/* ts A61229 */
|
||||||
if (mmc_compose_mode_page_5(d, o, c->page->data + 8) <= 0)
|
if (mmc_compose_mode_page_5(d, s, tno, o, c->page->data + 8) <= 0)
|
||||||
goto ex;
|
goto ex;
|
||||||
|
|
||||||
c->dir = TO_DRIVE;
|
c->dir = TO_DRIVE;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||||
|
|
||||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||||
Provided under GPL version 2 or later.
|
Provided under GPL version 2 or later.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -21,6 +21,7 @@ void spc_select_error_params(struct burn_drive *,
|
|||||||
void spc_getcaps(struct burn_drive *d);
|
void spc_getcaps(struct burn_drive *d);
|
||||||
void spc_sense_write_params(struct burn_drive *);
|
void spc_sense_write_params(struct burn_drive *);
|
||||||
void spc_select_write_params(struct burn_drive *,
|
void spc_select_write_params(struct burn_drive *,
|
||||||
|
struct burn_session *, int,
|
||||||
const struct burn_write_opts *);
|
const struct burn_write_opts *);
|
||||||
void spc_probe_write_modes(struct burn_drive *);
|
void spc_probe_write_modes(struct burn_drive *);
|
||||||
void spc_request_sense(struct burn_drive *d, struct buffer *buf);
|
void spc_request_sense(struct burn_drive *d, struct buffer *buf);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||||
|
|
||||||
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
|
||||||
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||||
Provided under GPL version 2 or later.
|
Provided under GPL version 2 or later.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -381,6 +381,7 @@ struct burn_drive
|
|||||||
void (*send_parameters) (struct burn_drive *,
|
void (*send_parameters) (struct burn_drive *,
|
||||||
const struct burn_read_opts *);
|
const struct burn_read_opts *);
|
||||||
void (*send_write_parameters) (struct burn_drive *,
|
void (*send_write_parameters) (struct burn_drive *,
|
||||||
|
struct burn_session *, int tno,
|
||||||
const struct burn_write_opts *);
|
const struct burn_write_opts *);
|
||||||
void (*send_cue_sheet) (struct burn_drive *, struct cue_sheet *);
|
void (*send_cue_sheet) (struct burn_drive *, struct cue_sheet *);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user