1 /*
2 * toc_print.c -- print toc file
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 #include <stdio.h>
9 #include <string.h>
10 #include "cd.h"
11 #include "time.h"
12
13 void toc_print_track (FILE *fp, Track *track);
14 void toc_print_cdtext (Cdtext *cdtext, FILE *fp, int istrack);
15
toc_print(FILE * fp,Cd * cd)16 void toc_print (FILE *fp, Cd *cd)
17 {
18 Cdtext *cdtext = cd_get_cdtext(cd);
19 int i; /* track */
20 Track *track;
21
22 switch(cd_get_mode(cd)) {
23 case MODE_CD_DA:
24 fprintf(fp, "CD_DA\n");
25 break;
26 case MODE_CD_ROM:
27 fprintf(fp, "CD_ROM\n");
28 break;
29 case MODE_CD_ROM_XA:
30 fprintf(fp, "CD_ROM_XA\n");
31 break;
32 }
33
34 if (NULL != cd_get_catalog(cd)) {
35 fprintf(fp, "CATALOG \"%s\"\n", cd_get_catalog(cd));
36 }
37
38 if(0 != cdtext_is_empty(cdtext)) {
39 fprintf(fp, "CD_TEXT {\n");
40 fprintf(fp, "\tLANGUAGE_MAP { 0:9 }\n");
41 fprintf(fp, "\tLANGUAGE 0 {\n");
42 toc_print_cdtext(cdtext, fp, 0);
43 fprintf(fp, "\t}\n");
44 fprintf(fp, "}\n");
45 }
46
47 for (i = 1; i <= cd_get_ntrack(cd); i++) {
48 track = cd_get_track(cd, i);
49 fprintf(fp, "\n");
50 toc_print_track(fp, track);
51 }
52 }
53
toc_print_track(FILE * fp,Track * track)54 void toc_print_track (FILE *fp, Track *track)
55 {
56 Cdtext *cdtext = track_get_cdtext(track);
57 int i; /* index */
58
59 fprintf(fp, "TRACK ");
60 switch (track_get_mode(track)) {
61 case MODE_AUDIO:
62 fprintf(fp, "AUDIO");
63 break;
64 case MODE_MODE1:
65 fprintf(fp, "MODE1");
66 break;
67 case MODE_MODE1_RAW:
68 fprintf(fp, "MODE1_RAW");
69 break;
70 case MODE_MODE2:
71 fprintf(fp, "MODE2");
72 break;
73 case MODE_MODE2_FORM1:
74 fprintf(fp, "MODE2_FORM1");
75 break;
76 case MODE_MODE2_FORM2:
77 fprintf(fp, "MODE2_FORM2");
78 break;
79 case MODE_MODE2_FORM_MIX:
80 fprintf(fp, "MODE2_FORM_MIX");
81 break;
82 }
83 fprintf(fp, "\n");
84
85 if (0 != track_is_set_flag(track, FLAG_PRE_EMPHASIS)) {
86 fprintf(fp, "PRE_EMPHASIS\n");
87 }
88 if (0 != track_is_set_flag(track, FLAG_COPY_PERMITTED)) {
89 fprintf(fp, "COPY\n");
90 }
91 if (0 != track_is_set_flag(track, FLAG_FOUR_CHANNEL)) {
92 fprintf(fp, "FOUR_CHANNEL_AUDIO\n");
93 }
94
95 if (NULL != track_get_isrc(track)) {
96 fprintf(fp, "ISRC \"%s\"\n", track_get_isrc(track));
97 }
98
99 if (0 != cdtext_is_empty(cdtext)) {
100 fprintf(fp, "CD_TEXT {\n");
101 fprintf(fp, "\tLANGUAGE 0 {\n");
102 toc_print_cdtext(cdtext, fp, 1);
103 fprintf(fp, "\t}\n");
104 fprintf(fp, "}\n");
105 }
106
107 if (0 != track_get_zero_pre(track)) {
108 fprintf(fp, "ZERO ");
109 fprintf(fp, "%s", time_frame_to_mmssff(track_get_zero_pre(track)));
110 fprintf(fp, "\n");
111 }
112
113 fprintf(fp, "FILE ");
114 fprintf(fp, "\"%s\" ", track_get_filename(track));
115 if (0 == track_get_start(track)) {
116 fprintf(fp, "0");
117 } else {
118 fprintf(fp, "%s", time_frame_to_mmssff(track_get_start(track)));
119 }
120 if (0 != track_get_length(track)) {
121 fprintf(fp, " %s", time_frame_to_mmssff(track_get_length(track)));
122 }
123 fprintf(fp, "\n");
124
125 if (0 != track_get_zero_post(track)) {
126 fprintf(fp, "ZERO ");
127 fprintf(fp, "%s", time_frame_to_mmssff(track_get_zero_post(track)));
128 fprintf(fp, "\n");
129 }
130
131 if (track_get_index(track, 1) != 0) {
132 fprintf(fp, "START ");
133 fprintf(fp, "%s\n", time_frame_to_mmssff(track_get_index(track, 1)));
134 }
135
136 for (i = 2; i < track_get_nindex(track); i++) {
137 fprintf(fp, "INDEX ");
138 fprintf(fp, "%s\n", time_frame_to_mmssff( \
139 track_get_index(track, i) - track_get_index(track, 0) \
140 ));
141 }
142 }
143
toc_print_cdtext(Cdtext * cdtext,FILE * fp,int istrack)144 void toc_print_cdtext (Cdtext *cdtext, FILE *fp, int istrack)
145 {
146 int pti;
147 char *value = NULL;
148
149 for (pti = 0; PTI_END != pti; pti++) {
150 if (NULL != (value = cdtext_get(pti, cdtext))) {
151 fprintf(fp, "\t\t");
152 fprintf(fp, "%s", cdtext_get_key(pti, istrack));
153 fprintf(fp, " \"%s\"\n", value);
154 }
155 }
156 }
157