1 /* test_streams - Simple test pattern generator
2 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007,2008,2009 Josh Coalson
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 #include "share/compat.h"
27 #if defined _MSC_VER || defined __MINGW32__
32 #include "FLAC/assert.h"
33 #include "FLAC/ordinals.h"
34 #include "share/compat.h"
37 /* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */
38 #define M_PI 3.14159265358979323846
41 #if !defined _MSC_VER && !defined __MINGW32__
42 #define GET_RANDOM_BYTE (((unsigned)random()) & 0xff)
44 #define GET_RANDOM_BYTE (((unsigned)rand()) & 0xff)
47 static FLAC__bool is_big_endian_host
;
50 static FLAC__bool
write_little_endian(FILE *f
, FLAC__int32 x
, size_t bytes
)
53 if(fputc(x
, f
) == EOF
)
61 static FLAC__bool
write_little_endian_uint16(FILE *f
, FLAC__uint16 x
)
65 fputc(x
>> 8, f
) != EOF
69 static FLAC__bool
write_little_endian_int16(FILE *f
, FLAC__int16 x
)
71 return write_little_endian_uint16(f
, (FLAC__uint16
)x
);
74 static FLAC__bool
write_little_endian_uint24(FILE *f
, FLAC__uint32 x
)
78 fputc(x
>> 8, f
) != EOF
&&
79 fputc(x
>> 16, f
) != EOF
83 static FLAC__bool
write_little_endian_int24(FILE *f
, FLAC__int32 x
)
85 return write_little_endian_uint24(f
, (FLAC__uint32
)x
);
88 static FLAC__bool
write_little_endian_uint32(FILE *f
, FLAC__uint32 x
)
92 fputc(x
>> 8, f
) != EOF
&&
93 fputc(x
>> 16, f
) != EOF
&&
94 fputc(x
>> 24, f
) != EOF
99 /* @@@ not used (yet) */
100 static FLAC__bool
write_little_endian_int32(FILE *f
, FLAC__int32 x
)
102 return write_little_endian_uint32(f
, (FLAC__uint32
)x
);
106 static FLAC__bool
write_little_endian_uint64(FILE *f
, FLAC__uint64 x
)
109 fputc(x
, f
) != EOF
&&
110 fputc(x
>> 8, f
) != EOF
&&
111 fputc(x
>> 16, f
) != EOF
&&
112 fputc(x
>> 24, f
) != EOF
&&
113 fputc(x
>> 32, f
) != EOF
&&
114 fputc(x
>> 40, f
) != EOF
&&
115 fputc(x
>> 48, f
) != EOF
&&
116 fputc(x
>> 56, f
) != EOF
120 static FLAC__bool
write_big_endian(FILE *f
, FLAC__int32 x
, size_t bytes
)
125 if(fputc(x
>>24, f
) == EOF
)
133 static FLAC__bool
write_big_endian_uint16(FILE *f
, FLAC__uint16 x
)
136 fputc(x
>> 8, f
) != EOF
&&
142 /* @@@ not used (yet) */
143 static FLAC__bool
write_big_endian_int16(FILE *f
, FLAC__int16 x
)
145 return write_big_endian_uint16(f
, (FLAC__uint16
)x
);
150 /* @@@ not used (yet) */
151 static FLAC__bool
write_big_endian_uint24(FILE *f
, FLAC__uint32 x
)
154 fputc(x
>> 16, f
) != EOF
&&
155 fputc(x
>> 8, f
) != EOF
&&
162 /* @@@ not used (yet) */
163 static FLAC__bool
write_big_endian_int24(FILE *f
, FLAC__int32 x
)
165 return write_big_endian_uint24(f
, (FLAC__uint32
)x
);
169 static FLAC__bool
write_big_endian_uint32(FILE *f
, FLAC__uint32 x
)
172 fputc(x
>> 24, f
) != EOF
&&
173 fputc(x
>> 16, f
) != EOF
&&
174 fputc(x
>> 8, f
) != EOF
&&
180 /* @@@ not used (yet) */
181 static FLAC__bool
write_big_endian_int32(FILE *f
, FLAC__int32 x
)
183 return write_big_endian_uint32(f
, (FLAC__uint32
)x
);
187 static FLAC__bool
write_sane_extended(FILE *f
, unsigned val
)
188 /* Write to 'f' a SANE extended representation of 'val'. Return false if
189 * the write succeeds; return true otherwise.
191 * SANE extended is an 80-bit IEEE-754 representation with sign bit, 15 bits
192 * of exponent, and 64 bits of significand (mantissa). Unlike most IEEE-754
193 * representations, it does not imply a 1 above the MSB of the significand.
199 unsigned int shift
, exponent
;
201 FLAC__ASSERT(val
!=0U); /* handling 0 would require a special case */
203 for(shift
= 0U; (val
>>(31-shift
))==0U; ++shift
)
206 exponent
= 63U-(shift
+32U); /* add 32 for unused second word */
208 if(!write_big_endian_uint16(f
, (FLAC__uint16
)(exponent
+0x3FFF)))
210 if(!write_big_endian_uint32(f
, val
))
212 if(!write_big_endian_uint32(f
, 0)) /* unused second word */
218 /* a mono one-sample 16bps stream */
219 static FLAC__bool
generate_01(void)
222 FLAC__int16 x
= -32768;
224 if(0 == (f
= flac_fopen("test01.raw", "wb")))
227 if(!write_little_endian_int16(f
, x
))
237 /* a stereo one-sample 16bps stream */
238 static FLAC__bool
generate_02(void)
241 FLAC__int16 xl
= -32768, xr
= 32767;
243 if(0 == (f
= flac_fopen("test02.raw", "wb")))
246 if(!write_little_endian_int16(f
, xl
))
248 if(!write_little_endian_int16(f
, xr
))
258 /* a mono five-sample 16bps stream */
259 static FLAC__bool
generate_03(void)
262 FLAC__int16 x
[] = { -25, 0, 25, 50, 100 };
265 if(0 == (f
= flac_fopen("test03.raw", "wb")))
268 for(i
= 0; i
< 5; i
++)
269 if(!write_little_endian_int16(f
, x
[i
]))
279 /* a stereo five-sample 16bps stream */
280 static FLAC__bool
generate_04(void)
283 FLAC__int16 x
[] = { -25, 500, 0, 400, 25, 300, 50, 200, 100, 100 };
286 if(0 == (f
= flac_fopen("test04.raw", "wb")))
289 for(i
= 0; i
< 10; i
++)
290 if(!write_little_endian_int16(f
, x
[i
]))
300 /* a mono full-scale deflection 8bps stream */
301 static FLAC__bool
generate_fsd8(const char *fn
, const int pattern
[], unsigned reps
)
306 FLAC__ASSERT(pattern
!= 0);
308 if(0 == (f
= flac_fopen(fn
, "wb")))
311 for(rep
= 0; rep
< reps
; rep
++) {
312 for(p
= 0; pattern
[p
]; p
++) {
313 signed char x
= pattern
[p
] > 0? 127 : -128;
314 if(fwrite(&x
, sizeof(x
), 1, f
) < 1)
326 /* a mono full-scale deflection 16bps stream */
327 static FLAC__bool
generate_fsd16(const char *fn
, const int pattern
[], unsigned reps
)
332 FLAC__ASSERT(pattern
!= 0);
334 if(0 == (f
= flac_fopen(fn
, "wb")))
337 for(rep
= 0; rep
< reps
; rep
++) {
338 for(p
= 0; pattern
[p
]; p
++) {
339 FLAC__int16 x
= pattern
[p
] > 0? 32767 : -32768;
340 if(!write_little_endian_int16(f
, x
))
352 /* a stereo wasted-bits-per-sample 16bps stream */
353 static FLAC__bool
generate_wbps16(const char *fn
, unsigned samples
)
358 if(0 == (f
= flac_fopen(fn
, "wb")))
361 for(sample
= 0; sample
< samples
; sample
++) {
362 FLAC__int16 l
= (sample
% 2000) << 2;
363 FLAC__int16 r
= (sample
% 1000) << 3;
364 if(!write_little_endian_int16(f
, l
))
366 if(!write_little_endian_int16(f
, r
))
377 /* a mono full-scale deflection 24bps stream */
378 static FLAC__bool
generate_fsd24(const char *fn
, const int pattern
[], unsigned reps
)
383 FLAC__ASSERT(pattern
!= 0);
385 if(0 == (f
= flac_fopen(fn
, "wb")))
388 for(rep
= 0; rep
< reps
; rep
++) {
389 for(p
= 0; pattern
[p
]; p
++) {
390 FLAC__int32 x
= pattern
[p
] > 0? 8388607 : -8388608;
391 if(!write_little_endian_int24(f
, x
))
403 /* a mono sine-wave 8bps stream */
404 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
)
406 const FLAC__int8 full_scale
= 127;
407 const double delta1
= 2.0 * M_PI
/ ( sample_rate
/ f1
);
408 const double delta2
= 2.0 * M_PI
/ ( sample_rate
/ f2
);
410 double theta1
, theta2
;
413 if(0 == (f
= flac_fopen(fn
, "wb")))
416 for(i
= 0, theta1
= theta2
= 0.0; i
< samples
; i
++, theta1
+= delta1
, theta2
+= delta2
) {
417 double val
= (a1
*sin(theta1
) + a2
*sin(theta2
))*(double)full_scale
;
418 FLAC__int8 v
= (FLAC__int8
)(val
+ 0.5);
419 if(fwrite(&v
, sizeof(v
), 1, f
) < 1)
430 /* a stereo sine-wave 8bps stream */
431 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
)
433 const FLAC__int8 full_scale
= 127;
434 const double delta1
= 2.0 * M_PI
/ ( sample_rate
/ f1
);
435 const double delta2
= 2.0 * M_PI
/ ( sample_rate
/ f2
);
437 double theta1
, theta2
;
440 if(0 == (f
= flac_fopen(fn
, "wb")))
443 for(i
= 0, theta1
= theta2
= 0.0; i
< samples
; i
++, theta1
+= delta1
, theta2
+= delta2
) {
444 double val
= (a1
*sin(theta1
) + a2
*sin(theta2
))*(double)full_scale
;
445 FLAC__int8 v
= (FLAC__int8
)(val
+ 0.5);
446 if(fwrite(&v
, sizeof(v
), 1, f
) < 1)
448 val
= -(a1
*sin(theta1
*fmult
) + a2
*sin(theta2
*fmult
))*(double)full_scale
;
449 v
= (FLAC__int8
)(val
+ 0.5);
450 if(fwrite(&v
, sizeof(v
), 1, f
) < 1)
461 /* a mono sine-wave 16bps stream */
462 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
)
464 const FLAC__int16 full_scale
= 32767;
465 const double delta1
= 2.0 * M_PI
/ ( sample_rate
/ f1
);
466 const double delta2
= 2.0 * M_PI
/ ( sample_rate
/ f2
);
468 double theta1
, theta2
;
471 if(0 == (f
= flac_fopen(fn
, "wb")))
474 for(i
= 0, theta1
= theta2
= 0.0; i
< samples
; i
++, theta1
+= delta1
, theta2
+= delta2
) {
475 double val
= (a1
*sin(theta1
) + a2
*sin(theta2
))*(double)full_scale
;
476 FLAC__int16 v
= (FLAC__int16
)(val
+ 0.5);
477 if(!write_little_endian_int16(f
, v
))
488 /* a stereo sine-wave 16bps stream */
489 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
)
491 const FLAC__int16 full_scale
= 32767;
492 const double delta1
= 2.0 * M_PI
/ ( sample_rate
/ f1
);
493 const double delta2
= 2.0 * M_PI
/ ( sample_rate
/ f2
);
495 double theta1
, theta2
;
498 if(0 == (f
= flac_fopen(fn
, "wb")))
501 for(i
= 0, theta1
= theta2
= 0.0; i
< samples
; i
++, theta1
+= delta1
, theta2
+= delta2
) {
502 double val
= (a1
*sin(theta1
) + a2
*sin(theta2
))*(double)full_scale
;
503 FLAC__int16 v
= (FLAC__int16
)(val
+ 0.5);
504 if(!write_little_endian_int16(f
, v
))
506 val
= -(a1
*sin(theta1
*fmult
) + a2
*sin(theta2
*fmult
))*(double)full_scale
;
507 v
= (FLAC__int16
)(val
+ 0.5);
508 if(!write_little_endian_int16(f
, v
))
519 /* a mono sine-wave 24bps stream */
520 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
)
522 const FLAC__int32 full_scale
= 0x7fffff;
523 const double delta1
= 2.0 * M_PI
/ ( sample_rate
/ f1
);
524 const double delta2
= 2.0 * M_PI
/ ( sample_rate
/ f2
);
526 double theta1
, theta2
;
529 if(0 == (f
= flac_fopen(fn
, "wb")))
532 for(i
= 0, theta1
= theta2
= 0.0; i
< samples
; i
++, theta1
+= delta1
, theta2
+= delta2
) {
533 double val
= (a1
*sin(theta1
) + a2
*sin(theta2
))*(double)full_scale
;
534 FLAC__int32 v
= (FLAC__int32
)(val
+ 0.5);
535 if(!write_little_endian_int24(f
, v
))
546 /* a stereo sine-wave 24bps stream */
547 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
)
549 const FLAC__int32 full_scale
= 0x7fffff;
550 const double delta1
= 2.0 * M_PI
/ ( sample_rate
/ f1
);
551 const double delta2
= 2.0 * M_PI
/ ( sample_rate
/ f2
);
553 double theta1
, theta2
;
556 if(0 == (f
= flac_fopen(fn
, "wb")))
559 for(i
= 0, theta1
= theta2
= 0.0; i
< samples
; i
++, theta1
+= delta1
, theta2
+= delta2
) {
560 double val
= (a1
*sin(theta1
) + a2
*sin(theta2
))*(double)full_scale
;
561 FLAC__int32 v
= (FLAC__int32
)(val
+ 0.5);
562 if(!write_little_endian_int24(f
, v
))
564 val
= -(a1
*sin(theta1
*fmult
) + a2
*sin(theta2
*fmult
))*(double)full_scale
;
565 v
= (FLAC__int32
)(val
+ 0.5);
566 if(!write_little_endian_int24(f
, v
))
577 static FLAC__bool
generate_noise(const char *fn
, unsigned bytes
)
582 if(0 == (f
= flac_fopen(fn
, "wb")))
585 for(b
= 0; b
< bytes
; b
++) {
586 #if !defined _MSC_VER && !defined __MINGW32__
587 FLAC__byte x
= (FLAC__byte
)(((unsigned)random()) & 0xff);
589 FLAC__byte x
= (FLAC__byte
)(((unsigned)rand()) & 0xff);
591 if(fwrite(&x
, sizeof(x
), 1, f
) < 1)
602 static FLAC__bool
generate_raw(const char *filename
, unsigned channels
, unsigned bytes_per_sample
, unsigned samples
)
604 const FLAC__int32 full_scale
= (1 << (bytes_per_sample
*8-1)) - 1;
605 const double f1
= 441.0, a1
= 0.61, f2
= 661.5, a2
= 0.37;
606 const double delta1
= 2.0 * M_PI
/ ( 44100.0 / f1
);
607 const double delta2
= 2.0 * M_PI
/ ( 44100.0 / f2
);
608 double theta1
, theta2
;
612 if(0 == (f
= flac_fopen(filename
, "wb")))
615 for(i
= 0, theta1
= theta2
= 0.0; i
< samples
; i
++, theta1
+= delta1
, theta2
+= delta2
) {
616 for(j
= 0; j
< channels
; j
++) {
617 double val
= (a1
*sin(theta1
) + a2
*sin(theta2
))*(double)full_scale
;
618 FLAC__int32 v
= (FLAC__int32
)(val
+ 0.5) + ((GET_RANDOM_BYTE
>>4)-8);
619 if(!write_little_endian(f
, v
, bytes_per_sample
))
631 static FLAC__bool
generate_aiff(const char *filename
, unsigned sample_rate
, unsigned channels
, unsigned bps
, unsigned samples
)
633 const unsigned bytes_per_sample
= (bps
+7)/8;
634 const unsigned true_size
= channels
* bytes_per_sample
* samples
;
635 const unsigned padded_size
= (true_size
+ 1) & (~1u);
636 const unsigned shift
= (bps
%8)? 8 - (bps
%8) : 0;
637 const FLAC__int32 full_scale
= (1 << (bps
-1)) - 1;
638 const double f1
= 441.0, a1
= 0.61, f2
= 661.5, a2
= 0.37;
639 const double delta1
= 2.0 * M_PI
/ ( sample_rate
/ f1
);
640 const double delta2
= 2.0 * M_PI
/ ( sample_rate
/ f2
);
641 double theta1
, theta2
;
645 if(0 == (f
= flac_fopen(filename
, "wb")))
647 if(fwrite("FORM", 1, 4, f
) < 4)
649 if(!write_big_endian_uint32(f
, padded_size
+ 46))
651 if(fwrite("AIFFCOMM\000\000\000\022", 1, 12, f
) < 12)
653 if(!write_big_endian_uint16(f
, (FLAC__uint16
)channels
))
655 if(!write_big_endian_uint32(f
, samples
))
657 if(!write_big_endian_uint16(f
, (FLAC__uint16
)bps
))
659 if(!write_sane_extended(f
, sample_rate
))
661 if(fwrite("SSND", 1, 4, f
) < 4)
663 if(!write_big_endian_uint32(f
, true_size
+ 8))
665 if(fwrite("\000\000\000\000\000\000\000\000", 1, 8, f
) < 8)
668 for(i
= 0, theta1
= theta2
= 0.0; i
< samples
; i
++, theta1
+= delta1
, theta2
+= delta2
) {
669 for(j
= 0; j
< channels
; j
++) {
670 double val
= (a1
*sin(theta1
) + a2
*sin(theta2
))*(double)full_scale
;
671 FLAC__int32 v
= ((FLAC__int32
)(val
+ 0.5) + ((GET_RANDOM_BYTE
>>4)-8)) << shift
;
672 if(!write_big_endian(f
, v
, bytes_per_sample
))
676 for(i
= true_size
; i
< padded_size
; i
++)
677 if(fputc(0, f
) == EOF
)
687 /* flavor is: 0:WAVE, 1:RF64, 2:WAVE64 */
688 static FLAC__bool
generate_wav(const char *filename
, unsigned sample_rate
, unsigned channels
, unsigned bps
, unsigned samples
, FLAC__bool strict
, int flavor
)
690 const FLAC__bool waveformatextensible
= strict
&& (channels
> 2 || (bps
%8));
692 * (bps%8) allows 24 bps which is technically supposed to be WAVEFORMATEXTENSIBLE but we
693 * write 24bps as WAVEFORMATEX since it's unambiguous and matches how flac writes it
696 const unsigned bytes_per_sample
= (bps
+7)/8;
697 const unsigned shift
= (bps
%8)? 8 - (bps
%8) : 0;
698 /* this rig is not going over 4G so we're ok with 32-bit sizes here */
699 const FLAC__uint32 true_size
= channels
* bytes_per_sample
* samples
;
700 const FLAC__uint32 padded_size
= flavor
<2? (true_size
+ 1) & (~1u) : (true_size
+ 7) & (~7u);
701 const FLAC__int32 full_scale
= (1 << (bps
-1)) - 1;
702 const double f1
= 441.0, a1
= 0.61, f2
= 661.5, a2
= 0.37;
703 const double delta1
= 2.0 * M_PI
/ ( sample_rate
/ f1
);
704 const double delta2
= 2.0 * M_PI
/ ( sample_rate
/ f2
);
705 double theta1
, theta2
;
709 if(0 == (f
= flac_fopen(filename
, "wb")))
711 /* RIFFxxxxWAVE or equivalent: */
714 if(fwrite("RIFF", 1, 4, f
) < 4)
717 /* +8+{40,16} for fmt chunk */
718 /* +8 for data chunk header */
719 if(!write_little_endian_uint32(f
, 4 + 8+(waveformatextensible
?40:16) + 8 + padded_size
))
721 if(fwrite("WAVE", 1, 4, f
) < 4)
725 if(fwrite("RF64", 1, 4, f
) < 4)
727 if(!write_little_endian_uint32(f
, 0xffffffff))
729 if(fwrite("WAVE", 1, 4, f
) < 4)
733 /* RIFF GUID 66666972-912E-11CF-A5D6-28DB04C10000 */
734 if(fwrite("\x72\x69\x66\x66\x2E\x91\xCF\x11\xA5\xD6\x28\xDB\x04\xC1\x00\x00", 1, 16, f
) < 16)
736 /* +(16+8) for RIFF GUID + size */
737 /* +16 for WAVE GUID */
738 /* +16+8+{40,16} for fmt chunk */
739 /* +16+8 for data chunk header */
740 if(!write_little_endian_uint64(f
, (16+8) + 16 + 16+8+(waveformatextensible
?40:16) + (16+8) + padded_size
))
742 /* WAVE GUID 65766177-ACF3-11D3-8CD1-00C04F8EDB8A */
743 if(fwrite("\x77\x61\x76\x65\xF3\xAC\xD3\x11\x8C\xD1\x00\xC0\x4F\x8E\xDB\x8A", 1, 16, f
) < 16)
749 if(flavor
== 1) { /* rf64 */
750 if(fwrite("ds64", 1, 4, f
) < 4)
752 if(!write_little_endian_uint32(f
, 28)) /* ds64 chunk size */
754 if(!write_little_endian_uint64(f
, 36 + padded_size
+ (waveformatextensible
?60:36)))
756 if(!write_little_endian_uint64(f
, true_size
))
758 if(!write_little_endian_uint64(f
, samples
))
760 if(!write_little_endian_uint32(f
, 0)) /* table size */
765 if(fwrite("fmt ", 1, 4, f
) < 4)
768 if(!write_little_endian_uint32(f
, waveformatextensible
?40:16))
772 /* fmt GUID 20746D66-ACF3-11D3-8CD1-00C04F8EDB8A */
773 if(fwrite("\x66\x6D\x74\x20\xF3\xAC\xD3\x11\x8C\xD1\x00\xC0\x4F\x8E\xDB\x8A", 1, 16, f
) < 16)
775 /* chunk size (+16+8 for GUID and size fields) */
776 if(!write_little_endian_uint64(f
, 16+8+(waveformatextensible
?40:16)))
779 if(!write_little_endian_uint16(f
, (FLAC__uint16
)(waveformatextensible
?65534:1)))
781 if(!write_little_endian_uint16(f
, (FLAC__uint16
)channels
))
783 if(!write_little_endian_uint32(f
, sample_rate
))
785 if(!write_little_endian_uint32(f
, sample_rate
* channels
* bytes_per_sample
))
787 if(!write_little_endian_uint16(f
, (FLAC__uint16
)(channels
* bytes_per_sample
))) /* block align */
789 if(!write_little_endian_uint16(f
, (FLAC__uint16
)(bps
+shift
)))
791 if(waveformatextensible
) {
792 if(!write_little_endian_uint16(f
, (FLAC__uint16
)22)) /* cbSize */
794 if(!write_little_endian_uint16(f
, (FLAC__uint16
)bps
)) /* validBitsPerSample */
796 if(!write_little_endian_uint32(f
, 0)) /* channelMask */
798 /* GUID = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}} */
799 if(fwrite("\x01\x00\x00\x00\x00\x00\x10\x00\x80\x00\x00\xaa\x00\x38\x9b\x71", 1, 16, f
) != 16)
804 if(fwrite("data", 1, 4, f
) < 4)
806 if(!write_little_endian_uint32(f
, flavor
==1? 0xffffffff : true_size
))
810 /* data GUID 61746164-ACF3-11D3-8CD1-00C04F8EDB8A */
811 if(fwrite("\x64\x61\x74\x61\xF3\xAC\xD3\x11\x8C\xD1\x00\xC0\x4F\x8E\xDB\x8A", 1, 16, f
) != 16)
813 /* +16+8 for GUID and size fields */
814 if(!write_little_endian_uint64(f
, 16+8 + true_size
))
818 for(i
= 0, theta1
= theta2
= 0.0; i
< samples
; i
++, theta1
+= delta1
, theta2
+= delta2
) {
819 for(j
= 0; j
< channels
; j
++) {
820 double val
= (a1
*sin(theta1
) + a2
*sin(theta2
))*(double)full_scale
;
821 FLAC__int32 v
= ((FLAC__int32
)(val
+ 0.5) + ((GET_RANDOM_BYTE
>>4)-8)) << shift
;
822 if(!write_little_endian(f
, v
, bytes_per_sample
))
826 for(i
= true_size
; i
< padded_size
; i
++)
827 if(fputc(0, f
) == EOF
)
837 static FLAC__bool
generate_wackywavs(void)
841 'R', 'I', 'F', 'F', 76, 0, 0, 0,
842 'W', 'A', 'V', 'E', 'j', 'u', 'n', 'k',
843 4, 0, 0, 0 , 'b', 'l', 'a', 'h',
844 'p', 'a', 'd', ' ', 4, 0, 0, 0,
845 'B', 'L', 'A', 'H', 'f', 'm', 't', ' ',
846 16, 0, 0, 0, 1, 0, 1, 0,
847 0x44,0xAC, 0, 0,0x88,0x58,0x01, 0,
848 2, 0, 16, 0, 'd', 'a', 't', 'a',
849 16, 0, 0, 0, 0, 0, 1, 0,
850 4, 0, 9, 0, 16, 0, 25, 0,
851 36, 0, 49, 0, 'p', 'a', 'd', ' ',
852 4, 0, 0, 0, 'b', 'l', 'a', 'h'
855 if(0 == (f
= flac_fopen("wacky1.wav", "wb")))
857 if(fwrite(wav
, 1, 84, f
) < 84)
862 if(0 == (f
= flac_fopen("wacky2.wav", "wb")))
864 if(fwrite(wav
, 1, 96, f
) < 96)
874 static FLAC__bool
generate_noisy_sine(void)
878 'R', 'I', 'F', 'F', 76, 0, 0, 0,
879 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ',
880 16, 0, 0, 0, 1, 0, 1, 0,
881 0x44,0xAC, 0, 0,0x88,0x58,0x01, 0,
882 2, 0, 16, 0, 'd', 'a', 't', 'a',
885 int32_t randstate
= 0x1243456;
886 double sample
, last_val
= 0.0;
889 if(0 == (f
= flac_fopen("noisy-sine.wav", "wb")))
891 if(fwrite(wav
, 1, sizeof (wav
), f
) < sizeof (wav
))
894 for (k
= 0 ; k
< 5 * 44100 ; k
++) {
895 /* Obvioulsy not a crypto quality RNG. */
896 randstate
= 11117 * randstate
+ 211231;
897 randstate
= 11117 * randstate
+ 211231;
898 randstate
= 11117 * randstate
+ 211231;
900 sample
= randstate
/ (0x7fffffff * 1.000001);
901 sample
= 0.2 * sample
- 0.9 * last_val
;
905 sample
+= sin (2.0 * k
* M_PI
* 1.0 / 32.0);
907 #if !defined _MSC_VER
908 write_little_endian_int16(f
, lrintf(sample
* 32700.0));
910 write_little_endian_int16(f
, (FLAC__int16
)(sample
* 32700.0));
922 static FLAC__bool
generate_wackywav64s(void)
926 0x72,0x69,0x66,0x66,0x2E,0x91,0xCF,0x11, /* RIFF GUID */
927 0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00,
928 152, 0, 0, 0, 0, 0, 0, 0,
929 0x77,0x61,0x76,0x65,0xF3,0xAC,0xD3,0x11, /* WAVE GUID */
930 0x8C,0xD1,0x00,0xC0,0x4F,0x8E,0xDB,0x8A,
931 0x6A,0x75,0x6E,0x6B,0xF3,0xAC,0xD3,0x11, /* junk GUID */
932 0x8C,0xD1,0x00,0xC0,0x4F,0x8E,0xDB,0x8A,
933 32, 0, 0, 0 , 0, 0, 0, 0,
934 'b', 'l', 'a', 'h', 'b', 'l', 'a', 'h',
935 0x66,0x6D,0x74,0x20,0xF3,0xAC,0xD3,0x11, /* fmt GUID */
936 0x8C,0xD1,0x00,0xC0,0x4F,0x8E,0xDB,0x8A,
937 40, 0, 0, 0 , 0, 0, 0, 0,
938 1, 0, 1, 0,0x44,0xAC, 0, 0,
939 0x88,0x58,0x01, 0, 2, 0, 16, 0,
940 0x64,0x61,0x74,0x61,0xF3,0xAC,0xD3,0x11, /* data GUID */
941 0x8C,0xD1,0x00,0xC0,0x4F,0x8E,0xDB,0x8A,
942 40, 0, 0, 0 , 0, 0, 0, 0,
943 0, 0, 1, 0, 4, 0, 9, 0,
944 16, 0, 25, 0, 36, 0, 49, 0,
945 0x6A,0x75,0x6E,0x6B,0xF3,0xAC,0xD3,0x11, /* junk GUID */
946 0x8C,0xD1,0x00,0xC0,0x4F,0x8E,0xDB,0x8A,
947 32, 0, 0, 0 , 0, 0, 0, 0,
948 'b', 'l', 'a', 'h', 'b', 'l', 'a', 'h'
951 if(0 == (f
= flac_fopen("wacky1.w64", "wb")))
953 if(fwrite(wav
, 1, wav
[16], f
) < wav
[16])
958 if(0 == (f
= flac_fopen("wacky2.w64", "wb")))
960 if(fwrite(wav
, 1, wav
[16], f
) < wav
[16])
970 static FLAC__bool
generate_wackyrf64s(void)
974 'R', 'F', '6', '4', 255, 255, 255, 255,
975 'W', 'A', 'V', 'E', 'd', 's', '6', '4',
976 28, 0, 0, 0, 112, 0, 0, 0,
977 0, 0, 0, 0, 16, 0, 0, 0,
978 0, 0, 0, 0, 8, 0, 0, 0,
979 0, 0, 0, 0, 0, 0, 0, 0,
981 4, 0, 0, 0, 'b', 'l', 'a', 'h',
982 'p', 'a', 'd', ' ', 4, 0, 0, 0,
983 'B', 'L', 'A', 'H', 'f', 'm', 't', ' ',
984 16, 0, 0, 0, 1, 0, 1, 0,
985 0x44,0xAC, 0, 0,0x88,0x58,0x01, 0,
986 2, 0, 16, 0, 'd', 'a', 't', 'a',
987 255, 255, 255, 255, 0, 0, 1, 0,
988 4, 0, 9, 0, 16, 0, 25, 0,
989 36, 0, 49, 0, 'p', 'a', 'd', ' ',
990 4, 0, 0, 0, 'b', 'l', 'a', 'h'
993 if(0 == (f
= flac_fopen("wacky1.rf64", "wb")))
995 if(fwrite(wav
, 1, 120, f
) < 120)
1000 if(0 == (f
= flac_fopen("wacky2.rf64", "wb")))
1002 if(fwrite(wav
, 1, 132, f
) < 132)
1012 int main(int argc
, char *argv
[])
1014 FLAC__uint32 test
= 1;
1017 int pattern01
[] = { 1, -1, 0 };
1018 int pattern02
[] = { 1, 1, -1, 0 };
1019 int pattern03
[] = { 1, -1, -1, 0 };
1020 int pattern04
[] = { 1, -1, 1, -1, 0 };
1021 int pattern05
[] = { 1, -1, -1, 1, 0 };
1022 int pattern06
[] = { 1, -1, 1, 1, -1, 0 };
1023 int pattern07
[] = { 1, -1, -1, 1, -1, 0 };
1027 is_big_endian_host
= (*((FLAC__byte
*)(&test
)))? false : true;
1029 #if !defined _MSC_VER && !defined __MINGW32__
1033 if(gettimeofday(&tv
, 0) < 0) {
1034 fprintf(stderr
, "WARNING: couldn't seed RNG with time\n");
1037 srandom(tv
.tv_usec
);
1040 srand((unsigned)time(0));
1043 if(!generate_01()) return 1;
1044 if(!generate_02()) return 1;
1045 if(!generate_03()) return 1;
1046 if(!generate_04()) return 1;
1048 if(!generate_fsd8("fsd8-01.raw", pattern01
, 100)) return 1;
1049 if(!generate_fsd8("fsd8-02.raw", pattern02
, 100)) return 1;
1050 if(!generate_fsd8("fsd8-03.raw", pattern03
, 100)) return 1;
1051 if(!generate_fsd8("fsd8-04.raw", pattern04
, 100)) return 1;
1052 if(!generate_fsd8("fsd8-05.raw", pattern05
, 100)) return 1;
1053 if(!generate_fsd8("fsd8-06.raw", pattern06
, 100)) return 1;
1054 if(!generate_fsd8("fsd8-07.raw", pattern07
, 100)) return 1;
1056 if(!generate_fsd16("fsd16-01.raw", pattern01
, 100)) return 1;
1057 if(!generate_fsd16("fsd16-02.raw", pattern02
, 100)) return 1;
1058 if(!generate_fsd16("fsd16-03.raw", pattern03
, 100)) return 1;
1059 if(!generate_fsd16("fsd16-04.raw", pattern04
, 100)) return 1;
1060 if(!generate_fsd16("fsd16-05.raw", pattern05
, 100)) return 1;
1061 if(!generate_fsd16("fsd16-06.raw", pattern06
, 100)) return 1;
1062 if(!generate_fsd16("fsd16-07.raw", pattern07
, 100)) return 1;
1064 if(!generate_fsd24("fsd24-01.raw", pattern01
, 100)) return 1;
1065 if(!generate_fsd24("fsd24-02.raw", pattern02
, 100)) return 1;
1066 if(!generate_fsd24("fsd24-03.raw", pattern03
, 100)) return 1;
1067 if(!generate_fsd24("fsd24-04.raw", pattern04
, 100)) return 1;
1068 if(!generate_fsd24("fsd24-05.raw", pattern05
, 100)) return 1;
1069 if(!generate_fsd24("fsd24-06.raw", pattern06
, 100)) return 1;
1070 if(!generate_fsd24("fsd24-07.raw", pattern07
, 100)) return 1;
1072 if(!generate_wbps16("wbps16-01.raw", 1000)) return 1;
1074 if(!generate_sine8_1("sine8-00.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49)) return 1;
1075 if(!generate_sine8_1("sine8-01.raw", 96000.0, 200000, 441.0, 0.61, 661.5, 0.37)) return 1;
1076 if(!generate_sine8_1("sine8-02.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49)) return 1;
1077 if(!generate_sine8_1("sine8-03.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49)) return 1;
1078 if(!generate_sine8_1("sine8-04.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29)) return 1;
1080 if(!generate_sine8_2("sine8-10.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49, 1.0)) return 1;
1081 if(!generate_sine8_2("sine8-11.raw", 48000.0, 200000, 441.0, 0.61, 661.5, 0.37, 1.0)) return 1;
1082 if(!generate_sine8_2("sine8-12.raw", 96000.0, 200000, 441.0, 0.50, 882.0, 0.49, 1.0)) return 1;
1083 if(!generate_sine8_2("sine8-13.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.0)) return 1;
1084 if(!generate_sine8_2("sine8-14.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 1.0)) return 1;
1085 if(!generate_sine8_2("sine8-15.raw", 44100.0, 200000, 441.0, 0.50, 441.0, 0.49, 0.5)) return 1;
1086 if(!generate_sine8_2("sine8-16.raw", 44100.0, 200000, 441.0, 0.61, 661.5, 0.37, 2.0)) return 1;
1087 if(!generate_sine8_2("sine8-17.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49, 0.7)) return 1;
1088 if(!generate_sine8_2("sine8-18.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.3)) return 1;
1089 if(!generate_sine8_2("sine8-19.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 0.1)) return 1;
1091 if(!generate_sine16_1("sine16-00.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49)) return 1;
1092 if(!generate_sine16_1("sine16-01.raw", 96000.0, 200000, 441.0, 0.61, 661.5, 0.37)) return 1;
1093 if(!generate_sine16_1("sine16-02.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49)) return 1;
1094 if(!generate_sine16_1("sine16-03.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49)) return 1;
1095 if(!generate_sine16_1("sine16-04.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29)) return 1;
1097 if(!generate_sine16_2("sine16-10.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49, 1.0)) return 1;
1098 if(!generate_sine16_2("sine16-11.raw", 48000.0, 200000, 441.0, 0.61, 661.5, 0.37, 1.0)) return 1;
1099 if(!generate_sine16_2("sine16-12.raw", 96000.0, 200000, 441.0, 0.50, 882.0, 0.49, 1.0)) return 1;
1100 if(!generate_sine16_2("sine16-13.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.0)) return 1;
1101 if(!generate_sine16_2("sine16-14.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 1.0)) return 1;
1102 if(!generate_sine16_2("sine16-15.raw", 44100.0, 200000, 441.0, 0.50, 441.0, 0.49, 0.5)) return 1;
1103 if(!generate_sine16_2("sine16-16.raw", 44100.0, 200000, 441.0, 0.61, 661.5, 0.37, 2.0)) return 1;
1104 if(!generate_sine16_2("sine16-17.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49, 0.7)) return 1;
1105 if(!generate_sine16_2("sine16-18.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.3)) return 1;
1106 if(!generate_sine16_2("sine16-19.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 0.1)) return 1;
1108 if(!generate_sine24_1("sine24-00.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49)) return 1;
1109 if(!generate_sine24_1("sine24-01.raw", 96000.0, 200000, 441.0, 0.61, 661.5, 0.37)) return 1;
1110 if(!generate_sine24_1("sine24-02.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49)) return 1;
1111 if(!generate_sine24_1("sine24-03.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49)) return 1;
1112 if(!generate_sine24_1("sine24-04.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29)) return 1;
1114 if(!generate_sine24_2("sine24-10.raw", 48000.0, 200000, 441.0, 0.50, 441.0, 0.49, 1.0)) return 1;
1115 if(!generate_sine24_2("sine24-11.raw", 48000.0, 200000, 441.0, 0.61, 661.5, 0.37, 1.0)) return 1;
1116 if(!generate_sine24_2("sine24-12.raw", 96000.0, 200000, 441.0, 0.50, 882.0, 0.49, 1.0)) return 1;
1117 if(!generate_sine24_2("sine24-13.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.0)) return 1;
1118 if(!generate_sine24_2("sine24-14.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 1.0)) return 1;
1119 if(!generate_sine24_2("sine24-15.raw", 44100.0, 200000, 441.0, 0.50, 441.0, 0.49, 0.5)) return 1;
1120 if(!generate_sine24_2("sine24-16.raw", 44100.0, 200000, 441.0, 0.61, 661.5, 0.37, 2.0)) return 1;
1121 if(!generate_sine24_2("sine24-17.raw", 44100.0, 200000, 441.0, 0.50, 882.0, 0.49, 0.7)) return 1;
1122 if(!generate_sine24_2("sine24-18.raw", 44100.0, 200000, 441.0, 0.50, 4410.0, 0.49, 1.3)) return 1;
1123 if(!generate_sine24_2("sine24-19.raw", 44100.0, 200000, 8820.0, 0.70, 4410.0, 0.29, 0.1)) return 1;
1125 /* WATCHOUT: the size of noise.raw is hardcoded into test/test_flac.sh */
1126 if(!generate_noise("noise.raw", 65536 * 8 * 3)) return 1;
1127 if(!generate_noise("noise8m32.raw", 32)) return 1;
1128 if(!generate_wackywavs()) return 1;
1129 if(!generate_wackywav64s()) return 1;
1130 if(!generate_wackyrf64s()) return 1;
1131 if(!generate_noisy_sine()) return 1;
1132 for(channels
= 1; channels
<= 8; channels
*= 2) {
1133 unsigned bits_per_sample
;
1134 for(bits_per_sample
= 8; bits_per_sample
<= 24; bits_per_sample
+= 4) {
1135 static const unsigned nsamples
[] = { 1, 111, 4777 } ;
1137 for(samples
= 0; samples
< sizeof(nsamples
)/sizeof(nsamples
[0]); samples
++) {
1140 flac_snprintf(fn
, sizeof (fn
), "rt-%u-%u-%u.aiff", channels
, bits_per_sample
, nsamples
[samples
]);
1141 if(!generate_aiff(fn
, 44100, channels
, bits_per_sample
, nsamples
[samples
]))
1144 flac_snprintf(fn
, sizeof (fn
), "rt-%u-%u-%u.wav", channels
, bits_per_sample
, nsamples
[samples
]);
1145 if(!generate_wav(fn
, 44100, channels
, bits_per_sample
, nsamples
[samples
], /*strict=*/true, /*flavor=*/0))
1148 flac_snprintf(fn
, sizeof (fn
), "rt-%u-%u-%u.rf64", channels
, bits_per_sample
, nsamples
[samples
]);
1149 if(!generate_wav(fn
, 44100, channels
, bits_per_sample
, nsamples
[samples
], /*strict=*/true, /*flavor=*/1))
1152 flac_snprintf(fn
, sizeof (fn
), "rt-%u-%u-%u.w64", channels
, bits_per_sample
, nsamples
[samples
]);
1153 if(!generate_wav(fn
, 44100, channels
, bits_per_sample
, nsamples
[samples
], /*strict=*/true, /*flavor=*/2))
1156 if(bits_per_sample
% 8 == 0) {
1157 flac_snprintf(fn
, sizeof (fn
), "rt-%u-%u-%u.raw", channels
, bits_per_sample
, nsamples
[samples
]);
1158 if(!generate_raw(fn
, channels
, bits_per_sample
/8, nsamples
[samples
]))