New API call burn_disc_get_leadin_text()

This commit is contained in:
Thomas Schmitt 2011-12-02 17:15:14 +00:00
parent 56c02fa394
commit 1d5ee82c16
6 changed files with 149 additions and 1 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2011.12.02.100148" #define Cdrskin_timestamP "2011.12.02.171436"

View File

@ -3309,3 +3309,16 @@ int burn_disc_next_track_is_damaged(struct burn_drive *d, int flag)
} }
/* ts B11201 : API */
/* Read the CD-TEXT data from the Lead-in of an Audio CD
*/
int burn_disc_get_leadin_text(struct burn_drive *d,
unsigned char **text_packs, int *num_packs,
int flag)
{
int ret;
ret = mmc_get_leadin_text(d, text_packs, num_packs, 0);
return ret;
}

View File

@ -1290,6 +1290,63 @@ int burn_disc_get_cd_info(struct burn_drive *d, char disc_type[80],
unsigned int *disc_id, char bar_code[9], int *app_code, unsigned int *disc_id, char bar_code[9], int *app_code,
int *valid); int *valid);
/* ts B11201 */
/** Read CD-TEXT packs from the Lead-in of an audio CD.
Each pack consists of 18 bytes, of which 4 are header. 12 bytes are pieces
of 0-terminated texts or binary data. 2 bytes hold a CRC.
See also MMC-3 Annex J.
The first byte of each pack tells the pack type (text meaning):
0x80 = Title
0x81 = Names of performers
0x82 = Songwriters
0x83 = Composers,
0x84 = Arrangers
0x85 = Messages
0x86 = text-and-binary: Disc Identification
0x87 = text-and-binary: Genre Identification
0x88 = binary: Table of Content information
0x89 = binary: Second Table of Content information
0x8e = UPC/EAN code of the album and ISRC code of each track
0x8f = binary: Size Information of the Block
The second byte tells the track number to which the first text piece in
a pack is associated. Number 0 means the whole album. Higher numbers are
valid for types 0x80 to 0x85, and 0x8e. There should be one text for each
track with these types.
The third byte is a sequential counter.
The fourth byte is the Block Number and Character Position Indicator.
It consists of three bit fields:
bit7 = Double Bytes Character Code (0= single byte characters)
bit4-6 = Block Number (groups text packs in language blocks)
bit0-3 = Character position
(Still obscure. MMC-3 Appendix J says:
"It is the number of character in the strings that belongs
to the Text Data Field in the previous Pack. The Character
Position starts from 0 to 15 and 15 indicates that the
first character belongs to the one before the previous
Pack. When the character code is double byte code, a set
of 2 bytes in the Text Data Field is counted at one."
)
The CRC bytes are optional. Polynomial is x^16 + x^12 + x^5 + 1.
@param d The drive to query.
@param text_packs Will point to an allocated memory buffer with CD-TEXT.
It will only contain text packs, and not be prepended
by the TOC header of four bytes, which gets stored with
file cdtext.dat by cdrecord -vv -toc. The first two of
these bytes are supposed hold the number of CD-TEXT
bytes + 2. The other two bytes are supposed to be 0.
Dispose this buffer by free(), when no longer needed.
@param num_packs Will tell the number of text packs, i.e. the number of
bytes in text_packs divided by 18.
@param flag Bitfield for control purposes,
Unused yet. Submit 0.
@return 1 success, 0= no CD-TEXT found, < 0 an error occured
@since 1.2.0
*/
int burn_disc_get_leadin_text(struct burn_drive *d,
unsigned char **text_packs, int *num_packs,
int flag);
/* ts B00924 */ /* ts B00924 */
/** Read the current usage of the eventual BD Spare Area. This area gets /** Read the current usage of the eventual BD Spare Area. This area gets
reserved on BD media during formatting. During writing it is used to reserved on BD media during formatting. During writing it is used to

View File

@ -17,6 +17,7 @@ burn_disc_get_bd_spare_info;
burn_disc_get_cd_info; burn_disc_get_cd_info;
burn_disc_get_format_descr; burn_disc_get_format_descr;
burn_disc_get_formats; burn_disc_get_formats;
burn_disc_get_leadin_text;
burn_disc_get_media_id; burn_disc_get_media_id;
burn_disc_get_msc1; burn_disc_get_msc1;
burn_disc_get_multi_caps; burn_disc_get_multi_caps;

View File

@ -174,6 +174,7 @@ static unsigned char MMC_GET_MSINFO[] =
static unsigned char MMC_GET_TOC[] = { 0x43, 2, 2, 0, 0, 0, 0, 16, 0, 0 }; static unsigned char MMC_GET_TOC[] = { 0x43, 2, 2, 0, 0, 0, 0, 16, 0, 0 };
static unsigned char MMC_GET_TOC_FMT0[] = { 0x43, 0, 0, 0, 0, 0, 0, 16, 0, 0 }; static unsigned char MMC_GET_TOC_FMT0[] = { 0x43, 0, 0, 0, 0, 0, 0, 16, 0, 0 };
static unsigned char MMC_GET_ATIP[] = { 0x43, 2, 4, 0, 0, 0, 0, 16, 0, 0 }; static unsigned char MMC_GET_ATIP[] = { 0x43, 2, 4, 0, 0, 0, 0, 16, 0, 0 };
static unsigned char MMC_GET_LEADTEXT[] = { 0x43, 2, 5, 0, 0, 0, 0, 4, 0, 0 };
static unsigned char MMC_GET_DISC_INFO[] = static unsigned char MMC_GET_DISC_INFO[] =
{ 0x51, 0, 0, 0, 0, 0, 0, 16, 0, 0 }; { 0x51, 0, 0, 0, 0, 0, 0, 16, 0, 0 };
static unsigned char MMC_READ_CD[] = { 0xBE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static unsigned char MMC_READ_CD[] = { 0xBE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
@ -2028,6 +2029,77 @@ void mmc_read_disc_info(struct burn_drive *d)
} }
/* @param flag bit= do not allocate text_packs
*/
static int mmc_get_leadin_text_al(struct burn_drive *d,
unsigned char **text_packs, int *alloc_len,
int flag)
{
struct buffer *buf = NULL;
struct command *c = NULL;
unsigned char *data;
int ret, data_length;
*text_packs = NULL;
BURN_ALLOC_MEM(buf, struct buffer, 1);
BURN_ALLOC_MEM(c, struct command, 1);
scsi_init_command(c, MMC_GET_LEADTEXT, sizeof(MMC_GET_LEADTEXT));
c->dxfer_len = *alloc_len;
c->opcode[7]= (c->dxfer_len >> 8) & 0xff;
c->opcode[8]= c->dxfer_len & 0xff;
c->retry = 1;
c->page = buf;
c->page->bytes = 0;
c->page->sectors = 0;
c->dir = FROM_DRIVE;
d->issue_command(d, c);
if (c->error)
{ret = 0; goto ex;}
data = c->page->data;
data_length = (data[0] << 8) + data[1];
*alloc_len = data_length + 2;
if (*alloc_len >= 22 && !(flag & 1)) {
BURN_ALLOC_MEM(*text_packs, unsigned char, *alloc_len - 4);
memcpy(*text_packs, data + 4, *alloc_len - 4);
}
ret = 1;
ex:;
BURN_FREE_MEM(c);
BURN_FREE_MEM(buf);
return ret;
}
/* ts B11201 */
/* Read the CD-TEXT data from the Lead-in of an Audio CD
*/
int mmc_get_leadin_text(struct burn_drive *d,
unsigned char **text_packs, int *num_packs, int flag)
{
int alloc_len = 4, ret;
*num_packs = 0;
if (mmc_function_spy(d, "mmc_get_leadin_text") <= 0)
return -1;
ret = mmc_get_leadin_text_al(d, text_packs, &alloc_len, 1);
if (ret <= 0 || alloc_len < 22)
return (ret > 0 ? 0 : ret);
ret = mmc_get_leadin_text_al(d, text_packs, &alloc_len, 0);
if (ret <= 0 || alloc_len < 22) {
if (*text_packs != NULL)
free(*text_packs);
*text_packs = NULL;
return (ret > 0 ? 0 : ret);
}
*num_packs = (alloc_len - 4) / 18;
return ret;
}
void mmc_read_atip(struct burn_drive *d) void mmc_read_atip(struct burn_drive *d)
{ {
struct buffer *buf = NULL; struct buffer *buf = NULL;

View File

@ -115,4 +115,9 @@ int mmc_get_phys_format_info(struct burn_drive *d, int *disk_category,
char **book_name, int *part_version, int *num_layers, char **book_name, int *part_version, int *num_layers,
int *num_blocks, int flag); int *num_blocks, int flag);
/* ts B11201 */
int mmc_get_leadin_text(struct burn_drive *d,
unsigned char **text_packs, int *num_packs, int flag);
#endif /*__MMC*/ #endif /*__MMC*/