1*600f14f4SXin Li /* test_streams - Simple test pattern generator
2*600f14f4SXin Li * Copyright (C) 2000-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 <math.h>
25*600f14f4SXin Li #include <stdio.h>
26*600f14f4SXin Li #include <stdlib.h>
27*600f14f4SXin Li #include "share/compat.h"
28*600f14f4SXin Li #if defined _MSC_VER || defined __MINGW32__
29*600f14f4SXin Li #include <time.h>
30*600f14f4SXin Li #else
31*600f14f4SXin Li #include <sys/time.h>
32*600f14f4SXin Li #endif
33*600f14f4SXin Li #include "FLAC/assert.h"
34*600f14f4SXin Li #include "FLAC/ordinals.h"
35*600f14f4SXin Li #include "share/compat.h"
36*600f14f4SXin Li
37*600f14f4SXin Li #if !defined _MSC_VER && !defined __MINGW32__
38*600f14f4SXin Li #define GET_RANDOM_BYTE (((unsigned)random()) & 0xff)
39*600f14f4SXin Li #else
40*600f14f4SXin Li #define GET_RANDOM_BYTE (((unsigned)rand()) & 0xff)
41*600f14f4SXin Li #endif
42*600f14f4SXin Li
43*600f14f4SXin Li static FLAC__bool is_big_endian_host;
44*600f14f4SXin Li
45*600f14f4SXin Li
write_little_endian_unsigned(FILE * f,FLAC__uint32 x,size_t bytes)46*600f14f4SXin Li static FLAC__bool write_little_endian_unsigned(FILE *f, FLAC__uint32 x, size_t bytes)
47*600f14f4SXin Li {
48*600f14f4SXin Li while(bytes) {
49*600f14f4SXin Li if(fputc(x, f) == EOF)
50*600f14f4SXin Li return false;
51*600f14f4SXin Li x >>= 8;
52*600f14f4SXin Li bytes--;
53*600f14f4SXin Li }
54*600f14f4SXin Li return true;
55*600f14f4SXin Li }
56*600f14f4SXin Li
write_little_endian_signed(FILE * f,FLAC__int32 x,size_t bytes)57*600f14f4SXin Li static FLAC__bool write_little_endian_signed(FILE *f, FLAC__int32 x, size_t bytes)
58*600f14f4SXin Li {
59*600f14f4SXin Li return write_little_endian_unsigned(f, (FLAC__uint32) x, bytes);
60*600f14f4SXin Li }
61*600f14f4SXin Li
write_little_endian_uint16(FILE * f,FLAC__uint16 x)62*600f14f4SXin Li static FLAC__bool write_little_endian_uint16(FILE *f, FLAC__uint16 x)
63*600f14f4SXin Li {
64*600f14f4SXin Li return
65*600f14f4SXin Li fputc(x, f) != EOF &&
66*600f14f4SXin Li fputc(x >> 8, f) != EOF
67*600f14f4SXin Li ;
68*600f14f4SXin Li }
69*600f14f4SXin Li
write_little_endian_int16(FILE * f,FLAC__int16 x)70*600f14f4SXin Li static FLAC__bool write_little_endian_int16(FILE *f, FLAC__int16 x)
71*600f14f4SXin Li {
72*600f14f4SXin Li return write_little_endian_uint16(f, (FLAC__uint16)x);
73*600f14f4SXin Li }
74*600f14f4SXin Li
write_little_endian_uint24(FILE * f,FLAC__uint32 x)75*600f14f4SXin Li static FLAC__bool write_little_endian_uint24(FILE *f, FLAC__uint32 x)
76*600f14f4SXin Li {
77*600f14f4SXin Li return
78*600f14f4SXin Li fputc(x, f) != EOF &&
79*600f14f4SXin Li fputc(x >> 8, f) != EOF &&
80*600f14f4SXin Li fputc(x >> 16, f) != EOF
81*600f14f4SXin Li ;
82*600f14f4SXin Li }
83*600f14f4SXin Li
write_little_endian_int24(FILE * f,FLAC__int32 x)84*600f14f4SXin Li static FLAC__bool write_little_endian_int24(FILE *f, FLAC__int32 x)
85*600f14f4SXin Li {
86*600f14f4SXin Li return write_little_endian_uint24(f, (FLAC__uint32)x);
87*600f14f4SXin Li }
88*600f14f4SXin Li
write_little_endian_uint32(FILE * f,FLAC__uint32 x)89*600f14f4SXin Li static FLAC__bool write_little_endian_uint32(FILE *f, FLAC__uint32 x)
90*600f14f4SXin Li {
91*600f14f4SXin Li return
92*600f14f4SXin Li fputc(x, f) != EOF &&
93*600f14f4SXin Li fputc(x >> 8, f) != EOF &&
94*600f14f4SXin Li fputc(x >> 16, f) != EOF &&
95*600f14f4SXin Li fputc(x >> 24, f) != EOF
96*600f14f4SXin Li ;
97*600f14f4SXin Li }
98*600f14f4SXin Li
write_little_endian_int32(FILE * f,FLAC__int32 x)99*600f14f4SXin Li static FLAC__bool write_little_endian_int32(FILE *f, FLAC__int32 x)
100*600f14f4SXin Li {
101*600f14f4SXin Li return write_little_endian_uint32(f, (FLAC__uint32)x);
102*600f14f4SXin Li }
103*600f14f4SXin Li
104*600f14f4SXin Li #if defined(_MSC_VER)
105*600f14f4SXin Li // silence 4 MSVC warnings 'conversion from 'FLAC__uint64' to 'int', possible loss of data'
106*600f14f4SXin Li #pragma warning ( disable : 4244 )
107*600f14f4SXin Li #endif
write_little_endian_uint64(FILE * f,FLAC__uint64 x)108*600f14f4SXin Li static FLAC__bool write_little_endian_uint64(FILE *f, FLAC__uint64 x)
109*600f14f4SXin Li {
110*600f14f4SXin Li return
111*600f14f4SXin Li fputc(x, f) != EOF &&
112*600f14f4SXin Li fputc(x >> 8, f) != EOF &&
113*600f14f4SXin Li fputc(x >> 16, f) != EOF &&
114*600f14f4SXin Li fputc(x >> 24, f) != EOF &&
115*600f14f4SXin Li fputc(x >> 32, f) != EOF &&
116*600f14f4SXin Li fputc(x >> 40, f) != EOF &&
117*600f14f4SXin Li fputc(x >> 48, f) != EOF &&
118*600f14f4SXin Li fputc(x >> 56, f) != EOF
119*600f14f4SXin Li ;
120*600f14f4SXin Li }
121*600f14f4SXin Li #if defined(_MSC_VER)
122*600f14f4SXin Li #pragma warning ( default : 4244 )
123*600f14f4SXin Li #endif
124*600f14f4SXin Li
write_big_endian(FILE * f,FLAC__int32 x,size_t bytes)125*600f14f4SXin Li static FLAC__bool write_big_endian(FILE *f, FLAC__int32 x, size_t bytes)
126*600f14f4SXin Li {
127*600f14f4SXin Li if(bytes < 4)
128*600f14f4SXin Li x <<= 8*(4-bytes);
129*600f14f4SXin Li while(bytes) {
130*600f14f4SXin Li if(fputc(x>>24, f) == EOF)
131*600f14f4SXin Li return false;
132*600f14f4SXin Li x <<= 8;
133*600f14f4SXin Li bytes--;
134*600f14f4SXin Li }
135*600f14f4SXin Li return true;
136*600f14f4SXin Li }
137*600f14f4SXin Li
write_big_endian_uint16(FILE * f,FLAC__uint16 x)138*600f14f4SXin Li static FLAC__bool write_big_endian_uint16(FILE *f, FLAC__uint16 x)
139*600f14f4SXin Li {
140*600f14f4SXin Li return
141*600f14f4SXin Li fputc(x >> 8, f) != EOF &&
142*600f14f4SXin Li fputc(x, f) != EOF
143*600f14f4SXin Li ;
144*600f14f4SXin Li }
145*600f14f4SXin Li
146*600f14f4SXin Li #if 0
147*600f14f4SXin Li /* @@@ not used (yet) */
148*600f14f4SXin Li static FLAC__bool write_big_endian_int16(FILE *f, FLAC__int16 x)
149*600f14f4SXin Li {
150*600f14f4SXin Li return write_big_endian_uint16(f, (FLAC__uint16)x);
151*600f14f4SXin Li }
152*600f14f4SXin Li #endif
153*600f14f4SXin Li
154*600f14f4SXin Li #if 0
155*600f14f4SXin Li /* @@@ not used (yet) */
156*600f14f4SXin Li static FLAC__bool write_big_endian_uint24(FILE *f, FLAC__uint32 x)
157*600f14f4SXin Li {
158*600f14f4SXin Li return
159*600f14f4SXin Li fputc(x >> 16, f) != EOF &&
160*600f14f4SXin Li fputc(x >> 8, f) != EOF &&
161*600f14f4SXin Li fputc(x, f) != EOF
162*600f14f4SXin Li ;
163*600f14f4SXin Li }
164*600f14f4SXin Li #endif
165*600f14f4SXin Li
166*600f14f4SXin Li #if 0
167*600f14f4SXin Li /* @@@ not used (yet) */
168*600f14f4SXin Li static FLAC__bool write_big_endian_int24(FILE *f, FLAC__int32 x)
169*600f14f4SXin Li {
170*600f14f4SXin Li return write_big_endian_uint24(f, (FLAC__uint32)x);
171*600f14f4SXin Li }
172*600f14f4SXin Li #endif
173*600f14f4SXin Li
write_big_endian_uint32(FILE * f,FLAC__uint32 x)174*600f14f4SXin Li static FLAC__bool write_big_endian_uint32(FILE *f, FLAC__uint32 x)
175*600f14f4SXin Li {
176*600f14f4SXin Li return
177*600f14f4SXin Li fputc(x >> 24, f) != EOF &&
178*600f14f4SXin Li fputc(x >> 16, f) != EOF &&
179*600f14f4SXin Li fputc(x >> 8, f) != EOF &&
180*600f14f4SXin Li fputc(x, f) != EOF
181*600f14f4SXin Li ;
182*600f14f4SXin Li }
183*600f14f4SXin Li
184*600f14f4SXin Li #if 0
185*600f14f4SXin Li /* @@@ not used (yet) */
186*600f14f4SXin Li static FLAC__bool write_big_endian_int32(FILE *f, FLAC__int32 x)
187*600f14f4SXin Li {
188*600f14f4SXin Li return write_big_endian_uint32(f, (FLAC__uint32)x);
189*600f14f4SXin Li }
190*600f14f4SXin Li #endif
191*600f14f4SXin Li
write_sane_extended(FILE * f,unsigned val)192*600f14f4SXin Li static FLAC__bool write_sane_extended(FILE *f, unsigned val)
193*600f14f4SXin Li /* Write to 'f' a SANE extended representation of 'val'. Return false if
194*600f14f4SXin Li * the write succeeds; return true otherwise.
195*600f14f4SXin Li *
196*600f14f4SXin Li * SANE extended is an 80-bit IEEE-754 representation with sign bit, 15 bits
197*600f14f4SXin Li * of exponent, and 64 bits of significand (mantissa). Unlike most IEEE-754
198*600f14f4SXin Li * representations, it does not imply a 1 above the MSB of the significand.
199*600f14f4SXin Li *
200*600f14f4SXin Li * Preconditions:
201*600f14f4SXin Li * val!=0U
202*600f14f4SXin Li */
203*600f14f4SXin Li {
204*600f14f4SXin Li unsigned int shift, exponent;
205*600f14f4SXin Li
206*600f14f4SXin Li FLAC__ASSERT(val!=0U); /* handling 0 would require a special case */
207*600f14f4SXin Li
208*600f14f4SXin Li for(shift= 0U; (val>>(31-shift))==0U; ++shift)
209*600f14f4SXin Li ;
210*600f14f4SXin Li val<<= shift;
211*600f14f4SXin Li exponent= 63U-(shift+32U); /* add 32 for unused second word */
212*600f14f4SXin Li
213*600f14f4SXin Li if(!write_big_endian_uint16(f, (FLAC__uint16)(exponent+0x3FFF)))
214*600f14f4SXin Li return false;
215*600f14f4SXin Li if(!write_big_endian_uint32(f, val))
216*600f14f4SXin Li return false;
217*600f14f4SXin Li if(!write_big_endian_uint32(f, 0)) /* unused second word */
218*600f14f4SXin Li return false;
219*600f14f4SXin Li
220*600f14f4SXin Li return true;
221*600f14f4SXin Li }
222*600f14f4SXin Li
223*600f14f4SXin Li /* a mono one-sample 16bps stream */
generate_01(void)224*600f14f4SXin Li static FLAC__bool generate_01(void)
225*600f14f4SXin Li {
226*600f14f4SXin Li FILE *f;
227*600f14f4SXin Li FLAC__int16 x = -32768;
228*600f14f4SXin Li
229*600f14f4SXin Li if(0 == (f = fopen("test01.raw", "wb")))
230*600f14f4SXin Li return false;
231*600f14f4SXin Li
232*600f14f4SXin Li if(!write_little_endian_int16(f, x))
233*600f14f4SXin Li goto foo;
234*600f14f4SXin Li
235*600f14f4SXin Li fclose(f);
236*600f14f4SXin Li return true;
237*600f14f4SXin Li foo:
238*600f14f4SXin Li fclose(f);
239*600f14f4SXin Li return false;
240*600f14f4SXin Li }
241*600f14f4SXin Li
242*600f14f4SXin Li /* a stereo one-sample 16bps stream */
generate_02(void)243*600f14f4SXin Li static FLAC__bool generate_02(void)
244*600f14f4SXin Li {
245*600f14f4SXin Li FILE *f;
246*600f14f4SXin Li FLAC__int16 xl = -32768, xr = 32767;
247*600f14f4SXin Li
248*600f14f4SXin Li if(0 == (f = fopen("test02.raw", "wb")))
249*600f14f4SXin Li return false;
250*600f14f4SXin Li
251*600f14f4SXin Li if(!write_little_endian_int16(f, xl))
252*600f14f4SXin Li goto foo;
253*600f14f4SXin Li if(!write_little_endian_int16(f, xr))
254*600f14f4SXin Li goto foo;
255*600f14f4SXin Li
256*600f14f4SXin Li fclose(f);
257*600f14f4SXin Li return true;
258*600f14f4SXin Li foo:
259*600f14f4SXin Li fclose(f);
260*600f14f4SXin Li return false;
261*600f14f4SXin Li }
262*600f14f4SXin Li
263*600f14f4SXin Li /* a mono five-sample 16bps stream */
generate_03(void)264*600f14f4SXin Li static FLAC__bool generate_03(void)
265*600f14f4SXin Li {
266*600f14f4SXin Li FILE *f;
267*600f14f4SXin Li FLAC__int16 x[] = { -25, 0, 25, 50, 100 };
268*600f14f4SXin Li unsigned i;
269*600f14f4SXin Li
270*600f14f4SXin Li if(0 == (f = fopen("test03.raw", "wb")))
271*600f14f4SXin Li return false;
272*600f14f4SXin Li
273*600f14f4SXin Li for(i = 0; i < 5; i++)
274*600f14f4SXin Li if(!write_little_endian_int16(f, x[i]))
275*600f14f4SXin Li goto foo;
276*600f14f4SXin Li
277*600f14f4SXin Li fclose(f);
278*600f14f4SXin Li return true;
279*600f14f4SXin Li foo:
280*600f14f4SXin Li fclose(f);
281*600f14f4SXin Li return false;
282*600f14f4SXin Li }
283*600f14f4SXin Li
284*600f14f4SXin Li /* a stereo five-sample 16bps stream */
generate_04(void)285*600f14f4SXin Li static FLAC__bool generate_04(void)
286*600f14f4SXin Li {
287*600f14f4SXin Li FILE *f;
288*600f14f4SXin Li FLAC__int16 x[] = { -25, 500, 0, 400, 25, 300, 50, 200, 100, 100 };
289*600f14f4SXin Li unsigned i;
290*600f14f4SXin Li
291*600f14f4SXin Li if(0 == (f = fopen("test04.raw", "wb")))
292*600f14f4SXin Li return false;
293*600f14f4SXin Li
294*600f14f4SXin Li for(i = 0; i < 10; i++)
295*600f14f4SXin Li if(!write_little_endian_int16(f, x[i]))
296*600f14f4SXin Li goto foo;
297*600f14f4SXin Li
298*600f14f4SXin Li fclose(f);
299*600f14f4SXin Li return true;
300*600f14f4SXin Li foo:
301*600f14f4SXin Li fclose(f);
302*600f14f4SXin Li return false;
303*600f14f4SXin Li }
304*600f14f4SXin Li
305*600f14f4SXin Li /* a mono full-scale deflection 8bps stream */
generate_fsd8(const char * fn,const int pattern[],unsigned reps)306*600f14f4SXin Li static FLAC__bool generate_fsd8(const char *fn, const int pattern[], unsigned reps)
307*600f14f4SXin Li {
308*600f14f4SXin Li FILE *f;
309*600f14f4SXin Li unsigned rep, p;
310*600f14f4SXin Li
311*600f14f4SXin Li FLAC__ASSERT(pattern != 0);
312*600f14f4SXin Li
313*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
314*600f14f4SXin Li return false;
315*600f14f4SXin Li
316*600f14f4SXin Li for(rep = 0; rep < reps; rep++) {
317*600f14f4SXin Li for(p = 0; pattern[p]; p++) {
318*600f14f4SXin Li signed char x = pattern[p] > 0? 127 : -128;
319*600f14f4SXin Li if(fwrite(&x, sizeof(x), 1, f) < 1)
320*600f14f4SXin Li goto foo;
321*600f14f4SXin Li }
322*600f14f4SXin Li }
323*600f14f4SXin Li
324*600f14f4SXin Li fclose(f);
325*600f14f4SXin Li return true;
326*600f14f4SXin Li foo:
327*600f14f4SXin Li fclose(f);
328*600f14f4SXin Li return false;
329*600f14f4SXin Li }
330*600f14f4SXin Li
331*600f14f4SXin Li /* a mono full-scale deflection 16bps stream */
generate_fsd16(const char * fn,const int pattern[],unsigned reps)332*600f14f4SXin Li static FLAC__bool generate_fsd16(const char *fn, const int pattern[], unsigned reps)
333*600f14f4SXin Li {
334*600f14f4SXin Li FILE *f;
335*600f14f4SXin Li unsigned rep, p;
336*600f14f4SXin Li
337*600f14f4SXin Li FLAC__ASSERT(pattern != 0);
338*600f14f4SXin Li
339*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
340*600f14f4SXin Li return false;
341*600f14f4SXin Li
342*600f14f4SXin Li for(rep = 0; rep < reps; rep++) {
343*600f14f4SXin Li for(p = 0; pattern[p]; p++) {
344*600f14f4SXin Li FLAC__int16 x = pattern[p] > 0? 32767 : -32768;
345*600f14f4SXin Li if(!write_little_endian_int16(f, x))
346*600f14f4SXin Li goto foo;
347*600f14f4SXin Li }
348*600f14f4SXin Li }
349*600f14f4SXin Li
350*600f14f4SXin Li fclose(f);
351*600f14f4SXin Li return true;
352*600f14f4SXin Li foo:
353*600f14f4SXin Li fclose(f);
354*600f14f4SXin Li return false;
355*600f14f4SXin Li }
356*600f14f4SXin Li
357*600f14f4SXin Li /* a stereo wasted-bits-per-sample 16bps stream */
generate_wbps16(const char * fn,unsigned samples)358*600f14f4SXin Li static FLAC__bool generate_wbps16(const char *fn, unsigned samples)
359*600f14f4SXin Li {
360*600f14f4SXin Li FILE *f;
361*600f14f4SXin Li unsigned sample;
362*600f14f4SXin Li
363*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
364*600f14f4SXin Li return false;
365*600f14f4SXin Li
366*600f14f4SXin Li for(sample = 0; sample < samples; sample++) {
367*600f14f4SXin Li FLAC__int16 l = (sample % 2000) << 2;
368*600f14f4SXin Li FLAC__int16 r = (sample % 1000) << 3;
369*600f14f4SXin Li if(!write_little_endian_int16(f, l))
370*600f14f4SXin Li goto foo;
371*600f14f4SXin Li if(!write_little_endian_int16(f, r))
372*600f14f4SXin Li goto foo;
373*600f14f4SXin Li }
374*600f14f4SXin Li
375*600f14f4SXin Li fclose(f);
376*600f14f4SXin Li return true;
377*600f14f4SXin Li foo:
378*600f14f4SXin Li fclose(f);
379*600f14f4SXin Li return false;
380*600f14f4SXin Li }
381*600f14f4SXin Li
382*600f14f4SXin Li /* a mono full-scale deflection 24bps stream */
generate_fsd24(const char * fn,const int pattern[],unsigned reps)383*600f14f4SXin Li static FLAC__bool generate_fsd24(const char *fn, const int pattern[], unsigned reps)
384*600f14f4SXin Li {
385*600f14f4SXin Li FILE *f;
386*600f14f4SXin Li unsigned rep, p;
387*600f14f4SXin Li
388*600f14f4SXin Li FLAC__ASSERT(pattern != 0);
389*600f14f4SXin Li
390*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
391*600f14f4SXin Li return false;
392*600f14f4SXin Li
393*600f14f4SXin Li for(rep = 0; rep < reps; rep++) {
394*600f14f4SXin Li for(p = 0; pattern[p]; p++) {
395*600f14f4SXin Li FLAC__int32 x = pattern[p] > 0? 8388607 : -8388608;
396*600f14f4SXin Li if(!write_little_endian_int24(f, x))
397*600f14f4SXin Li goto foo;
398*600f14f4SXin Li }
399*600f14f4SXin Li }
400*600f14f4SXin Li
401*600f14f4SXin Li fclose(f);
402*600f14f4SXin Li return true;
403*600f14f4SXin Li foo:
404*600f14f4SXin Li fclose(f);
405*600f14f4SXin Li return false;
406*600f14f4SXin Li }
407*600f14f4SXin Li
408*600f14f4SXin Li /* a mono full-scale deflection 32bps stream */
generate_fsd32(const char * fn,const int pattern[],unsigned reps)409*600f14f4SXin Li static FLAC__bool generate_fsd32(const char *fn, const int pattern[], unsigned reps)
410*600f14f4SXin Li {
411*600f14f4SXin Li FILE *f;
412*600f14f4SXin Li unsigned rep, p;
413*600f14f4SXin Li
414*600f14f4SXin Li FLAC__ASSERT(pattern != 0);
415*600f14f4SXin Li
416*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
417*600f14f4SXin Li return false;
418*600f14f4SXin Li
419*600f14f4SXin Li for(rep = 0; rep < reps; rep++) {
420*600f14f4SXin Li for(p = 0; pattern[p]; p++) {
421*600f14f4SXin Li FLAC__int32 x = pattern[p] > 0? 2147483647 : -2147483648;
422*600f14f4SXin Li if(!write_little_endian_int32(f, x))
423*600f14f4SXin Li goto foo;
424*600f14f4SXin Li }
425*600f14f4SXin Li }
426*600f14f4SXin Li
427*600f14f4SXin Li fclose(f);
428*600f14f4SXin Li return true;
429*600f14f4SXin Li foo:
430*600f14f4SXin Li fclose(f);
431*600f14f4SXin Li return false;
432*600f14f4SXin Li }
433*600f14f4SXin Li
434*600f14f4SXin Li /* a mono sine-wave 8bps stream */
generate_sine8_1(const char * fn,const double sample_rate,const unsigned samples,const double f1,const double a1,const double f2,const double a2)435*600f14f4SXin Li static FLAC__bool generate_sine8_1(const char *fn, const double sample_rate, const unsigned samples, const double f1, const double a1, const double f2, const double a2)
436*600f14f4SXin Li {
437*600f14f4SXin Li const FLAC__int8 full_scale = 127;
438*600f14f4SXin Li const double delta1 = 2.0 * M_PI / ( sample_rate / f1);
439*600f14f4SXin Li const double delta2 = 2.0 * M_PI / ( sample_rate / f2);
440*600f14f4SXin Li FILE *f;
441*600f14f4SXin Li double theta1, theta2;
442*600f14f4SXin Li unsigned i;
443*600f14f4SXin Li
444*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
445*600f14f4SXin Li return false;
446*600f14f4SXin Li
447*600f14f4SXin Li for(i = 0, theta1 = theta2 = 0.0; i < samples; i++, theta1 += delta1, theta2 += delta2) {
448*600f14f4SXin Li double val = (a1*sin(theta1) + a2*sin(theta2))*(double)full_scale;
449*600f14f4SXin Li FLAC__int8 v = (FLAC__int8)(val + 0.5);
450*600f14f4SXin Li if(fwrite(&v, sizeof(v), 1, f) < 1)
451*600f14f4SXin Li goto foo;
452*600f14f4SXin Li }
453*600f14f4SXin Li
454*600f14f4SXin Li fclose(f);
455*600f14f4SXin Li return true;
456*600f14f4SXin Li foo:
457*600f14f4SXin Li fclose(f);
458*600f14f4SXin Li return false;
459*600f14f4SXin Li }
460*600f14f4SXin Li
461*600f14f4SXin Li /* a stereo sine-wave 8bps stream */
generate_sine8_2(const char * fn,const double sample_rate,const unsigned samples,const double f1,const double a1,const double f2,const double a2,double fmult)462*600f14f4SXin Li static FLAC__bool generate_sine8_2(const char *fn, const double sample_rate, const unsigned samples, const double f1, const double a1, const double f2, const double a2, double fmult)
463*600f14f4SXin Li {
464*600f14f4SXin Li const FLAC__int8 full_scale = 127;
465*600f14f4SXin Li const double delta1 = 2.0 * M_PI / ( sample_rate / f1);
466*600f14f4SXin Li const double delta2 = 2.0 * M_PI / ( sample_rate / f2);
467*600f14f4SXin Li FILE *f;
468*600f14f4SXin Li double theta1, theta2;
469*600f14f4SXin Li unsigned i;
470*600f14f4SXin Li
471*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
472*600f14f4SXin Li return false;
473*600f14f4SXin Li
474*600f14f4SXin Li for(i = 0, theta1 = theta2 = 0.0; i < samples; i++, theta1 += delta1, theta2 += delta2) {
475*600f14f4SXin Li double val = (a1*sin(theta1) + a2*sin(theta2))*(double)full_scale;
476*600f14f4SXin Li FLAC__int8 v = (FLAC__int8)(val + 0.5);
477*600f14f4SXin Li if(fwrite(&v, sizeof(v), 1, f) < 1)
478*600f14f4SXin Li goto foo;
479*600f14f4SXin Li val = -(a1*sin(theta1*fmult) + a2*sin(theta2*fmult))*(double)full_scale;
480*600f14f4SXin Li v = (FLAC__int8)(val + 0.5);
481*600f14f4SXin Li if(fwrite(&v, sizeof(v), 1, f) < 1)
482*600f14f4SXin Li goto foo;
483*600f14f4SXin Li }
484*600f14f4SXin Li
485*600f14f4SXin Li fclose(f);
486*600f14f4SXin Li return true;
487*600f14f4SXin Li foo:
488*600f14f4SXin Li fclose(f);
489*600f14f4SXin Li return false;
490*600f14f4SXin Li }
491*600f14f4SXin Li
492*600f14f4SXin Li /* a mono sine-wave 16bps stream */
generate_sine16_1(const char * fn,const double sample_rate,const unsigned samples,const double f1,const double a1,const double f2,const double a2)493*600f14f4SXin Li static FLAC__bool generate_sine16_1(const char *fn, const double sample_rate, const unsigned samples, const double f1, const double a1, const double f2, const double a2)
494*600f14f4SXin Li {
495*600f14f4SXin Li const FLAC__int16 full_scale = 32767;
496*600f14f4SXin Li const double delta1 = 2.0 * M_PI / ( sample_rate / f1);
497*600f14f4SXin Li const double delta2 = 2.0 * M_PI / ( sample_rate / f2);
498*600f14f4SXin Li FILE *f;
499*600f14f4SXin Li double theta1, theta2;
500*600f14f4SXin Li unsigned i;
501*600f14f4SXin Li
502*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
503*600f14f4SXin Li return false;
504*600f14f4SXin Li
505*600f14f4SXin Li for(i = 0, theta1 = theta2 = 0.0; i < samples; i++, theta1 += delta1, theta2 += delta2) {
506*600f14f4SXin Li double val = (a1*sin(theta1) + a2*sin(theta2))*(double)full_scale;
507*600f14f4SXin Li FLAC__int16 v = (FLAC__int16)(val + 0.5);
508*600f14f4SXin Li if(!write_little_endian_int16(f, v))
509*600f14f4SXin Li goto foo;
510*600f14f4SXin Li }
511*600f14f4SXin Li
512*600f14f4SXin Li fclose(f);
513*600f14f4SXin Li return true;
514*600f14f4SXin Li foo:
515*600f14f4SXin Li fclose(f);
516*600f14f4SXin Li return false;
517*600f14f4SXin Li }
518*600f14f4SXin Li
519*600f14f4SXin Li /* a stereo sine-wave 16bps stream */
generate_sine16_2(const char * fn,const double sample_rate,const unsigned samples,const double f1,const double a1,const double f2,const double a2,double fmult)520*600f14f4SXin Li static FLAC__bool generate_sine16_2(const char *fn, const double sample_rate, const unsigned samples, const double f1, const double a1, const double f2, const double a2, double fmult)
521*600f14f4SXin Li {
522*600f14f4SXin Li const FLAC__int16 full_scale = 32767;
523*600f14f4SXin Li const double delta1 = 2.0 * M_PI / ( sample_rate / f1);
524*600f14f4SXin Li const double delta2 = 2.0 * M_PI / ( sample_rate / f2);
525*600f14f4SXin Li FILE *f;
526*600f14f4SXin Li double theta1, theta2;
527*600f14f4SXin Li unsigned i;
528*600f14f4SXin Li
529*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
530*600f14f4SXin Li return false;
531*600f14f4SXin Li
532*600f14f4SXin Li for(i = 0, theta1 = theta2 = 0.0; i < samples; i++, theta1 += delta1, theta2 += delta2) {
533*600f14f4SXin Li double val = (a1*sin(theta1) + a2*sin(theta2))*(double)full_scale;
534*600f14f4SXin Li FLAC__int16 v = (FLAC__int16)(val + 0.5);
535*600f14f4SXin Li if(!write_little_endian_int16(f, v))
536*600f14f4SXin Li goto foo;
537*600f14f4SXin Li val = -(a1*sin(theta1*fmult) + a2*sin(theta2*fmult))*(double)full_scale;
538*600f14f4SXin Li v = (FLAC__int16)(val + 0.5);
539*600f14f4SXin Li if(!write_little_endian_int16(f, v))
540*600f14f4SXin Li goto foo;
541*600f14f4SXin Li }
542*600f14f4SXin Li
543*600f14f4SXin Li fclose(f);
544*600f14f4SXin Li return true;
545*600f14f4SXin Li foo:
546*600f14f4SXin Li fclose(f);
547*600f14f4SXin Li return false;
548*600f14f4SXin Li }
549*600f14f4SXin Li
550*600f14f4SXin Li /* a mono sine-wave 24bps stream */
generate_sine24_1(const char * fn,const double sample_rate,const unsigned samples,const double f1,const double a1,const double f2,const double a2)551*600f14f4SXin Li static FLAC__bool generate_sine24_1(const char *fn, const double sample_rate, const unsigned samples, const double f1, const double a1, const double f2, const double a2)
552*600f14f4SXin Li {
553*600f14f4SXin Li const FLAC__int32 full_scale = 0x7fffff;
554*600f14f4SXin Li const double delta1 = 2.0 * M_PI / ( sample_rate / f1);
555*600f14f4SXin Li const double delta2 = 2.0 * M_PI / ( sample_rate / f2);
556*600f14f4SXin Li FILE *f;
557*600f14f4SXin Li double theta1, theta2;
558*600f14f4SXin Li unsigned i;
559*600f14f4SXin Li
560*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
561*600f14f4SXin Li return false;
562*600f14f4SXin Li
563*600f14f4SXin Li for(i = 0, theta1 = theta2 = 0.0; i < samples; i++, theta1 += delta1, theta2 += delta2) {
564*600f14f4SXin Li double val = (a1*sin(theta1) + a2*sin(theta2))*(double)full_scale;
565*600f14f4SXin Li FLAC__int32 v = (FLAC__int32)(val + 0.5);
566*600f14f4SXin Li if(!write_little_endian_int24(f, v))
567*600f14f4SXin Li goto foo;
568*600f14f4SXin Li }
569*600f14f4SXin Li
570*600f14f4SXin Li fclose(f);
571*600f14f4SXin Li return true;
572*600f14f4SXin Li foo:
573*600f14f4SXin Li fclose(f);
574*600f14f4SXin Li return false;
575*600f14f4SXin Li }
576*600f14f4SXin Li
577*600f14f4SXin Li /* a stereo sine-wave 24bps stream */
generate_sine24_2(const char * fn,const double sample_rate,const unsigned samples,const double f1,const double a1,const double f2,const double a2,double fmult)578*600f14f4SXin Li static FLAC__bool generate_sine24_2(const char *fn, const double sample_rate, const unsigned samples, const double f1, const double a1, const double f2, const double a2, double fmult)
579*600f14f4SXin Li {
580*600f14f4SXin Li const FLAC__int32 full_scale = 0x7fffff;
581*600f14f4SXin Li const double delta1 = 2.0 * M_PI / ( sample_rate / f1);
582*600f14f4SXin Li const double delta2 = 2.0 * M_PI / ( sample_rate / f2);
583*600f14f4SXin Li FILE *f;
584*600f14f4SXin Li double theta1, theta2;
585*600f14f4SXin Li unsigned i;
586*600f14f4SXin Li
587*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
588*600f14f4SXin Li return false;
589*600f14f4SXin Li
590*600f14f4SXin Li for(i = 0, theta1 = theta2 = 0.0; i < samples; i++, theta1 += delta1, theta2 += delta2) {
591*600f14f4SXin Li double val = (a1*sin(theta1) + a2*sin(theta2))*(double)full_scale;
592*600f14f4SXin Li FLAC__int32 v = (FLAC__int32)(val + 0.5);
593*600f14f4SXin Li if(!write_little_endian_int24(f, v))
594*600f14f4SXin Li goto foo;
595*600f14f4SXin Li val = -(a1*sin(theta1*fmult) + a2*sin(theta2*fmult))*(double)full_scale;
596*600f14f4SXin Li v = (FLAC__int32)(val + 0.5);
597*600f14f4SXin Li if(!write_little_endian_int24(f, v))
598*600f14f4SXin Li goto foo;
599*600f14f4SXin Li }
600*600f14f4SXin Li
601*600f14f4SXin Li fclose(f);
602*600f14f4SXin Li return true;
603*600f14f4SXin Li foo:
604*600f14f4SXin Li fclose(f);
605*600f14f4SXin Li return false;
606*600f14f4SXin Li }
607*600f14f4SXin Li
608*600f14f4SXin Li /* a mono sine-wave 32bps stream */
generate_sine32_1(const char * fn,const double sample_rate,const unsigned samples,const double f1,const double a1,const double f2,const double a2)609*600f14f4SXin Li static FLAC__bool generate_sine32_1(const char *fn, const double sample_rate, const unsigned samples, const double f1, const double a1, const double f2, const double a2)
610*600f14f4SXin Li {
611*600f14f4SXin Li const FLAC__int32 full_scale = 0x7fffffff;
612*600f14f4SXin Li const double delta1 = 2.0 * M_PI / ( sample_rate / f1);
613*600f14f4SXin Li const double delta2 = 2.0 * M_PI / ( sample_rate / f2);
614*600f14f4SXin Li FILE *f;
615*600f14f4SXin Li double theta1, theta2;
616*600f14f4SXin Li unsigned i;
617*600f14f4SXin Li
618*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
619*600f14f4SXin Li return false;
620*600f14f4SXin Li
621*600f14f4SXin Li for(i = 0, theta1 = theta2 = 0.0; i < samples; i++, theta1 += delta1, theta2 += delta2) {
622*600f14f4SXin Li double val = (a1*sin(theta1) + a2*sin(theta2))*(double)full_scale;
623*600f14f4SXin Li FLAC__int32 v = (FLAC__int32)(val + 0.5);
624*600f14f4SXin Li if(!write_little_endian_int32(f, v))
625*600f14f4SXin Li goto foo;
626*600f14f4SXin Li }
627*600f14f4SXin Li
628*600f14f4SXin Li fclose(f);
629*600f14f4SXin Li return true;
630*600f14f4SXin Li foo:
631*600f14f4SXin Li fclose(f);
632*600f14f4SXin Li return false;
633*600f14f4SXin Li }
634*600f14f4SXin Li
635*600f14f4SXin Li /* a stereo sine-wave 32bps stream */
generate_sine32_2(const char * fn,const double sample_rate,const unsigned samples,const double f1,const double a1,const double f2,const double a2,double fmult)636*600f14f4SXin Li static FLAC__bool generate_sine32_2(const char *fn, const double sample_rate, const unsigned samples, const double f1, const double a1, const double f2, const double a2, double fmult)
637*600f14f4SXin Li {
638*600f14f4SXin Li const FLAC__int32 full_scale = 0x7fffffff;
639*600f14f4SXin Li const double delta1 = 2.0 * M_PI / ( sample_rate / f1);
640*600f14f4SXin Li const double delta2 = 2.0 * M_PI / ( sample_rate / f2);
641*600f14f4SXin Li FILE *f;
642*600f14f4SXin Li double theta1, theta2;
643*600f14f4SXin Li unsigned i;
644*600f14f4SXin Li
645*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
646*600f14f4SXin Li return false;
647*600f14f4SXin Li
648*600f14f4SXin Li for(i = 0, theta1 = theta2 = 0.0; i < samples; i++, theta1 += delta1, theta2 += delta2) {
649*600f14f4SXin Li double val = (a1*sin(theta1) + a2*sin(theta2))*(double)full_scale;
650*600f14f4SXin Li FLAC__int32 v = (FLAC__int32)(val + 0.5);
651*600f14f4SXin Li if(!write_little_endian_int32(f, v))
652*600f14f4SXin Li goto foo;
653*600f14f4SXin Li val = -(a1*sin(theta1*fmult) + a2*sin(theta2*fmult))*(double)full_scale;
654*600f14f4SXin Li v = (FLAC__int32)(val + 0.5);
655*600f14f4SXin Li if(!write_little_endian_int32(f, v))
656*600f14f4SXin Li goto foo;
657*600f14f4SXin Li }
658*600f14f4SXin Li
659*600f14f4SXin Li fclose(f);
660*600f14f4SXin Li return true;
661*600f14f4SXin Li foo:
662*600f14f4SXin Li fclose(f);
663*600f14f4SXin Li return false;
664*600f14f4SXin Li }
665*600f14f4SXin Li
generate_noise(const char * fn,unsigned bytes)666*600f14f4SXin Li static FLAC__bool generate_noise(const char *fn, unsigned bytes)
667*600f14f4SXin Li {
668*600f14f4SXin Li FILE *f;
669*600f14f4SXin Li unsigned b;
670*600f14f4SXin Li
671*600f14f4SXin Li if(0 == (f = fopen(fn, "wb")))
672*600f14f4SXin Li return false;
673*600f14f4SXin Li
674*600f14f4SXin Li for(b = 0; b < bytes; b++) {
675*600f14f4SXin Li #if !defined _MSC_VER && !defined __MINGW32__
676*600f14f4SXin Li FLAC__byte x = (FLAC__byte)(((unsigned)random()) & 0xff);
677*600f14f4SXin Li #else
678*600f14f4SXin Li FLAC__byte x = (FLAC__byte)(((unsigned)rand()) & 0xff);
679*600f14f4SXin Li #endif
680*600f14f4SXin Li if(fwrite(&x, sizeof(x), 1, f) < 1)
681*600f14f4SXin Li goto foo;
682*600f14f4SXin Li }
683*600f14f4SXin Li
684*600f14f4SXin Li fclose(f);
685*600f14f4SXin Li return true;
686*600f14f4SXin Li foo:
687*600f14f4SXin Li fclose(f);
688*600f14f4SXin Li return false;
689*600f14f4SXin Li }
690*600f14f4SXin Li
generate_signed_raw(const char * filename,unsigned channels,unsigned bytes_per_sample,unsigned samples)691*600f14f4SXin Li static FLAC__bool generate_signed_raw(const char *filename, unsigned channels, unsigned bytes_per_sample, unsigned samples)
692*600f14f4SXin Li {
693*600f14f4SXin Li const FLAC__int32 full_scale = (1 << (bytes_per_sample*8-1)) - 1;
694*600f14f4SXin Li const double f1 = 441.0, a1 = 0.61, f2 = 661.5, a2 = 0.37;
695*600f14f4SXin Li const double delta1 = 2.0 * M_PI / ( 44100.0 / f1);
696*600f14f4SXin Li const double delta2 = 2.0 * M_PI / ( 44100.0 / f2);
697*600f14f4SXin Li double theta1, theta2;
698*600f14f4SXin Li FILE *f;
699*600f14f4SXin Li unsigned i, j;
700*600f14f4SXin Li
701*600f14f4SXin Li if(0 == (f = fopen(filename, "wb")))
702*600f14f4SXin Li return false;
703*600f14f4SXin Li
704*600f14f4SXin Li for(i = 0, theta1 = theta2 = 0.0; i < samples; i++, theta1 += delta1, theta2 += delta2) {
705*600f14f4SXin Li for(j = 0; j < channels; j++) {
706*600f14f4SXin Li double val = (a1*sin(theta1) + a2*sin(theta2))*(double)full_scale;
707*600f14f4SXin Li FLAC__int32 v = (FLAC__int32)(val + 0.5) + ((GET_RANDOM_BYTE>>4)-8);
708*600f14f4SXin Li if(!write_little_endian_signed(f, v, bytes_per_sample))
709*600f14f4SXin Li goto foo;
710*600f14f4SXin Li }
711*600f14f4SXin Li }
712*600f14f4SXin Li
713*600f14f4SXin Li fclose(f);
714*600f14f4SXin Li return true;
715*600f14f4SXin Li foo:
716*600f14f4SXin Li fclose(f);
717*600f14f4SXin Li return false;
718*600f14f4SXin Li }
719*600f14f4SXin Li
generate_unsigned_raw(const char * filename,unsigned channels,unsigned bytes_per_sample,unsigned samples)720*600f14f4SXin Li static FLAC__bool generate_unsigned_raw(const char *filename, unsigned channels, unsigned bytes_per_sample, unsigned samples)
721*600f14f4SXin Li {
722*600f14f4SXin Li const FLAC__int32 full_scale = (1 << (bytes_per_sample*8-1)) - 1;
723*600f14f4SXin Li const double f1 = 441.0, a1 = 0.61, f2 = 661.5, a2 = 0.37;
724*600f14f4SXin Li const double delta1 = 2.0 * M_PI / ( 44100.0 / f1);
725*600f14f4SXin Li const double delta2 = 2.0 * M_PI / ( 44100.0 / f2);
726*600f14f4SXin Li const double half_scale = 0.5 * full_scale;
727*600f14f4SXin Li double theta1, theta2;
728*600f14f4SXin Li FILE *f;
729*600f14f4SXin Li unsigned i, j;
730*600f14f4SXin Li
731*600f14f4SXin Li if(0 == (f = fopen(filename, "wb")))
732*600f14f4SXin Li return false;
733*600f14f4SXin Li
734*600f14f4SXin Li for(i = 0, theta1 = theta2 = 0.0; i < samples; i++, theta1 += delta1, theta2 += delta2) {
735*600f14f4SXin Li for(j = 0; j < channels; j++) {
736*600f14f4SXin Li double val = (a1*sin(theta1) + a2*sin(theta2))*(double)full_scale;
737*600f14f4SXin Li FLAC__int32 v = (FLAC__int32)(half_scale + val + 0.5) + ((GET_RANDOM_BYTE>>4)-8);
738*600f14f4SXin Li if(!write_little_endian_unsigned(f, v, bytes_per_sample))
739*600f14f4SXin Li goto foo;
740*600f14f4SXin Li }
741*600f14f4SXin Li }
742*600f14f4SXin Li
743*600f14f4SXin Li fclose(f);
744*600f14f4SXin Li return true;
745*600f14f4SXin Li foo:
746*600f14f4SXin Li fclose(f);
747*600f14f4SXin Li return false;
748*600f14f4SXin Li }
749*600f14f4SXin Li
generate_aiff(const char * filename,unsigned sample_rate,unsigned channels,unsigned bps,unsigned samples)750*600f14f4SXin Li static FLAC__bool generate_aiff(const char *filename, unsigned sample_rate, unsigned channels, unsigned bps, unsigned samples)
751*600f14f4SXin Li {
752*600f14f4SXin Li const unsigned bytes_per_sample = (bps+7)/8;
753*600f14f4SXin Li const unsigned true_size = channels * bytes_per_sample * samples;
754*600f14f4SXin Li const unsigned padded_size = (true_size + 1) & (~1u);
755*600f14f4SXin Li const unsigned shift = (bps%8)? 8 - (bps%8) : 0;
756*600f14f4SXin Li const FLAC__int32 full_scale = (1 << (bps-1)) - 1;
757*600f14f4SXin Li const double f1 = 441.0, a1 = 0.61, f2 = 661.5, a2 = 0.37;
758*600f14f4SXin Li const double delta1 = 2.0 * M_PI / ( sample_rate / f1);
759*600f14f4SXin Li const double delta2 = 2.0 * M_PI / ( sample_rate / f2);
760*600f14f4SXin Li double theta1, theta2;
761*600f14f4SXin Li FILE *f;
762*600f14f4SXin Li unsigned i, j;
763*600f14f4SXin Li
764*600f14f4SXin Li if(0 == (f = fopen(filename, "wb")))
765*600f14f4SXin Li return false;
766*600f14f4SXin Li if(fwrite("FORM", 1, 4, f) < 4)
767*600f14f4SXin Li goto foo;
768*600f14f4SXin Li if(!write_big_endian_uint32(f, padded_size + 46))
769*600f14f4SXin Li goto foo;
770*600f14f4SXin Li if(fwrite("AIFFCOMM\000\000\000\022", 1, 12, f) < 12)
771*600f14f4SXin Li goto foo;
772*600f14f4SXin Li if(!write_big_endian_uint16(f, (FLAC__uint16)channels))
773*600f14f4SXin Li goto foo;
774*600f14f4SXin Li if(!write_big_endian_uint32(f, samples))
775*600f14f4SXin Li goto foo;
776*600f14f4SXin Li if(!write_big_endian_uint16(f, (FLAC__uint16)bps))
777*600f14f4SXin Li goto foo;
778*600f14f4SXin Li if(!write_sane_extended(f, sample_rate))
779*600f14f4SXin Li goto foo;
780*600f14f4SXin Li if(fwrite("SSND", 1, 4, f) < 4)
781*600f14f4SXin Li goto foo;
782*600f14f4SXin Li if(!write_big_endian_uint32(f, true_size + 8))
783*600f14f4SXin Li goto foo;
784*600f14f4SXin Li if(fwrite("\000\000\000\000\000\000\000\000", 1, 8, f) < 8)
785*600f14f4SXin Li goto foo;
786*600f14f4SXin Li
787*600f14f4SXin Li for(i = 0, theta1 = theta2 = 0.0; i < samples; i++, theta1 += delta1, theta2 += delta2) {
788*600f14f4SXin Li for(j = 0; j < channels; j++) {
789*600f14f4SXin Li double val = (a1*sin(theta1) + a2*sin(theta2))*(double)full_scale;
790*600f14f4SXin Li FLAC__int32 v = ((FLAC__int32)(val + 0.5) + ((GET_RANDOM_BYTE>>4)-8)) << shift;
791*600f14f4SXin Li if(!write_big_endian(f, v, bytes_per_sample))
792*600f14f4SXin Li goto foo;
793*600f14f4SXin Li }
794*600f14f4SXin Li }
795*600f14f4SXin Li for(i = true_size; i < padded_size; i++)
796*600f14f4SXin Li if(fputc(0, f) == EOF)
797*600f14f4SXin Li goto foo;
798*600f14f4SXin Li
799*600f14f4SXin Li fclose(f);
800*600f14f4SXin Li return true;
801*600f14f4SXin Li foo:
802*600f14f4SXin Li fclose(f);
803*600f14f4SXin Li return false;
804*600f14f4SXin Li }
805*600f14f4SXin Li
806*600f14f4SXin Li /* flavor is: 0:WAVE, 1:RF64, 2:WAVE64 */
generate_wav(const char * filename,unsigned sample_rate,unsigned channels,unsigned bps,unsigned samples,FLAC__bool strict,int flavor)807*600f14f4SXin Li static FLAC__bool generate_wav(const char *filename, unsigned sample_rate, unsigned channels, unsigned bps, unsigned samples, FLAC__bool strict, int flavor)
808*600f14f4SXin Li {
809*600f14f4SXin Li const FLAC__bool waveformatextensible = strict && (channels > 2 || (bps != 8 && bps != 16));
810*600f14f4SXin Li
811*600f14f4SXin Li const unsigned bytes_per_sample = (bps+7)/8;
812*600f14f4SXin Li const unsigned shift = (bps%8)? 8 - (bps%8) : 0;
813*600f14f4SXin Li /* this rig is not going over 4G so we're ok with 32-bit sizes here */
814*600f14f4SXin Li const FLAC__uint32 true_size = channels * bytes_per_sample * samples;
815*600f14f4SXin Li const FLAC__uint32 padded_size = flavor<2? (true_size + 1) & (~1u) : (true_size + 7) & (~7u);
816*600f14f4SXin Li const FLAC__int32 full_scale = (1 << (bps-1)) - 1;
817*600f14f4SXin Li const double f1 = 441.0, a1 = 0.61, f2 = 661.5, a2 = 0.37;
818*600f14f4SXin Li const double delta1 = 2.0 * M_PI / ( sample_rate / f1);
819*600f14f4SXin Li const double delta2 = 2.0 * M_PI / ( sample_rate / f2);
820*600f14f4SXin Li double theta1, theta2;
821*600f14f4SXin Li FILE *f;
822*600f14f4SXin Li unsigned i, j;
823*600f14f4SXin Li
824*600f14f4SXin Li if(0 == (f = fopen(filename, "wb")))
825*600f14f4SXin Li return false;
826*600f14f4SXin Li /* RIFFxxxxWAVE or equivalent: */
827*600f14f4SXin Li switch(flavor) {
828*600f14f4SXin Li case 0:
829*600f14f4SXin Li if(fwrite("RIFF", 1, 4, f) < 4)
830*600f14f4SXin Li goto foo;
831*600f14f4SXin Li /* +4 for WAVE */
832*600f14f4SXin Li /* +8+{40,16} for fmt chunk */
833*600f14f4SXin Li /* +8 for data chunk header */
834*600f14f4SXin Li if(!write_little_endian_uint32(f, 4 + 8+(waveformatextensible?40:16) + 8 + padded_size))
835*600f14f4SXin Li goto foo;
836*600f14f4SXin Li if(fwrite("WAVE", 1, 4, f) < 4)
837*600f14f4SXin Li goto foo;
838*600f14f4SXin Li break;
839*600f14f4SXin Li case 1:
840*600f14f4SXin Li if(fwrite("RF64", 1, 4, f) < 4)
841*600f14f4SXin Li goto foo;
842*600f14f4SXin Li if(!write_little_endian_uint32(f, 0xffffffff))
843*600f14f4SXin Li goto foo;
844*600f14f4SXin Li if(fwrite("WAVE", 1, 4, f) < 4)
845*600f14f4SXin Li goto foo;
846*600f14f4SXin Li break;
847*600f14f4SXin Li case 2:
848*600f14f4SXin Li /* RIFF GUID 66666972-912E-11CF-A5D6-28DB04C10000 */
849*600f14f4SXin Li if(fwrite("\x72\x69\x66\x66\x2E\x91\xCF\x11\xA5\xD6\x28\xDB\x04\xC1\x00\x00", 1, 16, f) < 16)
850*600f14f4SXin Li goto foo;
851*600f14f4SXin Li /* +(16+8) for RIFF GUID + size */
852*600f14f4SXin Li /* +16 for WAVE GUID */
853*600f14f4SXin Li /* +16+8+{40,16} for fmt chunk */
854*600f14f4SXin Li /* +16+8 for data chunk header */
855*600f14f4SXin Li if(!write_little_endian_uint64(f, (16+8) + 16 + 16+8+(waveformatextensible?40:16) + (16+8) + padded_size))
856*600f14f4SXin Li goto foo;
857*600f14f4SXin Li /* WAVE GUID 65766177-ACF3-11D3-8CD1-00C04F8EDB8A */
858*600f14f4SXin Li if(fwrite("\x77\x61\x76\x65\xF3\xAC\xD3\x11\x8C\xD1\x00\xC0\x4F\x8E\xDB\x8A", 1, 16, f) < 16)
859*600f14f4SXin Li goto foo;
860*600f14f4SXin Li break;
861*600f14f4SXin Li default:
862*600f14f4SXin Li goto foo;
863*600f14f4SXin Li }
864*600f14f4SXin Li if(flavor == 1) { /* rf64 */
865*600f14f4SXin Li if(fwrite("ds64", 1, 4, f) < 4)
866*600f14f4SXin Li goto foo;
867*600f14f4SXin Li if(!write_little_endian_uint32(f, 28)) /* ds64 chunk size */
868*600f14f4SXin Li goto foo;
869*600f14f4SXin Li if(!write_little_endian_uint64(f, 36 + padded_size + (waveformatextensible?60:36)))
870*600f14f4SXin Li goto foo;
871*600f14f4SXin Li if(!write_little_endian_uint64(f, true_size))
872*600f14f4SXin Li goto foo;
873*600f14f4SXin Li if(!write_little_endian_uint64(f, samples))
874*600f14f4SXin Li goto foo;
875*600f14f4SXin Li if(!write_little_endian_uint32(f, 0)) /* table size */
876*600f14f4SXin Li goto foo;
877*600f14f4SXin Li }
878*600f14f4SXin Li /* fmt chunk */
879*600f14f4SXin Li if(flavor < 2) {
880*600f14f4SXin Li if(fwrite("fmt ", 1, 4, f) < 4)
881*600f14f4SXin Li goto foo;
882*600f14f4SXin Li /* chunk size */
883*600f14f4SXin Li if(!write_little_endian_uint32(f, waveformatextensible?40:16))
884*600f14f4SXin Li goto foo;
885*600f14f4SXin Li }
886*600f14f4SXin Li else { /* wave64 */
887*600f14f4SXin Li /* fmt GUID 20746D66-ACF3-11D3-8CD1-00C04F8EDB8A */
888*600f14f4SXin Li if(fwrite("\x66\x6D\x74\x20\xF3\xAC\xD3\x11\x8C\xD1\x00\xC0\x4F\x8E\xDB\x8A", 1, 16, f) < 16)
889*600f14f4SXin Li goto foo;
890*600f14f4SXin Li /* chunk size (+16+8 for GUID and size fields) */
891*600f14f4SXin Li if(!write_little_endian_uint64(f, 16+8+(waveformatextensible?40:16)))
892*600f14f4SXin Li goto foo;
893*600f14f4SXin Li }
894*600f14f4SXin Li if(!write_little_endian_uint16(f, (FLAC__uint16)(waveformatextensible?65534:1)))
895*600f14f4SXin Li goto foo;
896*600f14f4SXin Li if(!write_little_endian_uint16(f, (FLAC__uint16)channels))
897*600f14f4SXin Li goto foo;
898*600f14f4SXin Li if(!write_little_endian_uint32(f, sample_rate))
899*600f14f4SXin Li goto foo;
900*600f14f4SXin Li if(!write_little_endian_uint32(f, sample_rate * channels * bytes_per_sample))
901*600f14f4SXin Li goto foo;
902*600f14f4SXin Li if(!write_little_endian_uint16(f, (FLAC__uint16)(channels * bytes_per_sample))) /* block align */
903*600f14f4SXin Li goto foo;
904*600f14f4SXin Li if(!write_little_endian_uint16(f, (FLAC__uint16)(bps+shift)))
905*600f14f4SXin Li goto foo;
906*600f14f4SXin Li if(waveformatextensible) {
907*600f14f4SXin Li if(!write_little_endian_uint16(f, (FLAC__uint16)22)) /* cbSize */
908*600f14f4SXin Li goto foo;
909*600f14f4SXin Li if(!write_little_endian_uint16(f, (FLAC__uint16)bps)) /* validBitsPerSample */
910*600f14f4SXin Li goto foo;
911*600f14f4SXin Li if(!write_little_endian_uint32(f, 0)) /* channelMask */
912*600f14f4SXin Li goto foo;
913*600f14f4SXin Li /* GUID = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}} */
914*600f14f4SXin Li if(fwrite("\x01\x00\x00\x00\x00\x00\x10\x00\x80\x00\x00\xaa\x00\x38\x9b\x71", 1, 16, f) != 16)
915*600f14f4SXin Li goto foo;
916*600f14f4SXin Li }
917*600f14f4SXin Li /* data chunk */
918*600f14f4SXin Li if(flavor < 2) {
919*600f14f4SXin Li if(fwrite("data", 1, 4, f) < 4)
920*600f14f4SXin Li goto foo;
921*600f14f4SXin Li if(!write_little_endian_uint32(f, flavor==1? 0xffffffff : true_size))
922*600f14f4SXin Li goto foo;
923*600f14f4SXin Li }
924*600f14f4SXin Li else { /* wave64 */
925*600f14f4SXin Li /* data GUID 61746164-ACF3-11D3-8CD1-00C04F8EDB8A */
926*600f14f4SXin Li if(fwrite("\x64\x61\x74\x61\xF3\xAC\xD3\x11\x8C\xD1\x00\xC0\x4F\x8E\xDB\x8A", 1, 16, f) != 16)
927*600f14f4SXin Li goto foo;
928*600f14f4SXin Li /* +16+8 for GUID and size fields */
929*600f14f4SXin Li if(!write_little_endian_uint64(f, 16+8 + true_size))
930*600f14f4SXin Li goto foo;
931*600f14f4SXin Li }
932*600f14f4SXin Li
933*600f14f4SXin Li for(i = 0, theta1 = theta2 = 0.0; i < samples; i++, theta1 += delta1, theta2 += delta2) {
934*600f14f4SXin Li for(j = 0; j < channels; j++) {
935*600f14f4SXin Li double val = (a1*sin(theta1) + a2*sin(theta2))*(double)full_scale;
936*600f14f4SXin Li FLAC__int32 v = ((FLAC__int32)(val + 0.5) + ((GET_RANDOM_BYTE>>4)-8)) << shift;
937*600f14f4SXin Li if(!write_little_endian_signed(f, v, bytes_per_sample))
938*600f14f4SXin Li goto foo;
939*600f14f4SXin Li }
940*600f14f4SXin Li }
941*600f14f4SXin Li for(i = true_size; i < padded_size; i++)
942*600f14f4SXin Li if(fputc(0, f) == EOF)
943*600f14f4SXin Li goto foo;
944*600f14f4SXin Li
945*600f14f4SXin Li fclose(f);
946*600f14f4SXin Li return true;
947*600f14f4SXin Li foo:
948*600f14f4SXin Li fclose(f);
949*600f14f4SXin Li return false;
950*600f14f4SXin Li }
951*600f14f4SXin Li
generate_wackywavs(void)952*600f14f4SXin Li static FLAC__bool generate_wackywavs(void)
953*600f14f4SXin Li {
954*600f14f4SXin Li FILE *f;
955*600f14f4SXin Li FLAC__byte wav[] = {
956*600f14f4SXin Li 'R', 'I', 'F', 'F', 76, 0, 0, 0,
957*600f14f4SXin Li 'W', 'A', 'V', 'E', 'j', 'u', 'n', 'k',
958*600f14f4SXin Li 4, 0, 0, 0 , 'b', 'l', 'a', 'h',
959*600f14f4SXin Li 'p', 'a', 'd', ' ', 4, 0, 0, 0,
960*600f14f4SXin Li 'B', 'L', 'A', 'H', 'f', 'm', 't', ' ',
961*600f14f4SXin Li 16, 0, 0, 0, 1, 0, 1, 0,
962*600f14f4SXin Li 0x44,0xAC, 0, 0,0x88,0x58,0x01, 0,
963*600f14f4SXin Li 2, 0, 16, 0, 'd', 'a', 't', 'a',
964*600f14f4SXin Li 16, 0, 0, 0, 0, 0, 1, 0,
965*600f14f4SXin Li 4, 0, 9, 0, 16, 0, 25, 0,
966*600f14f4SXin Li 36, 0, 49, 0, 'p', 'a', 'd', ' ',
967*600f14f4SXin Li 4, 0, 0, 0, 'b', 'l', 'a', 'h'
968*600f14f4SXin Li };
969*600f14f4SXin Li
970*600f14f4SXin Li if(0 == (f = fopen("wacky1.wav", "wb")))
971*600f14f4SXin Li return false;
972*600f14f4SXin Li if(fwrite(wav, 1, 84, f) < 84)
973*600f14f4SXin Li goto foo;
974*600f14f4SXin Li fclose(f);
975*600f14f4SXin Li
976*600f14f4SXin Li wav[4] += 12;
977*600f14f4SXin Li if(0 == (f = fopen("wacky2.wav", "wb")))
978*600f14f4SXin Li return false;
979*600f14f4SXin Li if(fwrite(wav, 1, 96, f) < 96)
980*600f14f4SXin Li goto foo;
981*600f14f4SXin Li fclose(f);
982*600f14f4SXin Li
983*600f14f4SXin Li return true;
984*600f14f4SXin Li foo:
985*600f14f4SXin Li fclose(f);
986*600f14f4SXin Li return false;
987*600f14f4SXin Li }
988*600f14f4SXin Li
write_simple_wavex_header(FILE * f,unsigned samplerate,unsigned channels,unsigned bytespersample,unsigned frames)989*600f14f4SXin Li static FLAC__bool write_simple_wavex_header (FILE * f, unsigned samplerate, unsigned channels, unsigned bytespersample, unsigned frames)
990*600f14f4SXin Li {
991*600f14f4SXin Li unsigned datalen = channels * bytespersample * frames ;
992*600f14f4SXin Li
993*600f14f4SXin Li if (fwrite("RIFF", 1, 4, f) != 4)
994*600f14f4SXin Li return false;
995*600f14f4SXin Li if (!write_little_endian_uint32(f, 60 + datalen))
996*600f14f4SXin Li return false;
997*600f14f4SXin Li
998*600f14f4SXin Li if (fwrite("WAVEfmt ", 8, 1, f) != 1)
999*600f14f4SXin Li return false;
1000*600f14f4SXin Li if (!write_little_endian_uint32(f, 40))
1001*600f14f4SXin Li return false;
1002*600f14f4SXin Li
1003*600f14f4SXin Li if(!write_little_endian_uint16(f, 65534)) /* WAVEFORMATEXTENSIBLE tag */
1004*600f14f4SXin Li return false;
1005*600f14f4SXin Li if(!write_little_endian_uint16(f, channels))
1006*600f14f4SXin Li return false;
1007*600f14f4SXin Li if(!write_little_endian_uint32(f, samplerate))
1008*600f14f4SXin Li return false;
1009*600f14f4SXin Li if(!write_little_endian_uint32(f, samplerate * channels * bytespersample))
1010*600f14f4SXin Li return false;
1011*600f14f4SXin Li if(!write_little_endian_uint16(f, channels * bytespersample)) /* block align */
1012*600f14f4SXin Li return false;
1013*600f14f4SXin Li if(!write_little_endian_uint16(f, bytespersample * 8))
1014*600f14f4SXin Li return false;
1015*600f14f4SXin Li
1016*600f14f4SXin Li if(!write_little_endian_uint16(f, 22)) /* cbSize */
1017*600f14f4SXin Li return false;
1018*600f14f4SXin Li if(!write_little_endian_uint16(f, bytespersample * 8)) /* validBitsPerSample */
1019*600f14f4SXin Li return false;
1020*600f14f4SXin Li if(!write_little_endian_uint32(f, 0)) /* channelMask */
1021*600f14f4SXin Li return false;
1022*600f14f4SXin Li /* GUID = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}} */
1023*600f14f4SXin Li if(fwrite("\x01\x00\x00\x00\x00\x00\x10\x00\x80\x00\x00\xaa\x00\x38\x9b\x71", 1, 16, f) != 16)
1024*600f14f4SXin Li return false;
1025*600f14f4SXin Li
1026*600f14f4SXin Li if (fwrite("data", 1, 4, f) != 4)
1027*600f14f4SXin Li return false;
1028*600f14f4SXin Li if (!write_little_endian_uint32(f, datalen))
1029*600f14f4SXin Li return false;
1030*600f14f4SXin Li
1031*600f14f4SXin Li return true;
1032*600f14f4SXin Li }
1033*600f14f4SXin Li
generate_noisy_sine(void)1034*600f14f4SXin Li static FLAC__bool generate_noisy_sine(void)
1035*600f14f4SXin Li {
1036*600f14f4SXin Li FILE *f;
1037*600f14f4SXin Li int64_t randstate = 0x1243456;
1038*600f14f4SXin Li double sample, last_val = 0.0;
1039*600f14f4SXin Li int k;
1040*600f14f4SXin Li int seconds = 300;
1041*600f14f4SXin Li
1042*600f14f4SXin Li if(0 == (f = fopen("noisy-sine.wav", "wb")))
1043*600f14f4SXin Li return false;
1044*600f14f4SXin Li
1045*600f14f4SXin Li if(!write_simple_wavex_header (f, 44100, 1, 2, 44100*seconds))
1046*600f14f4SXin Li goto foo;
1047*600f14f4SXin Li
1048*600f14f4SXin Li for (k = 0 ; k < seconds * 44100 ; k++) {
1049*600f14f4SXin Li /* Obvioulsy not a crypto quality RNG. */
1050*600f14f4SXin Li randstate = 11117 * randstate + 211231;
1051*600f14f4SXin Li randstate = 11117 * randstate + 211231;
1052*600f14f4SXin Li randstate = 11117 * randstate + 211231;
1053*600f14f4SXin Li
1054*600f14f4SXin Li sample = ((int32_t) randstate) / (0x7fffffff * 1.000001);
1055*600f14f4SXin Li sample = 0.2 * sample - 0.9 * last_val;
1056*600f14f4SXin Li
1057*600f14f4SXin Li last_val = sample;
1058*600f14f4SXin Li
1059*600f14f4SXin Li sample += sin (2.0 * k * M_PI * 1.0 / 32.0);
1060*600f14f4SXin Li sample *= 0.4;
1061*600f14f4SXin Li #if !defined _MSC_VER
1062*600f14f4SXin Li write_little_endian_int16(f, lrintf(sample * 32700.0));
1063*600f14f4SXin Li #else
1064*600f14f4SXin Li write_little_endian_int16(f, (FLAC__int16)(sample * 32700.0));
1065*600f14f4SXin Li #endif
1066*600f14f4SXin Li };
1067*600f14f4SXin Li
1068*600f14f4SXin Li fclose(f);
1069*600f14f4SXin Li
1070*600f14f4SXin Li return true;
1071*600f14f4SXin Li foo:
1072*600f14f4SXin Li fclose(f);
1073*600f14f4SXin Li return false;
1074*600f14f4SXin Li }
1075*600f14f4SXin Li
generate_wackywav64s(void)1076*600f14f4SXin Li static FLAC__bool generate_wackywav64s(void)
1077*600f14f4SXin Li {
1078*600f14f4SXin Li FILE *f;
1079*600f14f4SXin Li FLAC__byte wav[] = {
1080*600f14f4SXin Li 0x72,0x69,0x66,0x66,0x2E,0x91,0xCF,0x11, /* RIFF GUID */
1081*600f14f4SXin Li 0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00,
1082*600f14f4SXin Li 152, 0, 0, 0, 0, 0, 0, 0,
1083*600f14f4SXin Li 0x77,0x61,0x76,0x65,0xF3,0xAC,0xD3,0x11, /* WAVE GUID */
1084*600f14f4SXin Li 0x8C,0xD1,0x00,0xC0,0x4F,0x8E,0xDB,0x8A,
1085*600f14f4SXin Li 0x6A,0x75,0x6E,0x6B,0xF3,0xAC,0xD3,0x11, /* junk GUID */
1086*600f14f4SXin Li 0x8C,0xD1,0x00,0xC0,0x4F,0x8E,0xDB,0x8A,
1087*600f14f4SXin Li 32, 0, 0, 0 , 0, 0, 0, 0,
1088*600f14f4SXin Li 'b', 'l', 'a', 'h', 'b', 'l', 'a', 'h',
1089*600f14f4SXin Li 0x66,0x6D,0x74,0x20,0xF3,0xAC,0xD3,0x11, /* fmt GUID */
1090*600f14f4SXin Li 0x8C,0xD1,0x00,0xC0,0x4F,0x8E,0xDB,0x8A,
1091*600f14f4SXin Li 40, 0, 0, 0 , 0, 0, 0, 0,
1092*600f14f4SXin Li 1, 0, 1, 0,0x44,0xAC, 0, 0,
1093*600f14f4SXin Li 0x88,0x58,0x01, 0, 2, 0, 16, 0,
1094*600f14f4SXin Li 0x64,0x61,0x74,0x61,0xF3,0xAC,0xD3,0x11, /* data GUID */
1095*600f14f4SXin Li 0x8C,0xD1,0x00,0xC0,0x4F,0x8E,0xDB,0x8A,
1096*600f14f4SXin Li 40, 0, 0, 0 , 0, 0, 0, 0,
1097*600f14f4SXin Li 0, 0, 1, 0, 4, 0, 9, 0,
1098*600f14f4SXin Li 16, 0, 25, 0, 36, 0, 49, 0,
1099*600f14f4SXin Li 0x6A,0x75,0x6E,0x6B,0xF3,0xAC,0xD3,0x11, /* junk GUID */
1100*600f14f4SXin Li 0x8C,0xD1,0x00,0xC0,0x4F,0x8E,0xDB,0x8A,
1101*600f14f4SXin Li 32, 0, 0, 0 , 0, 0, 0, 0,
1102*600f14f4SXin Li 'b', 'l', 'a', 'h', 'b', 'l', 'a', 'h'
1103*600f14f4SXin Li };
1104*600f14f4SXin Li
1105*600f14f4SXin Li if(0 == (f = fopen("wacky1.w64", "wb")))
1106*600f14f4SXin Li return false;
1107*600f14f4SXin Li if(fwrite(wav, 1, wav[16], f) < wav[16])
1108*600f14f4SXin Li goto foo;
1109*600f14f4SXin Li fclose(f);
1110*600f14f4SXin Li
1111*600f14f4SXin Li wav[16] += 32;
1112*600f14f4SXin Li if(0 == (f = fopen("wacky2.w64", "wb")))
1113*600f14f4SXin Li return false;
1114*600f14f4SXin Li if(fwrite(wav, 1, wav[16], f) < wav[16])
1115*600f14f4SXin Li goto foo;
1116*600f14f4SXin Li fclose(f);
1117*600f14f4SXin Li
1118*600f14f4SXin Li return true;
1119*600f14f4SXin Li foo:
1120*600f14f4SXin Li fclose(f);
1121*600f14f4SXin Li return false;
1122*600f14f4SXin Li }
1123*600f14f4SXin Li
generate_wackyrf64s(void)1124*600f14f4SXin Li static FLAC__bool generate_wackyrf64s(void)
1125*600f14f4SXin Li {
1126*600f14f4SXin Li FILE *f;
1127*600f14f4SXin Li FLAC__byte wav[] = {
1128*600f14f4SXin Li 'R', 'F', '6', '4', 255, 255, 255, 255,
1129*600f14f4SXin Li 'W', 'A', 'V', 'E', 'd', 's', '6', '4',
1130*600f14f4SXin Li 28, 0, 0, 0, 112, 0, 0, 0,
1131*600f14f4SXin Li 0, 0, 0, 0, 16, 0, 0, 0,
1132*600f14f4SXin Li 0, 0, 0, 0, 8, 0, 0, 0,
1133*600f14f4SXin Li 0, 0, 0, 0, 0, 0, 0, 0,
1134*600f14f4SXin Li 'j', 'u', 'n', 'k',
1135*600f14f4SXin Li 4, 0, 0, 0, 'b', 'l', 'a', 'h',
1136*600f14f4SXin Li 'p', 'a', 'd', ' ', 4, 0, 0, 0,
1137*600f14f4SXin Li 'B', 'L', 'A', 'H', 'f', 'm', 't', ' ',
1138*600f14f4SXin Li 16, 0, 0, 0, 1, 0, 1, 0,
1139*600f14f4SXin Li 0x44,0xAC, 0, 0,0x88,0x58,0x01, 0,
1140*600f14f4SXin Li 2, 0, 16, 0, 'd', 'a', 't', 'a',
1141*600f14f4SXin Li 255, 255, 255, 255, 0, 0, 1, 0,
1142*600f14f4SXin Li 4, 0, 9, 0, 16, 0, 25, 0,
1143*600f14f4SXin Li 36, 0, 49, 0, 'p', 'a', 'd', ' ',
1144*600f14f4SXin Li 4, 0, 0, 0, 'b', 'l', 'a', 'h'
1145*600f14f4SXin Li };
1146*600f14f4SXin Li
1147*600f14f4SXin Li if(0 == (f = fopen("wacky1.rf64", "wb")))
1148*600f14f4SXin Li return false;
1149*600f14f4SXin Li if(fwrite(wav, 1, 120, f) < 120)
1150*600f14f4SXin Li goto foo;
1151*600f14f4SXin Li fclose(f);
1152*600f14f4SXin Li
1153*600f14f4SXin Li wav[20] += 12;
1154*600f14f4SXin Li if(0 == (f = fopen("wacky2.rf64", "wb")))
1155*600f14f4SXin Li return false;
1156*600f14f4SXin Li if(fwrite(wav, 1, 132, f) < 132)
1157*600f14f4SXin Li goto foo;
1158*600f14f4SXin Li fclose(f);
1159*600f14f4SXin Li
1160*600f14f4SXin Li return true;
1161*600f14f4SXin Li foo:
1162*600f14f4SXin Li fclose(f);
1163*600f14f4SXin Li return false;
1164*600f14f4SXin Li }
1165*600f14f4SXin Li
generate_replaygain_tone(unsigned samplerate)1166*600f14f4SXin Li static FLAC__bool generate_replaygain_tone (unsigned samplerate)
1167*600f14f4SXin Li {
1168*600f14f4SXin Li FILE *f;
1169*600f14f4SXin Li char fname [256] ;
1170*600f14f4SXin Li double tone, sample, samplerange;
1171*600f14f4SXin Li int k;
1172*600f14f4SXin Li
1173*600f14f4SXin Li flac_snprintf(fname, sizeof(fname), "rpg-tone-%u.wav", samplerate);
1174*600f14f4SXin Li
1175*600f14f4SXin Li if(0 == (f = fopen(fname, "wb")))
1176*600f14f4SXin Li return false;
1177*600f14f4SXin Li
1178*600f14f4SXin Li if(!write_simple_wavex_header (f, samplerate, 1, 3, 220500))
1179*600f14f4SXin Li goto foo;
1180*600f14f4SXin Li
1181*600f14f4SXin Li
1182*600f14f4SXin Li samplerange = 0x7fffff; /* Largest sample value allowed for a 24 bit PCM file. */
1183*600f14f4SXin Li tone = 1000.0; /* 1 kHz */
1184*600f14f4SXin Li
1185*600f14f4SXin Li for (k = 0 ; k < 5 * 44100 ; k++) {
1186*600f14f4SXin Li sample = sin(2 * M_PI * tone * k / samplerate);
1187*600f14f4SXin Li sample *= samplerange;
1188*600f14f4SXin Li if (!write_little_endian_uint24(f, (FLAC__int32) sample))
1189*600f14f4SXin Li goto foo;
1190*600f14f4SXin Li };
1191*600f14f4SXin Li
1192*600f14f4SXin Li fclose(f);
1193*600f14f4SXin Li
1194*600f14f4SXin Li return true;
1195*600f14f4SXin Li foo:
1196*600f14f4SXin Li fclose(f);
1197*600f14f4SXin Li return false;
1198*600f14f4SXin Li }
1199*600f14f4SXin Li
main(int argc,char * argv[])1200*600f14f4SXin Li int main(int argc, char *argv[])
1201*600f14f4SXin Li {
1202*600f14f4SXin Li FLAC__uint32 test = 1;
1203*600f14f4SXin Li unsigned channels;
1204*600f14f4SXin Li
1205*600f14f4SXin Li int pattern01[] = { 1, -1, 0 };
1206*600f14f4SXin Li int pattern02[] = { 1, 1, -1, 0 };
1207*600f14f4SXin Li int pattern03[] = { 1, -1, -1, 0 };
1208*600f14f4SXin Li int pattern04[] = { 1, -1, 1, -1, 0 };
1209*600f14f4SXin Li int pattern05[] = { 1, -1, -1, 1, 0 };
1210*600f14f4SXin Li int pattern06[] = { 1, -1, 1, 1, -1, 0 };
1211*600f14f4SXin Li int pattern07[] = { 1, -1, -1, 1, -1, 0 };
1212*600f14f4SXin Li
1213*600f14f4SXin Li (void)argc;
1214*600f14f4SXin Li (void)argv;
1215*600f14f4SXin Li is_big_endian_host = (*((FLAC__byte*)(&test)))? false : true;
1216*600f14f4SXin Li
1217*600f14f4SXin Li #if !defined _MSC_VER && !defined __MINGW32__
1218*600f14f4SXin Li {
1219*600f14f4SXin Li struct timeval tv;
1220*600f14f4SXin Li
1221*600f14f4SXin Li if(gettimeofday(&tv, 0) < 0) {
1222*600f14f4SXin Li fprintf(stderr, "WARNING: couldn't seed RNG with time\n");
1223*600f14f4SXin Li tv.tv_usec = 4321;
1224*600f14f4SXin Li }
1225*600f14f4SXin Li srandom(tv.tv_usec);
1226*600f14f4SXin Li }
1227*600f14f4SXin Li #else
1228*600f14f4SXin Li srand((unsigned)time(0));
1229*600f14f4SXin Li #endif
1230*600f14f4SXin Li
1231*600f14f4SXin Li if(!generate_01()) return 1;
1232*600f14f4SXin Li if(!generate_02()) return 1;
1233*600f14f4SXin Li if(!generate_03()) return 1;
1234*600f14f4SXin Li if(!generate_04()) return 1;
1235*600f14f4SXin Li
1236*600f14f4SXin Li if(!generate_fsd8("fsd8-01.raw", pattern01, 100)) return 1;
1237*600f14f4SXin Li if(!generate_fsd8("fsd8-02.raw", pattern02, 100)) return 1;
1238*600f14f4SXin Li if(!generate_fsd8("fsd8-03.raw", pattern03, 100)) return 1;
1239*600f14f4SXin Li if(!generate_fsd8("fsd8-04.raw", pattern04, 100)) return 1;
1240*600f14f4SXin Li if(!generate_fsd8("fsd8-05.raw", pattern05, 100)) return 1;
1241*600f14f4SXin Li if(!generate_fsd8("fsd8-06.raw", pattern06, 100)) return 1;
1242*600f14f4SXin Li if(!generate_fsd8("fsd8-07.raw", pattern07, 100)) return 1;
1243*600f14f4SXin Li
1244*600f14f4SXin Li if(!generate_fsd16("fsd16-01.raw", pattern01, 100)) return 1;
1245*600f14f4SXin Li if(!generate_fsd16("fsd16-02.raw", pattern02, 100)) return 1;
1246*600f14f4SXin Li if(!generate_fsd16("fsd16-03.raw", pattern03, 100)) return 1;
1247*600f14f4SXin Li if(!generate_fsd16("fsd16-04.raw", pattern04, 100)) return 1;
1248*600f14f4SXin Li if(!generate_fsd16("fsd16-05.raw", pattern05, 100)) return 1;
1249*600f14f4SXin Li if(!generate_fsd16("fsd16-06.raw", pattern06, 100)) return 1;
1250*600f14f4SXin Li if(!generate_fsd16("fsd16-07.raw", pattern07, 100)) return 1;
1251*600f14f4SXin Li
1252*600f14f4SXin Li if(!generate_fsd24("fsd24-01.raw", pattern01, 100)) return 1;
1253*600f14f4SXin Li if(!generate_fsd24("fsd24-02.raw", pattern02, 100)) return 1;
1254*600f14f4SXin Li if(!generate_fsd24("fsd24-03.raw", pattern03, 100)) return 1;
1255*600f14f4SXin Li if(!generate_fsd24("fsd24-04.raw", pattern04, 100)) return 1;
1256*600f14f4SXin Li if(!generate_fsd24("fsd24-05.raw", pattern05, 100)) return 1;
1257*600f14f4SXin Li if(!generate_fsd24("fsd24-06.raw", pattern06, 100)) return 1;
1258*600f14f4SXin Li if(!generate_fsd24("fsd24-07.raw", pattern07, 100)) return 1;
1259*600f14f4SXin Li
1260*600f14f4SXin Li if(!generate_fsd32("fsd32-01.raw", pattern01, 100)) return 1;
1261*600f14f4SXin Li if(!generate_fsd32("fsd32-02.raw", pattern02, 100)) return 1;
1262*600f14f4SXin Li if(!generate_fsd32("fsd32-03.raw", pattern03, 100)) return 1;
1263*600f14f4SXin Li if(!generate_fsd32("fsd32-04.raw", pattern04, 100)) return 1;
1264*600f14f4SXin Li if(!generate_fsd32("fsd32-05.raw", pattern05, 100)) return 1;
1265*600f14f4SXin Li if(!generate_fsd32("fsd32-06.raw", pattern06, 100)) return 1;
1266*600f14f4SXin Li if(!generate_fsd32("fsd32-07.raw", pattern07, 100)) return 1;
1267*600f14f4SXin Li
1268*600f14f4SXin Li if(!generate_wbps16("wbps16-01.raw", 1000)) return 1;
1269*600f14f4SXin Li
1270*600f14f4SXin Li if(!generate_sine8_1("sine8-00.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49)) return 1;
1271*600f14f4SXin Li if(!generate_sine8_1("sine8-01.raw", 96000.0, 200000, 441.0, 0.61, 661.5, 0.37)) return 1;
1272*600f14f4SXin Li if(!generate_sine8_1("sine8-02.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49)) return 1;
1273*600f14f4SXin Li if(!generate_sine8_1("sine8-03.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49)) return 1;
1274*600f14f4SXin Li if(!generate_sine8_1("sine8-04.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29)) return 1;
1275*600f14f4SXin Li
1276*600f14f4SXin Li if(!generate_sine8_2("sine8-10.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49, 1.0)) return 1;
1277*600f14f4SXin Li if(!generate_sine8_2("sine8-11.raw", 48000.0, 200000, 441.0, 0.61, 661.5, 0.37, 1.0)) return 1;
1278*600f14f4SXin Li if(!generate_sine8_2("sine8-12.raw", 96000.0, 200000, 441.0, 0.50, 882.0, 0.49, 1.0)) return 1;
1279*600f14f4SXin Li if(!generate_sine8_2("sine8-13.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.0)) return 1;
1280*600f14f4SXin Li if(!generate_sine8_2("sine8-14.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 1.0)) return 1;
1281*600f14f4SXin Li if(!generate_sine8_2("sine8-15.raw", 44100.0, 200000, 441.0, 0.50, 441.0, 0.49, 0.5)) return 1;
1282*600f14f4SXin Li if(!generate_sine8_2("sine8-16.raw", 44100.0, 200000, 441.0, 0.61, 661.5, 0.37, 2.0)) return 1;
1283*600f14f4SXin Li if(!generate_sine8_2("sine8-17.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49, 0.7)) return 1;
1284*600f14f4SXin Li if(!generate_sine8_2("sine8-18.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.3)) return 1;
1285*600f14f4SXin Li if(!generate_sine8_2("sine8-19.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 0.1)) return 1;
1286*600f14f4SXin Li
1287*600f14f4SXin Li if(!generate_sine16_1("sine16-00.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49)) return 1;
1288*600f14f4SXin Li if(!generate_sine16_1("sine16-01.raw", 96000.0, 200000, 441.0, 0.61, 661.5, 0.37)) return 1;
1289*600f14f4SXin Li if(!generate_sine16_1("sine16-02.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49)) return 1;
1290*600f14f4SXin Li if(!generate_sine16_1("sine16-03.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49)) return 1;
1291*600f14f4SXin Li if(!generate_sine16_1("sine16-04.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29)) return 1;
1292*600f14f4SXin Li
1293*600f14f4SXin Li if(!generate_sine16_2("sine16-10.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49, 1.0)) return 1;
1294*600f14f4SXin Li if(!generate_sine16_2("sine16-11.raw", 48000.0, 200000, 441.0, 0.61, 661.5, 0.37, 1.0)) return 1;
1295*600f14f4SXin Li if(!generate_sine16_2("sine16-12.raw", 96000.0, 200000, 441.0, 0.50, 882.0, 0.49, 1.0)) return 1;
1296*600f14f4SXin Li if(!generate_sine16_2("sine16-13.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.0)) return 1;
1297*600f14f4SXin Li if(!generate_sine16_2("sine16-14.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 1.0)) return 1;
1298*600f14f4SXin Li if(!generate_sine16_2("sine16-15.raw", 44100.0, 200000, 441.0, 0.50, 441.0, 0.49, 0.5)) return 1;
1299*600f14f4SXin Li if(!generate_sine16_2("sine16-16.raw", 44100.0, 200000, 441.0, 0.61, 661.5, 0.37, 2.0)) return 1;
1300*600f14f4SXin Li if(!generate_sine16_2("sine16-17.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49, 0.7)) return 1;
1301*600f14f4SXin Li if(!generate_sine16_2("sine16-18.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.3)) return 1;
1302*600f14f4SXin Li if(!generate_sine16_2("sine16-19.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 0.1)) return 1;
1303*600f14f4SXin Li
1304*600f14f4SXin Li if(!generate_sine24_1("sine24-00.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49)) return 1;
1305*600f14f4SXin Li if(!generate_sine24_1("sine24-01.raw", 96000.0, 200000, 441.0, 0.61, 661.5, 0.37)) return 1;
1306*600f14f4SXin Li if(!generate_sine24_1("sine24-02.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49)) return 1;
1307*600f14f4SXin Li if(!generate_sine24_1("sine24-03.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49)) return 1;
1308*600f14f4SXin Li if(!generate_sine24_1("sine24-04.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29)) return 1;
1309*600f14f4SXin Li
1310*600f14f4SXin Li if(!generate_sine24_2("sine24-10.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49, 1.0)) return 1;
1311*600f14f4SXin Li if(!generate_sine24_2("sine24-11.raw", 48000.0, 200000, 441.0, 0.61, 661.5, 0.37, 1.0)) return 1;
1312*600f14f4SXin Li if(!generate_sine24_2("sine24-12.raw", 96000.0, 200000, 441.0, 0.50, 882.0, 0.49, 1.0)) return 1;
1313*600f14f4SXin Li if(!generate_sine24_2("sine24-13.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.0)) return 1;
1314*600f14f4SXin Li if(!generate_sine24_2("sine24-14.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 1.0)) return 1;
1315*600f14f4SXin Li if(!generate_sine24_2("sine24-15.raw", 44100.0, 200000, 441.0, 0.50, 441.0, 0.49, 0.5)) return 1;
1316*600f14f4SXin Li if(!generate_sine24_2("sine24-16.raw", 44100.0, 200000, 441.0, 0.61, 661.5, 0.37, 2.0)) return 1;
1317*600f14f4SXin Li if(!generate_sine24_2("sine24-17.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49, 0.7)) return 1;
1318*600f14f4SXin Li if(!generate_sine24_2("sine24-18.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.3)) return 1;
1319*600f14f4SXin Li if(!generate_sine24_2("sine24-19.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 0.1)) return 1;
1320*600f14f4SXin Li
1321*600f14f4SXin Li if(!generate_sine32_1("sine32-00.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49)) return 1;
1322*600f14f4SXin Li if(!generate_sine32_1("sine32-01.raw", 96000.0, 200000, 441.0, 0.61, 661.5, 0.37)) return 1;
1323*600f14f4SXin Li if(!generate_sine32_1("sine32-02.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49)) return 1;
1324*600f14f4SXin Li if(!generate_sine32_1("sine32-03.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49)) return 1;
1325*600f14f4SXin Li if(!generate_sine32_1("sine32-04.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29)) return 1;
1326*600f14f4SXin Li
1327*600f14f4SXin Li if(!generate_sine32_2("sine32-10.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49, 1.0)) return 1;
1328*600f14f4SXin Li if(!generate_sine32_2("sine32-11.raw", 48000.0, 200000, 441.0, 0.61, 661.5, 0.37, 1.0)) return 1;
1329*600f14f4SXin Li if(!generate_sine32_2("sine32-12.raw", 96000.0, 200000, 441.0, 0.50, 882.0, 0.49, 1.0)) return 1;
1330*600f14f4SXin Li if(!generate_sine32_2("sine32-13.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.0)) return 1;
1331*600f14f4SXin Li if(!generate_sine32_2("sine32-14.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 1.0)) return 1;
1332*600f14f4SXin Li if(!generate_sine32_2("sine32-15.raw", 44100.0, 200000, 441.0, 0.50, 441.0, 0.49, 0.5)) return 1;
1333*600f14f4SXin Li if(!generate_sine32_2("sine32-16.raw", 44100.0, 200000, 441.0, 0.61, 661.5, 0.37, 2.0)) return 1;
1334*600f14f4SXin Li if(!generate_sine32_2("sine32-17.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49, 0.7)) return 1;
1335*600f14f4SXin Li if(!generate_sine32_2("sine32-18.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.3)) return 1;
1336*600f14f4SXin Li if(!generate_sine32_2("sine32-19.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 0.1)) return 1;
1337*600f14f4SXin Li
1338*600f14f4SXin Li if(!generate_replaygain_tone(8000)) return 1;
1339*600f14f4SXin Li if(!generate_replaygain_tone(11025)) return 1;
1340*600f14f4SXin Li if(!generate_replaygain_tone(12000)) return 1;
1341*600f14f4SXin Li if(!generate_replaygain_tone(16000)) return 1;
1342*600f14f4SXin Li if(!generate_replaygain_tone(18900)) return 1;
1343*600f14f4SXin Li if(!generate_replaygain_tone(22050)) return 1;
1344*600f14f4SXin Li if(!generate_replaygain_tone(24000)) return 1;
1345*600f14f4SXin Li if(!generate_replaygain_tone(28000)) return 1;
1346*600f14f4SXin Li if(!generate_replaygain_tone(32000)) return 1;
1347*600f14f4SXin Li if(!generate_replaygain_tone(36000)) return 1;
1348*600f14f4SXin Li if(!generate_replaygain_tone(37800)) return 1;
1349*600f14f4SXin Li if(!generate_replaygain_tone(44100)) return 1;
1350*600f14f4SXin Li if(!generate_replaygain_tone(48000)) return 1;
1351*600f14f4SXin Li if(!generate_replaygain_tone(96000)) return 1;
1352*600f14f4SXin Li if(!generate_replaygain_tone(192000)) return 1;
1353*600f14f4SXin Li
1354*600f14f4SXin Li /* WATCHOUT: the size of noise.raw is hardcoded into test/test_flac.sh */
1355*600f14f4SXin Li if(!generate_noise("noise.raw", 65536 * 8 * 3)) return 1;
1356*600f14f4SXin Li if(!generate_noise("noise8m32.raw", 32)) return 1;
1357*600f14f4SXin Li if(!generate_wackywavs()) return 1;
1358*600f14f4SXin Li if(!generate_wackywav64s()) return 1;
1359*600f14f4SXin Li if(!generate_wackyrf64s()) return 1;
1360*600f14f4SXin Li if(!generate_noisy_sine()) return 1;
1361*600f14f4SXin Li for(channels = 1; channels <= 8; channels *= 2) {
1362*600f14f4SXin Li unsigned bits_per_sample;
1363*600f14f4SXin Li for(bits_per_sample = 8; bits_per_sample <= 24; bits_per_sample += 4) {
1364*600f14f4SXin Li static const unsigned nsamples[] = { 1, 111, 4777 } ;
1365*600f14f4SXin Li unsigned samples;
1366*600f14f4SXin Li for(samples = 0; samples < sizeof(nsamples)/sizeof(nsamples[0]); samples++) {
1367*600f14f4SXin Li char fn[64];
1368*600f14f4SXin Li
1369*600f14f4SXin Li flac_snprintf(fn, sizeof (fn), "rt-%u-%u-%u.aiff", channels, bits_per_sample, nsamples[samples]);
1370*600f14f4SXin Li if(!generate_aiff(fn, 44100, channels, bits_per_sample, nsamples[samples]))
1371*600f14f4SXin Li return 1;
1372*600f14f4SXin Li
1373*600f14f4SXin Li flac_snprintf(fn, sizeof (fn), "rt-%u-%u-%u.wav", channels, bits_per_sample, nsamples[samples]);
1374*600f14f4SXin Li if(!generate_wav(fn, 44100, channels, bits_per_sample, nsamples[samples], /*strict=*/true, /*flavor=*/0))
1375*600f14f4SXin Li return 1;
1376*600f14f4SXin Li
1377*600f14f4SXin Li flac_snprintf(fn, sizeof (fn), "rt-%u-%u-%u.rf64", channels, bits_per_sample, nsamples[samples]);
1378*600f14f4SXin Li if(!generate_wav(fn, 44100, channels, bits_per_sample, nsamples[samples], /*strict=*/true, /*flavor=*/1))
1379*600f14f4SXin Li return 1;
1380*600f14f4SXin Li
1381*600f14f4SXin Li flac_snprintf(fn, sizeof (fn), "rt-%u-%u-%u.w64", channels, bits_per_sample, nsamples[samples]);
1382*600f14f4SXin Li if(!generate_wav(fn, 44100, channels, bits_per_sample, nsamples[samples], /*strict=*/true, /*flavor=*/2))
1383*600f14f4SXin Li return 1;
1384*600f14f4SXin Li
1385*600f14f4SXin Li if(bits_per_sample % 8 == 0) {
1386*600f14f4SXin Li flac_snprintf(fn, sizeof (fn), "rt-%u-%u-signed-%u.raw", channels, bits_per_sample, nsamples[samples]);
1387*600f14f4SXin Li if(!generate_signed_raw(fn, channels, bits_per_sample/8, nsamples[samples]))
1388*600f14f4SXin Li return 1;
1389*600f14f4SXin Li flac_snprintf(fn, sizeof (fn), "rt-%u-%u-unsigned-%u.raw", channels, bits_per_sample, nsamples[samples]);
1390*600f14f4SXin Li if(!generate_unsigned_raw(fn, channels, bits_per_sample/8, nsamples[samples]))
1391*600f14f4SXin Li return 1;
1392*600f14f4SXin Li }
1393*600f14f4SXin Li }
1394*600f14f4SXin Li }
1395*600f14f4SXin Li }
1396*600f14f4SXin Li
1397*600f14f4SXin Li return 0;
1398*600f14f4SXin Li }
1399