xref: /aosp_15_r20/external/flac/src/test_grabbag/cuesheet/main.c (revision 600f14f40d737144c998e2ec7a483122d3776fbc)
1*600f14f4SXin Li /* test_cuesheet - Simple tester for cuesheet routines in grabbag
2*600f14f4SXin Li  * Copyright (C) 2002-2009  Josh Coalson
3*600f14f4SXin Li  * Copyright (C) 2011-2023  Xiph.Org Foundation
4*600f14f4SXin Li  *
5*600f14f4SXin Li  * This program is free software; you can redistribute it and/or
6*600f14f4SXin Li  * modify it under the terms of the GNU General Public License
7*600f14f4SXin Li  * as published by the Free Software Foundation; either version 2
8*600f14f4SXin Li  * of the License, or (at your option) any later version.
9*600f14f4SXin Li  *
10*600f14f4SXin Li  * This program is distributed in the hope that it will be useful,
11*600f14f4SXin Li  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*600f14f4SXin Li  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*600f14f4SXin Li  * GNU General Public License for more details.
14*600f14f4SXin Li  *
15*600f14f4SXin Li  * You should have received a copy of the GNU General Public License along
16*600f14f4SXin Li  * with this program; if not, write to the Free Software Foundation, Inc.,
17*600f14f4SXin Li  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18*600f14f4SXin Li  */
19*600f14f4SXin Li 
20*600f14f4SXin Li #ifdef HAVE_CONFIG_H
21*600f14f4SXin Li #  include <config.h>
22*600f14f4SXin Li #endif
23*600f14f4SXin Li 
24*600f14f4SXin Li #include <errno.h>
25*600f14f4SXin Li #include <stdio.h>
26*600f14f4SXin Li #include <stdlib.h>
27*600f14f4SXin Li #include <string.h>
28*600f14f4SXin Li #include "FLAC/assert.h"
29*600f14f4SXin Li #include "FLAC/metadata.h"
30*600f14f4SXin Li #include "share/grabbag.h"
31*600f14f4SXin Li 
do_cuesheet(const char * infilename,uint32_t sample_rate,FLAC__bool is_cdda,FLAC__uint64 lead_out_offset)32*600f14f4SXin Li static int do_cuesheet(const char *infilename, uint32_t sample_rate, FLAC__bool is_cdda, FLAC__uint64 lead_out_offset)
33*600f14f4SXin Li {
34*600f14f4SXin Li 	FILE *fin, *fout;
35*600f14f4SXin Li 	const char *error_message, *tmpfilenamebase;
36*600f14f4SXin Li 	char tmpfilename[4096];
37*600f14f4SXin Li 	uint32_t last_line_read;
38*600f14f4SXin Li 	FLAC__StreamMetadata *cuesheet;
39*600f14f4SXin Li 
40*600f14f4SXin Li 	FLAC__ASSERT(strlen(infilename) + 2 < sizeof(tmpfilename));
41*600f14f4SXin Li 
42*600f14f4SXin Li 	/*
43*600f14f4SXin Li 	 * pass 1
44*600f14f4SXin Li 	 */
45*600f14f4SXin Li 	if(0 == strcmp(infilename, "-")) {
46*600f14f4SXin Li 		fin = stdin;
47*600f14f4SXin Li 	}
48*600f14f4SXin Li 	else if(0 == (fin = flac_fopen(infilename, "r"))) {
49*600f14f4SXin Li 		fprintf(stderr, "can't open file %s for reading: %s\n", infilename, strerror(errno));
50*600f14f4SXin Li 		return 255;
51*600f14f4SXin Li 	}
52*600f14f4SXin Li 	if(0 != (cuesheet = grabbag__cuesheet_parse(fin, &error_message, &last_line_read, sample_rate, is_cdda, lead_out_offset))) {
53*600f14f4SXin Li 		if(fin != stdin)
54*600f14f4SXin Li 			fclose(fin);
55*600f14f4SXin Li 	}
56*600f14f4SXin Li 	else {
57*600f14f4SXin Li 		printf("pass1: parse error, line %u: \"%s\"\n", last_line_read, error_message);
58*600f14f4SXin Li 		if(fin != stdin)
59*600f14f4SXin Li 			fclose(fin);
60*600f14f4SXin Li 		return 1;
61*600f14f4SXin Li 	}
62*600f14f4SXin Li 	if(!FLAC__metadata_object_cuesheet_is_legal(cuesheet, is_cdda, &error_message)) {
63*600f14f4SXin Li 		printf("pass1: illegal cuesheet: \"%s\"\n", error_message);
64*600f14f4SXin Li 		FLAC__metadata_object_delete(cuesheet);
65*600f14f4SXin Li 		return 1;
66*600f14f4SXin Li 	}
67*600f14f4SXin Li 
68*600f14f4SXin Li 	tmpfilenamebase = strstr(infilename, "cuesheets/");
69*600f14f4SXin Li 	tmpfilenamebase = tmpfilenamebase == NULL ? infilename : tmpfilenamebase;
70*600f14f4SXin Li 
71*600f14f4SXin Li 	flac_snprintf(tmpfilename, sizeof (tmpfilename), "%s.1", tmpfilenamebase);
72*600f14f4SXin Li 	if(0 == (fout = flac_fopen(tmpfilename, "w"))) {
73*600f14f4SXin Li 		fprintf(stderr, "can't open file %s for writing: %s\n", tmpfilename, strerror(errno));
74*600f14f4SXin Li 		FLAC__metadata_object_delete(cuesheet);
75*600f14f4SXin Li 		return 255;
76*600f14f4SXin Li 	}
77*600f14f4SXin Li 	grabbag__cuesheet_emit(fout, cuesheet, "\"dummy.wav\" WAVE");
78*600f14f4SXin Li 	FLAC__metadata_object_delete(cuesheet);
79*600f14f4SXin Li 	fclose(fout);
80*600f14f4SXin Li 
81*600f14f4SXin Li 	/*
82*600f14f4SXin Li 	 * pass 2
83*600f14f4SXin Li 	 */
84*600f14f4SXin Li 	if(0 == (fin = flac_fopen(tmpfilename, "r"))) {
85*600f14f4SXin Li 		fprintf(stderr, "can't open file %s for reading: %s\n", tmpfilename, strerror(errno));
86*600f14f4SXin Li 		return 255;
87*600f14f4SXin Li 	}
88*600f14f4SXin Li 	if(0 != (cuesheet = grabbag__cuesheet_parse(fin, &error_message, &last_line_read, sample_rate, is_cdda, lead_out_offset))) {
89*600f14f4SXin Li 		if(fin != stdin)
90*600f14f4SXin Li 			fclose(fin);
91*600f14f4SXin Li 	}
92*600f14f4SXin Li 	else {
93*600f14f4SXin Li 		printf("pass2: parse error, line %u: \"%s\"\n", last_line_read, error_message);
94*600f14f4SXin Li 		if(fin != stdin)
95*600f14f4SXin Li 			fclose(fin);
96*600f14f4SXin Li 		return 1;
97*600f14f4SXin Li 	}
98*600f14f4SXin Li 	if(!FLAC__metadata_object_cuesheet_is_legal(cuesheet, is_cdda, &error_message)) {
99*600f14f4SXin Li 		printf("pass2: illegal cuesheet: \"%s\"\n", error_message);
100*600f14f4SXin Li 		FLAC__metadata_object_delete(cuesheet);
101*600f14f4SXin Li 		return 1;
102*600f14f4SXin Li 	}
103*600f14f4SXin Li 	flac_snprintf(tmpfilename, sizeof (tmpfilename), "%s.2", tmpfilenamebase);
104*600f14f4SXin Li 	if(0 == (fout = flac_fopen(tmpfilename, "w"))) {
105*600f14f4SXin Li 		fprintf(stderr, "can't open file %s for writing: %s\n", tmpfilename, strerror(errno));
106*600f14f4SXin Li 		FLAC__metadata_object_delete(cuesheet);
107*600f14f4SXin Li 		return 255;
108*600f14f4SXin Li 	}
109*600f14f4SXin Li 	grabbag__cuesheet_emit(fout, cuesheet, "\"dummy.wav\" WAVE");
110*600f14f4SXin Li 	FLAC__metadata_object_delete(cuesheet);
111*600f14f4SXin Li 	fclose(fout);
112*600f14f4SXin Li 
113*600f14f4SXin Li 	return 0;
114*600f14f4SXin Li }
115*600f14f4SXin Li 
main(int argc,char * argv[])116*600f14f4SXin Li int main(int argc, char *argv[])
117*600f14f4SXin Li {
118*600f14f4SXin Li 	FLAC__uint64 lead_out_offset;
119*600f14f4SXin Li 	uint32_t sample_rate = 48000;
120*600f14f4SXin Li 	FLAC__bool is_cdda = false;
121*600f14f4SXin Li 	const char *usage = "usage: test_cuesheet cuesheet_file lead_out_offset [ [ sample_rate ] cdda ]\n";
122*600f14f4SXin Li 
123*600f14f4SXin Li 	if(argc > 1 && 0 == strcmp(argv[1], "-h")) {
124*600f14f4SXin Li 		puts(usage);
125*600f14f4SXin Li 		return 0;
126*600f14f4SXin Li 	}
127*600f14f4SXin Li 
128*600f14f4SXin Li 	if(argc < 3 || argc > 5) {
129*600f14f4SXin Li 		fputs(usage, stderr);
130*600f14f4SXin Li 		return 255;
131*600f14f4SXin Li 	}
132*600f14f4SXin Li 
133*600f14f4SXin Li 	lead_out_offset = (FLAC__uint64)strtoul(argv[2], 0, 10);
134*600f14f4SXin Li 	if(argc >= 4) {
135*600f14f4SXin Li 		sample_rate = (uint32_t)atoi(argv[3]);
136*600f14f4SXin Li 		if(argc >= 5) {
137*600f14f4SXin Li 			if(0 == strcmp(argv[4], "cdda"))
138*600f14f4SXin Li 				is_cdda = true;
139*600f14f4SXin Li 			else {
140*600f14f4SXin Li 				fputs(usage, stderr);
141*600f14f4SXin Li 				return 255;
142*600f14f4SXin Li 			}
143*600f14f4SXin Li 		}
144*600f14f4SXin Li 	}
145*600f14f4SXin Li 
146*600f14f4SXin Li 	return do_cuesheet(argv[1], sample_rate, is_cdda, lead_out_offset);
147*600f14f4SXin Li }
148