static const char *mode = "w";
#endif
+#if !defined _MSC_VER && !defined __MINGW32__
+#define GET_RANDOM_BYTE (((unsigned)random()) & 0xff)
+#else
+#define GET_RANDOM_BYTE (((unsigned)rand()) & 0xff)
+#endif
+
static FLAC__bool is_big_endian_host;
{
FILE *f;
unsigned b;
-#if !defined _MSC_VER && !defined __MINGW32__
- struct timeval tv;
-
- if(gettimeofday(&tv, 0) < 0) {
- fprintf(stderr, "WARNING: couldn't seed RNG with time\n");
- tv.tv_usec = 4321;
- }
- srandom(tv.tv_usec);
-#else
- srand(time(0));
-#endif
if(0 == (f = fopen(fn, mode)))
return false;
return false;
}
-static FLAC__bool generate_aiff(const char *filename, unsigned sample_rate, unsigned channels, unsigned bytes_per_sample, unsigned samples)
+static FLAC__bool generate_aiff(const char *filename, unsigned sample_rate, unsigned channels, unsigned bps, unsigned samples)
{
- const unsigned true_size = channels * bytes_per_sample * samples;
+ const unsigned true_size = channels * ((bps+7)/8) * samples;
const unsigned padded_size = (true_size + 1) & (~1u);
+ const unsigned shift = 8 - (bps%8);
FILE *f;
unsigned i;
goto foo;
if(!write_big_endian_uint32(f, samples))
goto foo;
- if(!write_big_endian_uint16(f, (FLAC__uint16)(8 * bytes_per_sample)))
+ if(!write_big_endian_uint16(f, (FLAC__uint16)bps))
goto foo;
if(!write_sane_extended(f, sample_rate))
goto foo;
goto foo;
for(i = 0; i < true_size; i++)
- if(fputc(i, f) == EOF)
+ if(fputc(GET_RANDOM_BYTE<<shift, f) == EOF)
goto foo;
for( ; i < padded_size; i++)
if(fputc(0, f) == EOF)
return false;
}
-static FLAC__bool generate_wav(const char *filename, unsigned sample_rate, unsigned channels, unsigned bytes_per_sample, unsigned samples, FLAC__bool strict)
+static FLAC__bool generate_wav(const char *filename, unsigned sample_rate, unsigned channels, unsigned bps, unsigned samples, FLAC__bool strict)
{
- const FLAC__bool waveformatextensible = strict && channels > 2;
- const unsigned true_size = channels * bytes_per_sample * samples;
+ const FLAC__bool waveformatextensible = strict && (channels > 2 || (bps%8));
+ /* ^^^^^^^
+ * (bps%8) allows 24 bps which is technically supposed to be WAVEFORMATEXTENSIBLE but we
+ * write 24bps as WAVEFORMATEX since it's unambiguous and matches how flac writes it
+ */
+ const unsigned true_size = channels * ((bps+7)/8) * samples;
const unsigned padded_size = (true_size + 1) & (~1u);
+ const unsigned shift = (bps%8)? 8 - (bps%8) : 0;
FILE *f;
unsigned i;
goto foo;
if(!write_little_endian_uint32(f, sample_rate))
goto foo;
- if(!write_little_endian_uint32(f, sample_rate * channels * bytes_per_sample))
+ if(!write_little_endian_uint32(f, sample_rate * channels * ((bps+7)/8)))
goto foo;
- if(!write_little_endian_uint16(f, (FLAC__uint16)(channels * bytes_per_sample))) /* block align */
+ if(!write_little_endian_uint16(f, (FLAC__uint16)(channels * ((bps+7)/8)))) /* block align */
goto foo;
- if(!write_little_endian_uint16(f, (FLAC__uint16)(8 * bytes_per_sample)))
+ if(!write_little_endian_uint16(f, (FLAC__uint16)(bps+shift)))
goto foo;
if(waveformatextensible) {
if(!write_little_endian_uint16(f, (FLAC__uint16)22)) /* cbSize */
goto foo;
- if(!write_little_endian_uint16(f, (FLAC__uint16)(8 * bytes_per_sample))) /* validBitsPerSample */
+ if(!write_little_endian_uint16(f, (FLAC__uint16)bps)) /* validBitsPerSample */
goto foo;
if(!write_little_endian_uint32(f, 0)) /* channelMask */
goto foo;
goto foo;
for(i = 0; i < true_size; i++)
- if(fputc(i, f) == EOF)
+ if(fputc(GET_RANDOM_BYTE<<shift, f) == EOF)
goto foo;
for( ; i < padded_size; i++)
if(fputc(0, f) == EOF)
(void)argv;
is_big_endian_host = (*((FLAC__byte*)(&test)))? false : true;
+#if !defined _MSC_VER && !defined __MINGW32__
+ struct timeval tv;
+
+ if(gettimeofday(&tv, 0) < 0) {
+ fprintf(stderr, "WARNING: couldn't seed RNG with time\n");
+ tv.tv_usec = 4321;
+ }
+ srandom(tv.tv_usec);
+#else
+ srand(time(0));
+#endif
+
if(!generate_01()) return 1;
if(!generate_02()) return 1;
if(!generate_03()) return 1;
if(!generate_noise("noise8m32.raw", 32)) return 1;
if(!generate_wackywavs()) return 1;
for(channels = 1; channels <= 8; channels++) {
- unsigned bytes_per_sample;
- for(bytes_per_sample = 1; bytes_per_sample <= 3; bytes_per_sample++) {
- static const unsigned nsamples[] = { 1, 111, 5555 } ;
+ unsigned bits_per_sample;
+ for(bits_per_sample = 4; bits_per_sample <= 24; bits_per_sample++) {
+ static const unsigned nsamples[] = { 1, 111, 4777 } ;
unsigned samples;
for(samples = 0; samples < sizeof(nsamples)/sizeof(nsamples[0]); samples++) {
char fn[64];
- sprintf(fn, "rt-%u-%u-%u.aiff", channels, bytes_per_sample, nsamples[samples]);
- if(!generate_aiff(fn, 44100, channels, bytes_per_sample, nsamples[samples]))
+ sprintf(fn, "rt-%u-%u-%u.aiff", channels, bits_per_sample, nsamples[samples]);
+ if(!generate_aiff(fn, 44100, channels, bits_per_sample, nsamples[samples]))
return 1;
- sprintf(fn, "rt-%u-%u-%u.raw", channels, bytes_per_sample, nsamples[samples]);
- if(!generate_noise(fn, channels * bytes_per_sample * nsamples[samples]))
+ sprintf(fn, "rt-%u-%u-%u.wav", channels, bits_per_sample, nsamples[samples]);
+ if(!generate_wav(fn, 44100, channels, bits_per_sample, nsamples[samples], /*strict=*/true))
return 1;
- sprintf(fn, "rt-%u-%u-%u.wav", channels, bytes_per_sample, nsamples[samples]);
- if(!generate_wav(fn, 44100, channels, bytes_per_sample, nsamples[samples], /*strict=*/true))
- return 1;
+ if(bits_per_sample % 8 == 0) {
+ sprintf(fn, "rt-%u-%u-%u.raw", channels, bits_per_sample, nsamples[samples]);
+ if(!generate_noise(fn, channels * bits_per_sample/8 * nsamples[samples]))
+ return 1;
+ }
}
}
}
{
f="$1"
channels=`echo $f | awk -F- '{print $2}'`
- bytes_per_sample=`echo $f | awk -F- '{print $3}'`
- bps=`expr $bytes_per_sample '*' 8`
+ bps=`echo $f | awk -F- '{print $3}'`
echo -n "round-trip test ($f) encode... "
- run_flac $SILENT --force --verify --force-raw-format --endian=little --sign=signed --sample-rate=44100 --bps=$bps --channels=$channels $f -o rt.flac || die "ERROR"
+ run_flac $SILENT --force --verify --force-raw-format --endian=little --sign=signed --sample-rate=44100 --bps=$bps --channels=$channels --lax -o rt.flac $f || die "ERROR"
echo -n "decode... "
run_flac $SILENT --force --decode --force-raw-format --endian=little --sign=signed -o rt.raw rt.flac || die "ERROR"
echo -n "compare... "
{
f="$1"
echo -n "round-trip test ($f) encode... "
- run_flac $SILENT --force --verify --channel-map=none $f -o rt.flac || die "ERROR"
+ run_flac $SILENT --force --verify --channel-map=none --lax -o rt.flac $f || die "ERROR"
echo -n "decode... "
run_flac $SILENT --force --decode --channel-map=none -o rt.wav rt.flac || die "ERROR"
echo -n "compare... "
{
f="$1"
echo -n "round-trip test ($f) encode... "
- run_flac $SILENT --force --verify --channel-map=none $f -o rt.flac || die "ERROR"
+ run_flac $SILENT --force --verify --channel-map=none --lax -o rt.flac $f || die "ERROR"
echo -n "decode... "
run_flac $SILENT --force --decode --channel-map=none -o rt.aiff rt.flac || die "ERROR"
echo -n "compare... "
{
f="$1"
echo -n "round-trip test ($f->flac->flac->wav) encode... "
- run_flac $SILENT --force --verify --channel-map=none $f -o rt.flac || die "ERROR"
+ run_flac $SILENT --force --verify --channel-map=none --lax -o rt.flac $f || die "ERROR"
echo -n "re-encode... "
- run_flac $SILENT --force --verify -o rt2.flac rt.flac || die "ERROR"
+ run_flac $SILENT --force --verify --lax -o rt2.flac rt.flac || die "ERROR"
echo -n "decode... "
run_flac $SILENT --force --decode --channel-map=none -o rt.wav rt2.flac || die "ERROR"
echo -n "compare... "