1 /*
2  * cd.h -- cd structure
3  *
4  * Copyright (C) 2004, 2005, 2006, 2007, 2013 Svend Sorensen
5  * For license terms, see the file COPYING in this distribution.
6  */
7 
8 /* references: MMC-3 draft revsion - 10g */
9 
10 #ifndef CD_H
11 #define CD_H
12 
13 #include "cdtext.h"
14 
15 #define MAXTRACK	99	/* Red Book track limit */
16 #define MAXINDEX	99	/* Red Book index limit */
17 
18 /*
19  * disc modes
20  * DATA FORM OF MAIN DATA (5.29.2.8)
21  */
22 enum DiscMode {
23 	MODE_CD_DA,		/* CD-DA */
24 	MODE_CD_ROM,		/* CD-ROM mode 1 */
25 	MODE_CD_ROM_XA		/* CD-ROM XA and CD-I */
26 };
27 
28 /*
29  * track modes
30  * 5.29.2.8 DATA FORM OF MAIN DATA
31  * Table 350 - Data Block Type Codes
32  */
33 enum TrackMode {
34 	MODE_AUDIO,		/* 2352 byte block length */
35 	MODE_MODE1,		/* 2048 byte block length */
36 	MODE_MODE1_RAW,		/* 2352 byte block length */
37 	MODE_MODE2,		/* 2336 byte block length */
38 	MODE_MODE2_FORM1,	/* 2048 byte block length */
39 	MODE_MODE2_FORM2,	/* 2324 byte block length */
40 	MODE_MODE2_FORM_MIX,	/* 2332 byte block length */
41 	MODE_MODE2_RAW		/* 2352 byte block length */
42 };
43 
44 /*
45  * sub-channel mode
46  * 5.29.2.13 Data Form of Sub-channel
47  * NOTE: not sure if this applies to cue files
48  */
49 enum TrackSubMode {
50 	SUB_MODE_RW,		/* RAW Data */
51 	SUB_MODE_RW_RAW		/* PACK DATA (written R-W */
52 };
53 
54 /*
55  * track flags
56  * Q Sub-channel Control Field (4.2.3.3, 5.29.2.2)
57  */
58 enum TrackFlag {
59 	FLAG_NONE		= 0x00,	/* no flags set */
60 	FLAG_PRE_EMPHASIS	= 0x01,	/* audio recorded with pre-emphasis */
61 	FLAG_COPY_PERMITTED	= 0x02,	/* digital copy permitted */
62 	FLAG_DATA		= 0x04,	/* data track */
63 	FLAG_FOUR_CHANNEL	= 0x08,	/* 4 audio channels */
64 	FLAG_SCMS		= 0x10,	/* SCMS (not Q Sub-ch.) (5.29.2.7) */
65 	FLAG_ANY		= 0xff	/* any flags set */
66 };
67 
68 enum DataType {
69 	DATA_AUDIO,
70 	DATA_DATA,
71 	DATA_FIFO,
72 	DATA_ZERO
73 };
74 
75 /* ADTs */
76 typedef struct Cd Cd;
77 typedef struct Track Track;
78 
79 /* return pointer to CD structure */
80 Cd *cd_init();
81 
82 /* dump all info from CD structure
83  * in human readable format (for debugging)
84  */
85 void cd_dump(Cd *cd);
86 
87 /*
88  * Cd functions
89  */
90 
91 void cd_set_mode(Cd *cd, int mode);
92 int cd_get_mode(Cd *cd);
93 
94 void cd_set_catalog(Cd *cd, char *catalog);
95 char *cd_get_catalog(Cd *cd);
96 
97 /*
98  * return pointer to cd's Cdtext
99  */
100 Cdtext *cd_get_cdtext(Cd *cd);
101 
102 /*
103  * add a new track to cd, increment number of tracks
104  * and return pointer to new track
105  */
106 Track *cd_add_track(Cd *cd);
107 
108 /*
109  * return number of tracks in cd
110  */
111 int cd_get_ntrack(Cd *cd);
112 
113 Track *cd_get_track(Cd *cd, int i);
114 
115 /*
116  * Track functions
117  */
118 
119 /* filename of data file */
120 void track_set_filename(Track *track, char *filename);
121 char *track_get_filename(Track *track);
122 
123 /* track start is starting position in data file */
124 void track_set_start(Track *track, long start);
125 long track_get_start(Track *track);
126 
127 /* track length is length of data file to use */
128 void track_set_length(Track *track, long length);
129 long track_get_length(Track *track);
130 
131 /* see enum TrackMode */
132 void track_set_mode(Track *track, int mode);
133 int track_get_mode(Track *track);
134 
135 /* see enum TrackSubMode */
136 void track_set_sub_mode(Track *track, int sub_mode);
137 int track_get_sub_mode(Track *track);
138 
139 /* see enum TrackFlag */
140 void track_set_flag(Track *track, int flag);
141 void track_clear_flag(Track *track, int flag);
142 int track_is_set_flag(Track *track, int flag);
143 
144 /* zero data pregap */
145 void track_set_zero_pre(Track *track, long length);
146 long track_get_zero_pre(Track *track);
147 
148 /* zero data postgap */
149 void track_set_zero_post(Track *track, long length);
150 long track_get_zero_post(Track *track);
151 
152 void track_set_isrc(Track *track, char *isrc);
153 char *track_get_isrc(Track *track);
154 
155 Cdtext *track_get_cdtext(Track *track);
156 
157 void track_add_index(Track *track, long index);
158 int track_get_nindex(Track *track);
159 long track_get_index(Track *track, int i);
160 
161 #endif
162