File: cdtext_private.h

package info (click to toggle)
libcdio 2.1.0-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 16,564 kB
  • sloc: ansic: 38,843; sh: 5,501; cpp: 2,555; makefile: 777; ruby: 24; perl: 24
file content (149 lines) | stat: -rw-r--r-- 5,162 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
  Copyright (C) 2004-2005, 2008, 2011-2013
   Rocky Bernstein <rocky@gnu.org>

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef CDIO_DRIVER_CDTEXT_PRIVATE_H_
#define CDIO_DRIVER_CDTEXT_PRIVATE_H_

#include <cdio/types.h>

#ifndef CDIO_CD_MAX_TRACKS
# define CDIO_CD_MAX_TRACKS 99 /* Largest CD track number */
#endif

#define CDTEXT_GET_LEN16(p) (p[0]<<8) + p[1]


typedef enum {
  CDTEXT_LEN_BINARY_MAX     = 9216,
  CDTEXT_LEN_TEXTDATA       = 12,
  CDTEXT_LEN_PACK           = 18,
  CDTEXT_LEN_BLOCKSIZE      = 36,
  CDTEXT_NUM_BLOCKS_MAX     = 8,
  CDTEXT_NUM_TRACKS_MAX     = CDIO_CD_MAX_TRACKS+1, /* +1 for 0th disk track */
  CDTEXT_NUM_BLOCKPACKS_MAX = 255
} cdtext_format_enum_t;

/**
 * From table J.2 - Pack Type Indicator Definitions from
 * Working Draft NCITS XXX T10/1364-D Revision 10G. November 12, 2001.
 */
typedef enum {
  CDTEXT_PACK_TITLE         = 0x80,
  CDTEXT_PACK_PERFORMER     = 0x81,
  CDTEXT_PACK_SONGWRITER    = 0x82,
  CDTEXT_PACK_COMPOSER      = 0x83,
  CDTEXT_PACK_ARRANGER      = 0x84,
  CDTEXT_PACK_MESSAGE       = 0x85,
  CDTEXT_PACK_DISCID        = 0x86,
  CDTEXT_PACK_GENRE         = 0x87,
  CDTEXT_PACK_TOC           = 0x88,
  CDTEXT_PACK_TOC2          = 0x89,
  CDTEXT_PACK_UPC           = 0x8E,
  CDTEXT_PACK_BLOCKSIZE     = 0x8F
} cdtext_packtype_enum_t;


/** CD-Text character encodings */
typedef enum cdtext_charcode_enum_s {
  CDTEXT_CHARCODE_ISO_8859_1 = 0x00, /**< ISO-8859-1 (8 bit), Latin-1 */
  CDTEXT_CHARCODE_ASCII      = 0x01, /**< ASCII (7 bit) */
  CDTEXT_CHARCODE_SHIFT_JIS  = 0x80  /**< Shift_JIS (double byte), JIS X 0208 Appendix 1 */
///* The following were proposed but never implemented anywhere.
// * They are mentioned for completeness here
// *  CDTEXT_CHARCODE_KOREAN     = 0x81, /**< Korean */
// *  CDTEXT_CHARCODE_CHINESE    = 0x82, /**< Mandarin Chinese */
// *  CDTEXT_CHARCODE_UNDEFINED  = 0xFF, /**< everything else */
// */

} cdtext_charcode_enum_t;

/** Structure of CD-TEXT data Packs */
struct cdtext_pack_s
{
  uint8_t  type;
  uint8_t  i_track;
  uint8_t  seq;
  uint8_t  char_pos;  /* character position */
  uint8_t  block;     /* block number 0..7 */
  uint8_t  db_chars;  /* double byte character */
  uint8_t  text[CDTEXT_LEN_TEXTDATA];
  uint8_t  crc[2];
};


/** Structure of of block size information packs */
struct cdtext_blocksize_s
{
  uint8_t charcode;      /* character code */
  uint8_t i_first_track; /* first track number */
  uint8_t i_last_track;  /* last track number */
  uint8_t copyright;     /* 3 CD-TEXT is copyrighted, 0 no copyright on CD-TEXT */
  uint8_t i_packs[16];   /* number of packs of each type
                          * 0 TITLE; 1 PERFORMER; 2 SONGWRITER; 3 COMPOSER;
                          * 4 ARRANGER; 5 MESSAGE; 6 DISCID; 7 GENRE;
                          * 8 TOC; 9 TOC2; 10-12 RESERVED; 13 CLOSED;
                          * 14 UPC_ISRC; 15 BLOCKSIZE */
  uint8_t lastseq[8];    /* last sequence for block 0..7 */
  uint8_t langcode[8];   /* language code for block 0..7 */
};

typedef struct cdtext_pack_s cdtext_pack_t;
typedef struct cdtext_blocksize_s cdtext_blocksize_t;

/*! Structure for CD-TEXT of a track. */
struct cdtext_track_s {
  char *field[MAX_CDTEXT_FIELDS];
};

/*! Structure for CD-TEXT of a block. */
struct cdtext_block_s {
  struct cdtext_track_s track[CDTEXT_NUM_TRACKS_MAX]; /**< 0: disc; 1..99: tracks */
  cdtext_genre_t genre_code;                          /**< genre code of the disc */
  cdtext_lang_t  language_code;                       /**< language of this block */
  bool           copyright;                           /**< CD-TEXT copyright      */
  track_t        first_track;                         /**< first track number     */
  track_t        last_track;                          /**< last track number      */
};

/*! Structure for CD-TEXT of a disc.

  @see cdtext_init, cdtext_destroy, cdtext_get, and cdtext_set.
 */
struct cdtext_s {
  struct cdtext_block_s block[CDTEXT_NUM_BLOCKS_MAX]; /**< CD-TEXT for block 0..7 */
  cdtext_lang_t languages[CDTEXT_NUM_BLOCKS_MAX];     /**< return value of cdtext_list_languages_v2() */
  uint8_t  block_i;                                   /**< index of active block  */
};

int cdtext_read_pack (cdtext_pack_t *pack, const uint8_t *data);

/*!
  returns enum of field if key is a CD-Text keyword,
  returns CDTEXT_FIELD_INVALID otherwise.
*/
cdtext_field_t cdtext_is_field (const char *field);

#endif /* CDIO_DRIVER_CDTEXT_PRIVATE_H_ */

/*
 * Local variables:
 *  c-file-style: "gnu"
 *  tab-width: 8
 *  indent-tabs-mode: nil
 * End:
 */