Coverage Report

Created: 2026-06-10 06:42

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libcue/cd.c
Line
Count
Source
1
/*
2
 * Copyright (c) 2004, 2005, 2006, 2007, Svend Sorensen
3
 * Copyright (c) 2009, 2010 Jochen Keil
4
 * For license terms, see the file COPYING in this distribution.
5
 */
6
7
#include <stdio.h>
8
#include <stdlib.h>
9
#include <string.h>
10
#include "cd.h"
11
12
typedef struct Data Data;
13
struct Data {
14
  int type;     /* DataType */
15
  char *name;     /* data source name */
16
  long start;     /* start time for data */
17
  long length;      /* length of data */
18
};
19
20
struct Track {
21
  Data zero_pre;      /* pre-gap generated with zero data */
22
  Data file;      /* track data file */
23
  Data zero_post;     /* post-gap generated with zero data */
24
  int mode;     /* track mode */
25
  int sub_mode;     /* sub-channel mode */
26
  int flags;      /* flags */
27
  char *isrc;     /* IRSC Code (5.22.4) 12 bytes */
28
  Cdtext *cdtext;     /* CD-TEXT */
29
  Rem* rem;
30
  long index[MAXINDEX+1];   /* indexes (in frames) (5.29.2.5)
31
           * relative to start of file */
32
};
33
34
struct Cd {
35
  int mode;     /* disc mode */
36
  char *catalog;      /* Media Catalog Number (5.22.3) */
37
  char *cdtextfile;   /* Filename of CDText File */
38
  Cdtext *cdtext;     /* CD-TEXT */
39
  Rem* rem;
40
  int ntrack;     /* number of tracks in album */
41
  Track *track[MAXTRACK];   /* array of tracks */
42
};
43
44
Cd *cd_init(void)
45
1.87k
{
46
1.87k
  Cd *cd = NULL;
47
1.87k
  cd = malloc(sizeof(Cd));
48
49
1.87k
  if(NULL == cd) {
50
0
    fprintf(stderr, "unable to create cd\n");
51
1.87k
  } else {
52
1.87k
    cd->mode = MODE_CD_DA;
53
1.87k
    cd->catalog = NULL;
54
1.87k
    cd->cdtextfile = NULL;
55
1.87k
    cd->cdtext = cdtext_init();
56
1.87k
    cd->rem = rem_new();
57
1.87k
    cd->ntrack = 0;
58
1.87k
  }
59
60
1.87k
  return cd;
61
1.87k
}
62
63
void track_delete(struct Track* track)
64
4.22k
{
65
4.22k
  if (track != NULL)
66
4.22k
  {
67
4.22k
    cdtext_delete(track_get_cdtext(track));
68
69
4.22k
    rem_free(track_get_rem(track));
70
71
4.22k
    free(track->isrc);
72
73
4.22k
    free(track->zero_pre.name);
74
75
4.22k
    free(track->zero_post.name);
76
77
4.22k
    free(track->file.name);
78
79
4.22k
    free(track);
80
4.22k
  }
81
4.22k
}
82
83
void cd_delete(struct Cd* cd)
84
2.90k
{
85
2.90k
  int i = 0;
86
87
2.90k
  if (cd != NULL)
88
1.87k
  {
89
1.87k
    free(cd->catalog);
90
91
1.87k
    free(cd->cdtextfile);
92
93
6.09k
    for (i = 0; i < cd->ntrack; i++)
94
4.22k
      track_delete(cd->track[i]);
95
96
1.87k
    cdtext_delete(cd_get_cdtext(cd));
97
98
1.87k
    rem_free(cd_get_rem(cd));
99
100
1.87k
    free(cd);
101
1.87k
  }
102
2.90k
}
103
104
Track *track_init(void)
105
4.22k
{
106
4.22k
  Track *track = NULL;
107
4.22k
  track = malloc(sizeof(Track));
108
109
4.22k
  if (NULL == track) {
110
0
    fprintf(stderr, "unable to create track\n");
111
4.22k
  } else {
112
4.22k
    track->zero_pre.type = DATA_ZERO;
113
4.22k
    track->zero_pre.name = NULL;
114
4.22k
    track->zero_pre.start = -1;
115
4.22k
    track->zero_pre.length = -1;
116
117
4.22k
    track->file.type = DATA_AUDIO;
118
4.22k
    track->file.name = NULL;
119
4.22k
    track->file.start = -1;
120
4.22k
    track->file.length = -1;
121
122
4.22k
    track->zero_post.type = DATA_ZERO;
123
4.22k
    track->zero_post.name = NULL;
124
4.22k
    track->zero_post.start = -1;
125
4.22k
    track->zero_post.length = -1;
126
127
4.22k
    track->mode = MODE_AUDIO;
128
4.22k
    track->sub_mode = SUB_MODE_RW;
129
4.22k
    track->flags = FLAG_NONE;
130
4.22k
    track->isrc = NULL;
131
4.22k
    track->cdtext = cdtext_init();
132
4.22k
    track->rem = rem_new();
133
134
4.22k
                int i;
135
426k
                for (i=0; i<=MAXINDEX; i++)
136
422k
                   track->index[i] = -1;
137
4.22k
  }
138
139
4.22k
  return track;
140
4.22k
}
141
142
/*
143
 * cd structure functions
144
 */
145
void cd_set_mode(Cd *cd, int mode)
146
0
{
147
0
  cd->mode = mode;
148
0
}
149
150
enum DiscMode cd_get_mode(const Cd *cd)
151
0
{
152
0
  return cd->mode;
153
0
}
154
155
void cd_set_catalog(Cd *cd, char *catalog)
156
384
{
157
384
  free(cd->catalog);
158
384
  cd->catalog = strdup(catalog);
159
384
}
160
161
const char *cd_get_catalog(const Cd *cd)
162
0
{
163
0
  return cd->catalog;
164
0
}
165
166
void cd_set_cdtextfile(Cd *cd, char *cdtextfile)
167
193
{
168
193
  free(cd->cdtextfile);
169
193
  cd->cdtextfile = strdup(cdtextfile);
170
193
}
171
172
const char *cd_get_cdtextfile(const Cd *cd)
173
0
{
174
0
  return cd->cdtextfile;
175
0
}
176
177
Cdtext *cd_get_cdtext(const Cd *cd)
178
3.74k
{
179
3.74k
  if (cd != NULL)
180
3.74k
    return cd->cdtext;
181
0
  else
182
0
    return NULL;
183
3.74k
}
184
185
Rem*
186
cd_get_rem(const Cd* cd)
187
3.74k
{
188
3.74k
  if (cd != NULL)
189
3.74k
    return cd->rem;
190
0
  else
191
0
    return NULL;
192
3.74k
}
193
194
Track *cd_add_track(Cd *cd)
195
5.73k
{
196
5.73k
  if (MAXTRACK > cd->ntrack)
197
4.22k
    cd->ntrack++;
198
1.51k
  else
199
1.51k
  {
200
1.51k
    fprintf(stderr, "too many tracks\n");
201
1.51k
    return cd->track[cd->ntrack - 1];
202
1.51k
  }
203
204
4.22k
  cd->track[cd->ntrack - 1] = track_init();
205
206
4.22k
  return cd->track[cd->ntrack - 1];
207
5.73k
}
208
209
int cd_get_ntrack(const Cd *cd)
210
0
{
211
0
  return cd->ntrack;
212
0
}
213
214
Track *cd_get_track(const Cd *cd, int i)
215
0
{
216
0
  if ((0 < i) && (cd != NULL) && (i <= cd->ntrack))
217
0
    return cd->track[i - 1];
218
0
  else
219
0
    return NULL;
220
0
}
221
222
/*
223
 * track structure functions
224
 */
225
226
void track_set_filename(Track *track, char *filename)
227
3.00k
{
228
3.00k
  free(track->file.name);
229
3.00k
  track->file.name = strdup(filename);
230
3.00k
}
231
232
const char *track_get_filename(const Track *track)
233
0
{
234
0
  return track->file.name;
235
0
}
236
237
void track_set_start(Track *track, long start)
238
2.97k
{
239
2.97k
  track->file.start = start;
240
2.97k
}
241
242
long track_get_start(const Track *track)
243
623
{
244
623
  return track->file.start;
245
623
}
246
247
void track_set_length(Track *track, long length)
248
623
{
249
623
  track->file.length = length;
250
623
}
251
252
long track_get_length(const Track *track)
253
1.50k
{
254
1.50k
  return track->file.length;
255
1.50k
}
256
257
void track_set_mode(Track *track, int mode)
258
2.04k
{
259
2.04k
  track->mode = mode;
260
2.04k
}
261
262
enum TrackMode track_get_mode(const Track *track)
263
0
{
264
0
  return track->mode;
265
0
}
266
267
void track_set_sub_mode(Track *track, int sub_mode)
268
0
{
269
0
  track->sub_mode = sub_mode;
270
0
}
271
272
enum TrackSubMode track_get_sub_mode(const Track *track)
273
0
{
274
0
  return track->sub_mode;
275
0
}
276
277
void track_set_flag(Track *track, int flag)
278
494
{
279
494
  track->flags |= flag;
280
494
}
281
282
void track_clear_flag(Track *track, int flag)
283
0
{
284
0
  track->flags &= ~flag;
285
0
}
286
287
int track_is_set_flag(const Track *track, enum TrackFlag flag)
288
0
{
289
0
  return track->flags & flag;
290
0
}
291
292
void track_set_zero_pre(Track *track, long length)
293
6.19k
{
294
6.19k
  track->zero_pre.length = length;
295
6.19k
}
296
297
long track_get_zero_pre(const Track *track)
298
0
{
299
0
  return track->zero_pre.length;
300
0
}
301
302
void track_set_zero_post(Track *track, long length)
303
291
{
304
291
  track->zero_post.length = length;
305
291
}
306
307
long track_get_zero_post(const Track *track)
308
0
{
309
0
  return track->zero_post.length;
310
0
}
311
void track_set_isrc(Track *track, char *isrc)
312
198
{
313
198
  free(track->isrc);
314
198
  track->isrc = strdup(isrc);
315
198
}
316
317
const char *track_get_isrc(const Track *track)
318
0
{
319
0
  return track->isrc;
320
0
}
321
322
Cdtext *track_get_cdtext(const Track *track)
323
9.95k
{
324
9.95k
  if (track != NULL)
325
9.95k
    return track->cdtext;
326
0
  else
327
0
    return NULL;
328
9.95k
}
329
330
Rem*
331
track_get_rem(const Track* track)
332
9.95k
{
333
9.95k
  if (track != NULL)
334
9.95k
    return track->rem;
335
0
  else
336
0
    return NULL;
337
9.95k
}
338
339
void track_set_index(Track *track, int i, long ind)
340
4.93k
{
341
4.93k
  if (i < 0 || i > MAXINDEX) {
342
818
    fprintf(stderr, "too many indexes\n");
343
818
                return;
344
818
        }
345
346
4.11k
  track->index[i] = ind;
347
4.11k
}
348
349
long track_get_index(const Track *track, int i)
350
5.11k
{
351
5.11k
  if ((0 <= i) && (i <= MAXINDEX))
352
5.11k
    return track->index[i];
353
354
0
  return -1;
355
5.11k
}
356
357
/*
358
 * dump cd information
359
 */
360
static void cd_track_dump(Track *track)
361
0
{
362
0
  int i;
363
364
0
  printf("zero_pre: %ld\n", track->zero_pre.length);
365
0
  printf("filename: %s\n", track->file.name);
366
0
  printf("start: %ld\n", track->file.start);
367
0
  printf("length: %ld\n", track->file.length);
368
0
  printf("zero_post: %ld\n", track->zero_post.length);
369
0
  printf("mode: %d\n", track->mode);
370
0
  printf("sub_mode: %d\n", track->sub_mode);
371
0
  printf("flags: 0x%x\n", track->flags);
372
0
  printf("isrc: %s\n", track->isrc);
373
374
0
  for (i = 0; i <= MAXINDEX; ++i)
375
0
                if (track->index[i] != -1)
376
0
                        printf("index %d: %ld\n", i, track->index[i]);
377
378
0
  if (NULL != track->cdtext) {
379
0
    printf("cdtext:\n");
380
0
    cdtext_dump(track->cdtext, 1);
381
0
  }
382
383
0
  if (track->rem != NULL)
384
0
  {
385
0
    printf("rem:\n");
386
0
    rem_dump(track->rem);
387
0
  }
388
0
}
389
390
void cd_dump(Cd *cd)
391
0
{
392
0
  int i;
393
394
0
  printf("Disc Info\n");
395
0
  printf("mode: %d\n", cd->mode);
396
0
  printf("catalog: %s\n", cd->catalog);
397
0
  printf("cdtextfile: %s\n", cd->cdtextfile);
398
0
  if (NULL != cd->cdtext) {
399
0
    printf("cdtext:\n");
400
0
    cdtext_dump(cd->cdtext, 0);
401
0
  }
402
403
0
  if (cd->rem != NULL)
404
0
  {
405
0
    printf("rem:\n");
406
0
    rem_dump(cd->rem);
407
0
  }
408
409
0
  for (i = 0; i < cd->ntrack; ++i) {
410
0
    printf("Track %d Info\n", i + 1);
411
0
    cd_track_dump(cd->track[i]);
412
0
  }
413
0
}