1#!/bin/sh
2
3#  FLAC - Free Lossless Audio Codec
4#  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
5#
6#  This file is part the FLAC project.  FLAC is comprised of several
7#  components distributed under difference licenses.  The codec libraries
8#  are distributed under Xiph.Org's BSD-like license (see the file
9#  COPYING.Xiph in this distribution).  All other programs, libraries, and
10#  plugins are distributed under the GPL (see COPYING.GPL).  The documentation
11#  is distributed under the Gnu FDL (see COPYING.FDL).  Each file in the
12#  FLAC distribution contains at the top the terms under which it may be
13#  distributed.
14#
15#  Since this particular file is relevant to all components of FLAC,
16#  it may be distributed under the Xiph.Org license, which is the least
17#  restrictive of those mentioned above.  See the file COPYING.Xiph in this
18#  distribution.
19
20die ()
21{
22	echo $* 1>&2
23	exit 1
24}
25
26dddie="die ERROR: creating files with dd"
27
28if [ x = x"$1" ] ; then
29	BUILD=debug
30else
31	BUILD="$1"
32fi
33
34# change to 'false' to show flac output (useful for debugging)
35if true ; then
36	SILENT='--silent'
37	TOTALLY_SILENT='--totally-silent'
38else
39	SILENT=''
40	TOTALLY_SILENT=''
41fi
42
43LD_LIBRARY_PATH=`pwd`/../src/libFLAC/.libs:$LD_LIBRARY_PATH
44LD_LIBRARY_PATH=`pwd`/../src/share/grabbag/.libs:$LD_LIBRARY_PATH
45LD_LIBRARY_PATH=`pwd`/../src/share/getopt/.libs:$LD_LIBRARY_PATH
46LD_LIBRARY_PATH=`pwd`/../src/share/replaygain_analysis/.libs:$LD_LIBRARY_PATH
47LD_LIBRARY_PATH=`pwd`/../src/share/replaygain_synthesis/.libs:$LD_LIBRARY_PATH
48LD_LIBRARY_PATH=`pwd`/../src/share/utf8/.libs:$LD_LIBRARY_PATH
49LD_LIBRARY_PATH=`pwd`/../obj/$BUILD/lib:$LD_LIBRARY_PATH
50export LD_LIBRARY_PATH
51PATH=`pwd`/../src/flac:$PATH
52PATH=`pwd`/../src/metaflac:$PATH
53PATH=`pwd`/../src/test_streams:$PATH
54PATH=`pwd`/../obj/$BUILD/bin:$PATH
55
56flac --help 1>/dev/null 2>/dev/null || die "ERROR can't find flac executable"
57
58run_flac ()
59{
60	if [ x"$FLAC__TEST_WITH_VALGRIND" = xyes ] ; then
61		echo "valgrind --leak-check=yes --show-reachable=yes --num-callers=100 flac $*" >>test_flac.valgrind.log
62		valgrind --leak-check=yes --show-reachable=yes --num-callers=100 --log-fd=4 flac $* 4>>test_flac.valgrind.log
63	else
64		flac $*
65	fi
66}
67
68run_metaflac ()
69{
70	if [ x"$FLAC__TEST_WITH_VALGRIND" = xyes ] ; then
71		echo "valgrind --leak-check=yes --show-reachable=yes --num-callers=100 metaflac $*" >>test_flac.valgrind.log
72		valgrind --leak-check=yes --show-reachable=yes --num-callers=100 --log-fd=4 metaflac $* 4>>test_flac.valgrind.log
73	else
74		metaflac $*
75	fi
76}
77
78md5cmp ()
79{
80	#n=`( [ -f "$1" ] && [ -f "$2" ] && metaflac --show-md5sum --no-filename "$1" "$2" 2>/dev/null || die "ERROR: comparing FLAC files $1 and $2 by MD5 sum" ) | uniq | wc -l`
81	n=`( [ -f "$1" ] && [ -f "$2" ] && metaflac --show-md5sum --no-filename "$1" "$2" 2>/dev/null || exit 1 ) | uniq | wc -l`
82	[ "$n" != "" ] && [ $n = 1 ]
83}
84
85if [ `env | grep -ic '^comspec='` != 0 ] ; then
86	is_win=yes
87else
88	is_win=no
89fi
90
91echo "Checking for --ogg support in flac..."
92if flac --ogg $SILENT --force-raw-format --endian=little --sign=signed --channels=1 --bps=8 --sample-rate=44100 -c $0 1>/dev/null 2>&1 ; then
93	has_ogg=yes;
94	echo "flac --ogg works"
95else
96	has_ogg=no;
97	echo "flac --ogg doesn't work"
98fi
99
100echo "Generating streams..."
101if [ ! -f wacky1.wav ] ; then
102	test_streams || die "ERROR during test_streams"
103fi
104
105############################################################################
106# test that flac doesn't automatically overwrite files unless -f is used
107############################################################################
108
109echo "Try encoding to a file that exists; should fail"
110cp wacky1.wav exist.wav
111touch exist.flac
112if run_flac $TOTALLY_SILENT -0 exist.wav ; then
113	die "ERROR: it should have failed but didn't"
114else
115	echo "OK, it failed as it should"
116fi
117
118echo "Try encoding with -f to a file that exists; should succeed"
119if run_flac $TOTALLY_SILENT -0 --force exist.wav ; then
120	echo "OK, it succeeded as it should"
121else
122	die "ERROR: it should have succeeded but didn't"
123fi
124
125echo "Try decoding to a file that exists; should fail"
126if run_flac $TOTALLY_SILENT -d exist.flac ; then
127	die "ERROR: it should have failed but didn't"
128else
129	echo "OK, it failed as it should"
130fi
131
132echo "Try decoding with -f to a file that exists; should succeed"
133if run_flac $TOTALLY_SILENT -d -f exist.flac ; then
134	echo "OK, it succeeded as it should"
135else
136	die "ERROR: it should have succeeded but didn't"
137fi
138
139rm -f exist.wav exist.flac
140
141############################################################################
142# test fractional block sizes
143############################################################################
144
145test_fractional ()
146{
147	blocksize=$1
148	samples=$2
149	dd if=noise.raw ibs=4 count=$samples of=pbs.raw 2>/dev/null || $dddie
150	echo -n "fractional block size test (blocksize=$blocksize samples=$samples) encode... "
151	run_flac $SILENT --force --verify --force-raw-format --endian=little --sign=signed --sample-rate=44100 --bps=16 --channels=2 --blocksize=$blocksize --no-padding --lax -o pbs.flac pbs.raw || die "ERROR"
152	echo -n "decode... "
153	run_flac $SILENT --force --decode --force-raw-format --endian=little --sign=signed -o pbs.cmp pbs.flac || die "ERROR"
154	echo -n "compare... "
155	cmp pbs.raw pbs.cmp || die "ERROR: file mismatch"
156	echo "OK"
157	rm -f pbs.raw pbs.flac pbs.cmp
158}
159
160# The special significance of 2048 is it's the # of samples that flac calls
161# FLAC__stream_encoder_process() on.
162#
163# We're trying to make sure the 1-sample overread logic in the stream encoder
164# (used for last-block checking) works; these values probe around common
165# multiples of the flac sample chunk size (2048) and the blocksize.
166for samples in 31 32 33 34 35 2046 2047 2048 2049 2050 ; do
167	test_fractional 33 $samples
168done
169for samples in 254 255 256 257 258 510 511 512 513 514 1022 1023 1024 1025 1026 2046 2047 2048 2049 2050 4094 4095 4096 4097 4098 ; do
170	test_fractional 256 $samples
171done
172for samples in 1022 1023 1024 1025 1026 2046 2047 2048 2049 2050 4094 4095 4096 4097 4098 ; do
173	test_fractional 2048 $samples
174done
175for samples in 1022 1023 1024 1025 1026 2046 2047 2048 2049 2050 4094 4095 4096 4097 4098 4606 4607 4608 4609 4610 8190 8191 8192 8193 8194 16382 16383 16384 16385 16386 ; do
176	test_fractional 4608 $samples
177done
178
179############################################################################
180# basic 'round-trip' tests of various kinds of streams
181############################################################################
182
183rt_test_raw ()
184{
185	f="$1"
186	channels=`echo $f | awk -F- '{print $2}'`
187	bps=`echo $f | awk -F- '{print $3}'`
188	echo -n "round-trip test ($f) encode... "
189	run_flac $SILENT --force --verify --force-raw-format --endian=little --sign=signed --sample-rate=44100 --bps=$bps --channels=$channels --no-padding --lax -o rt.flac $f || die "ERROR"
190	echo -n "decode... "
191	run_flac $SILENT --force --decode --force-raw-format --endian=little --sign=signed -o rt.raw rt.flac || die "ERROR"
192	echo -n "compare... "
193	cmp $f rt.raw || die "ERROR: file mismatch"
194	echo "OK"
195	rm -f rt.flac rt.raw
196}
197
198rt_test_wav ()
199{
200	f="$1"
201	echo -n "round-trip test ($f) encode... "
202	run_flac $SILENT --force --verify --channel-map=none --no-padding --lax -o rt.flac $f || die "ERROR"
203	echo -n "decode... "
204	run_flac $SILENT --force --decode --channel-map=none -o rt.wav rt.flac || die "ERROR"
205	echo -n "compare... "
206	cmp $f rt.wav || die "ERROR: file mismatch"
207	echo "OK"
208	rm -f rt.flac rt.wav
209}
210
211rt_test_aiff ()
212{
213	f="$1"
214	echo -n "round-trip test ($f) encode... "
215	run_flac $SILENT --force --verify --channel-map=none --no-padding --lax -o rt.flac $f || die "ERROR"
216	echo -n "decode... "
217	run_flac $SILENT --force --decode --channel-map=none -o rt.aiff rt.flac || die "ERROR"
218	echo -n "compare... "
219	cmp $f rt.aiff || die "ERROR: file mismatch"
220	echo "OK"
221	rm -f rt.flac rt.aiff
222}
223
224# assumes input file is WAVE; does not check the metadata-preserving features of flac-to-flac; that is checked later
225rt_test_flac ()
226{
227	f="$1"
228	echo -n "round-trip test ($f->flac->flac->wav) encode... "
229	run_flac $SILENT --force --verify --channel-map=none --no-padding --lax -o rt.flac $f || die "ERROR"
230	echo -n "re-encode... "
231	run_flac $SILENT --force --verify --lax -o rt2.flac rt.flac || die "ERROR"
232	echo -n "decode... "
233	run_flac $SILENT --force --decode --channel-map=none -o rt.wav rt2.flac || die "ERROR"
234	echo -n "compare... "
235	cmp $f rt.wav || die "ERROR: file mismatch"
236	echo "OK"
237	rm -f rt.wav rt.flac rt2.flac
238}
239
240# assumes input file is WAVE; does not check the metadata-preserving features of flac-to-flac; that is checked later
241rt_test_ogg_flac ()
242{
243	f="$1"
244	echo -n "round-trip test ($f->oggflac->oggflac->wav) encode... "
245	run_flac $SILENT --force --verify --channel-map=none --no-padding --lax -o rt.oga --ogg $f || die "ERROR"
246	echo -n "re-encode... "
247	run_flac $SILENT --force --verify --lax -o rt2.oga --ogg rt.oga || die "ERROR"
248	echo -n "decode... "
249	run_flac $SILENT --force --decode --channel-map=none -o rt.wav rt2.oga || die "ERROR"
250	echo -n "compare... "
251	cmp $f rt.wav || die "ERROR: file mismatch"
252	echo "OK"
253	rm -f rt.wav rt.oga rt2.oga
254}
255
256for f in rt-*.raw ; do
257	rt_test_raw $f
258done
259for f in rt-*.wav ; do
260	rt_test_wav $f
261done
262for f in rt-*.aiff ; do
263	rt_test_aiff $f
264done
265for f in rt-*.wav ; do
266	rt_test_flac $f
267done
268if [ $has_ogg = yes ] ; then
269	for f in rt-*.wav ; do
270		rt_test_ogg_flac $f
271	done
272fi
273
274############################################################################
275# test --skip and --until
276############################################################################
277
278#
279# first make some chopped-up raw files
280#
281echo "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMN" > master.raw
282dd if=master.raw ibs=1 count=50 of=50c.raw 2>/dev/null || $dddie
283dd if=master.raw ibs=1 skip=10 count=40 of=50c.skip10.raw 2>/dev/null || $dddie
284dd if=master.raw ibs=1 skip=11 count=39 of=50c.skip11.raw 2>/dev/null || $dddie
285dd if=master.raw ibs=1 skip=20 count=30 of=50c.skip20.raw 2>/dev/null || $dddie
286dd if=master.raw ibs=1 skip=30 count=20 of=50c.skip30.raw 2>/dev/null || $dddie
287dd if=master.raw ibs=1 skip=40 count=10 of=50c.skip40.raw 2>/dev/null || $dddie
288dd if=master.raw ibs=1 count=10 of=50c.until10.raw 2>/dev/null || $dddie
289dd if=master.raw ibs=1 count=20 of=50c.until20.raw 2>/dev/null || $dddie
290dd if=master.raw ibs=1 count=30 of=50c.until30.raw 2>/dev/null || $dddie
291dd if=master.raw ibs=1 count=39 of=50c.until39.raw 2>/dev/null || $dddie
292dd if=master.raw ibs=1 count=40 of=50c.until40.raw 2>/dev/null || $dddie
293dd if=master.raw ibs=1 skip=10 count=20 of=50c.skip10.until30.raw 2>/dev/null || $dddie
294dd if=master.raw ibs=1 skip=10 count=29 of=50c.skip10.until39.raw 2>/dev/null || $dddie
295dd if=master.raw ibs=1 skip=10 count=30 of=50c.skip10.until40.raw 2>/dev/null || $dddie
296dd if=master.raw ibs=1 skip=20 count=10 of=50c.skip20.until30.raw 2>/dev/null || $dddie
297dd if=master.raw ibs=1 skip=20 count=20 of=50c.skip20.until40.raw 2>/dev/null || $dddie
298
299wav_eopt="$SILENT --force --verify --no-padding --lax"
300wav_dopt="$SILENT --force --decode"
301
302raw_eopt="$wav_eopt --force-raw-format --endian=big --sign=signed --sample-rate=10 --bps=8 --channels=1"
303raw_dopt="$wav_dopt --force-raw-format --endian=big --sign=signed"
304
305#
306# convert them to WAVE/AIFF/Ogg FLAC files
307#
308convert_to_wav ()
309{
310	run_flac "$2" $1.raw || die "ERROR converting $1.raw to WAVE"
311	run_flac "$3" $1.flac || die "ERROR converting $1.raw to WAVE"
312}
313convert_to_wav 50c "$raw_eopt" "$wav_dopt"
314convert_to_wav 50c.skip10 "$raw_eopt" "$wav_dopt"
315convert_to_wav 50c.skip11 "$raw_eopt" "$wav_dopt"
316convert_to_wav 50c.skip20 "$raw_eopt" "$wav_dopt"
317convert_to_wav 50c.skip30 "$raw_eopt" "$wav_dopt"
318convert_to_wav 50c.skip40 "$raw_eopt" "$wav_dopt"
319convert_to_wav 50c.until10 "$raw_eopt" "$wav_dopt"
320convert_to_wav 50c.until20 "$raw_eopt" "$wav_dopt"
321convert_to_wav 50c.until30 "$raw_eopt" "$wav_dopt"
322convert_to_wav 50c.until39 "$raw_eopt" "$wav_dopt"
323convert_to_wav 50c.until40 "$raw_eopt" "$wav_dopt"
324convert_to_wav 50c.skip10.until30 "$raw_eopt" "$wav_dopt"
325convert_to_wav 50c.skip10.until39 "$raw_eopt" "$wav_dopt"
326convert_to_wav 50c.skip10.until40 "$raw_eopt" "$wav_dopt"
327convert_to_wav 50c.skip20.until30 "$raw_eopt" "$wav_dopt"
328convert_to_wav 50c.skip20.until40 "$raw_eopt" "$wav_dopt"
329
330convert_to_aiff ()
331{
332	run_flac "$2" $1.raw || die "ERROR converting $1.raw to AIFF"
333	run_flac "$3" $1.flac -o $1.aiff || die "ERROR converting $1.raw to AIFF"
334}
335convert_to_aiff 50c "$raw_eopt" "$wav_dopt"
336convert_to_aiff 50c.skip10 "$raw_eopt" "$wav_dopt"
337convert_to_aiff 50c.skip11 "$raw_eopt" "$wav_dopt"
338convert_to_aiff 50c.skip20 "$raw_eopt" "$wav_dopt"
339convert_to_aiff 50c.skip30 "$raw_eopt" "$wav_dopt"
340convert_to_aiff 50c.skip40 "$raw_eopt" "$wav_dopt"
341convert_to_aiff 50c.until10 "$raw_eopt" "$wav_dopt"
342convert_to_aiff 50c.until20 "$raw_eopt" "$wav_dopt"
343convert_to_aiff 50c.until30 "$raw_eopt" "$wav_dopt"
344convert_to_aiff 50c.until39 "$raw_eopt" "$wav_dopt"
345convert_to_aiff 50c.until40 "$raw_eopt" "$wav_dopt"
346convert_to_aiff 50c.skip10.until30 "$raw_eopt" "$wav_dopt"
347convert_to_aiff 50c.skip10.until39 "$raw_eopt" "$wav_dopt"
348convert_to_aiff 50c.skip10.until40 "$raw_eopt" "$wav_dopt"
349convert_to_aiff 50c.skip20.until30 "$raw_eopt" "$wav_dopt"
350convert_to_aiff 50c.skip20.until40 "$raw_eopt" "$wav_dopt"
351
352convert_to_ogg ()
353{
354	run_flac "$wav_eopt" --ogg $1.wav || die "ERROR converting $1.raw to Ogg FLAC"
355}
356if [ $has_ogg = yes ] ; then
357	convert_to_ogg 50c
358	convert_to_ogg 50c.skip10
359	convert_to_ogg 50c.skip11
360	convert_to_ogg 50c.skip20
361	convert_to_ogg 50c.skip30
362	convert_to_ogg 50c.skip40
363	convert_to_ogg 50c.until10
364	convert_to_ogg 50c.until20
365	convert_to_ogg 50c.until30
366	convert_to_ogg 50c.until39
367	convert_to_ogg 50c.until40
368	convert_to_ogg 50c.skip10.until30
369	convert_to_ogg 50c.skip10.until39
370	convert_to_ogg 50c.skip10.until40
371	convert_to_ogg 50c.skip20.until30
372	convert_to_ogg 50c.skip20.until40
373fi
374
375test_skip_until ()
376{
377	in_fmt=$1
378	out_fmt=$2
379
380	[ "$in_fmt" = wav ] || [ "$in_fmt" = aiff ] || [ "$in_fmt" = raw ] || [ "$in_fmt" = flac ] || [ "$in_fmt" = ogg ] || die "ERROR: internal error, bad 'in' format '$in_fmt'"
381
382	[ "$out_fmt" = flac ] || [ "$out_fmt" = ogg ] || die "ERROR: internal error, bad 'out' format '$out_fmt'"
383
384	if [ $in_fmt = raw ] ; then
385		eopt="$raw_eopt"
386		dopt="$raw_dopt"
387	else
388		eopt="$wav_eopt"
389		dopt="$wav_dopt"
390	fi
391
392	if ( [ $in_fmt = flac ] || [ $in_fmt = ogg ] ) && ( [ $out_fmt = flac ] || [ $out_fmt = ogg ] ) ; then
393		CMP=md5cmp
394	else
395		CMP=cmp
396	fi
397
398	if [ $out_fmt = ogg ] ; then
399		eopt="--ogg $eopt"
400	fi
401
402	#
403	# test --skip when encoding
404	#
405
406	desc="($in_fmt<->$out_fmt)"
407
408	echo -n "testing --skip=# (encode) $desc... "
409	run_flac $eopt --skip=10 -o z50c.skip10.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
410	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip10.$in_fmt z50c.skip10.$out_fmt || die "ERROR decoding FLAC file $desc"
411	$CMP 50c.skip10.$in_fmt z50c.skip10.$in_fmt || die "ERROR: file mismatch for --skip=10 (encode) $desc"
412	rm -f z50c.skip10.$out_fmt z50c.skip10.$in_fmt
413	echo OK
414
415	echo -n "testing --skip=mm:ss (encode) $desc... "
416	run_flac $eopt --skip=0:01 -o z50c.skip0:01.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
417	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip0:01.$in_fmt z50c.skip0:01.$out_fmt || die "ERROR decoding FLAC file $desc"
418	$CMP 50c.skip10.$in_fmt z50c.skip0:01.$in_fmt || die "ERROR: file mismatch for --skip=0:01 (encode) $desc"
419	rm -f z50c.skip0:01.$out_fmt z50c.skip0:01.$in_fmt
420	echo OK
421
422	echo -n "testing --skip=mm:ss.sss (encode) $desc... "
423	run_flac $eopt --skip=0:01.1001 -o z50c.skip0:01.1001.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
424	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip0:01.1001.$in_fmt z50c.skip0:01.1001.$out_fmt || die "ERROR decoding FLAC file $desc"
425	$CMP 50c.skip11.$in_fmt z50c.skip0:01.1001.$in_fmt || die "ERROR: file mismatch for --skip=0:01.1001 (encode) $desc"
426	rm -f z50c.skip0:01.1001.$out_fmt z50c.skip0:01.1001.$in_fmt
427	echo OK
428
429	#
430	# test --skip when decoding
431	#
432
433	if [ $in_fmt != $out_fmt ] ; then run_flac $eopt -o z50c.$out_fmt 50c.$in_fmt ; else cp -f 50c.$in_fmt z50c.$out_fmt ; fi || die "ERROR generating FLAC file $desc"
434
435	echo -n "testing --skip=# (decode) $desc... "
436	run_flac $dopt --skip=10 -o z50c.skip10.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
437	$CMP 50c.skip10.$in_fmt z50c.skip10.$in_fmt || die "ERROR: file mismatch for --skip=10 (decode) $desc"
438	rm -f z50c.skip10.$in_fmt
439	echo OK
440
441	echo -n "testing --skip=mm:ss (decode) $desc... "
442	run_flac $dopt --skip=0:01 -o z50c.skip0:01.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
443	$CMP 50c.skip10.$in_fmt z50c.skip0:01.$in_fmt || die "ERROR: file mismatch for --skip=0:01 (decode) $desc"
444	rm -f z50c.skip0:01.$in_fmt
445	echo OK
446
447	echo -n "testing --skip=mm:ss.sss (decode) $desc... "
448	run_flac $dopt --skip=0:01.1001 -o z50c.skip0:01.1001.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
449	$CMP 50c.skip11.$in_fmt z50c.skip0:01.1001.$in_fmt || die "ERROR: file mismatch for --skip=0:01.1001 (decode) $desc"
450	rm -f z50c.skip0:01.1001.$in_fmt
451	echo OK
452
453	rm -f z50c.$out_fmt
454
455	#
456	# test --until when encoding
457	#
458
459	echo -n "testing --until=# (encode) $desc... "
460	run_flac $eopt --until=40 -o z50c.until40.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
461	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.until40.$in_fmt z50c.until40.$out_fmt || die "ERROR decoding FLAC file $desc"
462	$CMP 50c.until40.$in_fmt z50c.until40.$in_fmt || die "ERROR: file mismatch for --until=40 (encode) $desc"
463	rm -f z50c.until40.$out_fmt z50c.until40.$in_fmt
464	echo OK
465
466	echo -n "testing --until=mm:ss (encode) $desc... "
467	run_flac $eopt --until=0:04 -o z50c.until0:04.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
468	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.until0:04.$in_fmt z50c.until0:04.$out_fmt || die "ERROR decoding FLAC file $desc"
469	$CMP 50c.until40.$in_fmt z50c.until0:04.$in_fmt || die "ERROR: file mismatch for --until=0:04 (encode) $desc"
470	rm -f z50c.until0:04.$out_fmt z50c.until0:04.$in_fmt
471	echo OK
472
473	echo -n "testing --until=mm:ss.sss (encode) $desc... "
474	run_flac $eopt --until=0:03.9001 -o z50c.until0:03.9001.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
475	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.until0:03.9001.$in_fmt z50c.until0:03.9001.$out_fmt || die "ERROR decoding FLAC file $desc"
476	$CMP 50c.until39.$in_fmt z50c.until0:03.9001.$in_fmt || die "ERROR: file mismatch for --until=0:03.9001 (encode) $desc"
477	rm -f z50c.until0:03.9001.$out_fmt z50c.until0:03.9001.$in_fmt
478	echo OK
479
480	echo -n "testing --until=-# (encode) $desc... "
481	run_flac $eopt --until=-10 -o z50c.until-10.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
482	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.until-10.$in_fmt z50c.until-10.$out_fmt || die "ERROR decoding FLAC file $desc"
483	$CMP 50c.until40.$in_fmt z50c.until-10.$in_fmt || die "ERROR: file mismatch for --until=-10 (encode) $desc"
484	rm -f z50c.until-10.$out_fmt z50c.until-10.$in_fmt
485	echo OK
486
487	echo -n "testing --until=-mm:ss (encode) $desc... "
488	run_flac $eopt --until=-0:01 -o z50c.until-0:01.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
489	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.until-0:01.$in_fmt z50c.until-0:01.$out_fmt || die "ERROR decoding FLAC file $desc"
490	$CMP 50c.until40.$in_fmt z50c.until-0:01.$in_fmt || die "ERROR: file mismatch for --until=-0:01 (encode) $desc"
491	rm -f z50c.until-0:01.$out_fmt z50c.until-0:01.$in_fmt
492	echo OK
493
494	echo -n "testing --until=-mm:ss.sss (encode) $desc... "
495	run_flac $eopt --until=-0:01.1001 -o z50c.until-0:01.1001.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
496	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.until-0:01.1001.$in_fmt z50c.until-0:01.1001.$out_fmt || die "ERROR decoding FLAC file $desc"
497	$CMP 50c.until39.$in_fmt z50c.until-0:01.1001.$in_fmt || die "ERROR: file mismatch for --until=-0:01.1001 (encode) $desc"
498	rm -f z50c.until-0:01.1001.$out_fmt z50c.until-0:01.1001.$in_fmt
499	echo OK
500
501	#
502	# test --until when decoding
503	#
504
505	if [ $in_fmt != $out_fmt ] ; then run_flac $eopt -o z50c.$out_fmt 50c.$in_fmt ; else cp -f 50c.$in_fmt z50c.$out_fmt ; fi || die "ERROR generating FLAC file $desc"
506
507	echo -n "testing --until=# (decode) $desc... "
508	run_flac $dopt --until=40 -o z50c.until40.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
509	$CMP 50c.until40.$in_fmt z50c.until40.$in_fmt || die "ERROR: file mismatch for --until=40 (decode) $desc"
510	rm -f z50c.until40.$in_fmt
511	echo OK
512
513	echo -n "testing --until=mm:ss (decode) $desc... "
514	run_flac $dopt --until=0:04 -o z50c.until0:04.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
515	$CMP 50c.until40.$in_fmt z50c.until0:04.$in_fmt || die "ERROR: file mismatch for --until=0:04 (decode) $desc"
516	rm -f z50c.until0:04.$in_fmt
517	echo OK
518
519	echo -n "testing --until=mm:ss.sss (decode) $desc... "
520	run_flac $dopt --until=0:03.9001 -o z50c.until0:03.9001.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
521	$CMP 50c.until39.$in_fmt z50c.until0:03.9001.$in_fmt || die "ERROR: file mismatch for --until=0:03.9001 (decode) $desc"
522	rm -f z50c.until0:03.9001.$in_fmt
523	echo OK
524
525	echo -n "testing --until=-# (decode) $desc... "
526	run_flac $dopt --until=-10 -o z50c.until-10.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
527	$CMP 50c.until40.$in_fmt z50c.until-10.$in_fmt || die "ERROR: file mismatch for --until=-10 (decode) $desc"
528	rm -f z50c.until-10.$in_fmt
529	echo OK
530
531	echo -n "testing --until=-mm:ss (decode) $desc... "
532	run_flac $dopt --until=-0:01 -o z50c.until-0:01.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
533	$CMP 50c.until40.$in_fmt z50c.until-0:01.$in_fmt || die "ERROR: file mismatch for --until=-0:01 (decode) $desc"
534	rm -f z50c.until-0:01.$in_fmt
535	echo OK
536
537	echo -n "testing --until=-mm:ss.sss (decode) $desc... "
538	run_flac $dopt --until=-0:01.1001 -o z50c.until-0:01.1001.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
539	$CMP 50c.until39.$in_fmt z50c.until-0:01.1001.$in_fmt || die "ERROR: file mismatch for --until=-0:01.1001 (decode) $desc"
540	rm -f z50c.until-0:01.1001.$in_fmt
541	echo OK
542
543	rm -f z50c.$out_fmt
544
545	#
546	# test --skip and --until when encoding
547	#
548
549	echo -n "testing --skip=10 --until=# (encode) $desc... "
550	run_flac $eopt --skip=10 --until=40 -o z50c.skip10.until40.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
551	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip10.until40.$in_fmt z50c.skip10.until40.$out_fmt || die "ERROR decoding FLAC file $desc"
552	$CMP 50c.skip10.until40.$in_fmt z50c.skip10.until40.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=40 (encode) $desc"
553	rm -f z50c.skip10.until40.$out_fmt z50c.skip10.until40.$in_fmt
554	echo OK
555
556	echo -n "testing --skip=10 --until=mm:ss (encode) $desc... "
557	run_flac $eopt --skip=10 --until=0:04 -o z50c.skip10.until0:04.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
558	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip10.until0:04.$in_fmt z50c.skip10.until0:04.$out_fmt || die "ERROR decoding FLAC file $desc"
559	$CMP 50c.skip10.until40.$in_fmt z50c.skip10.until0:04.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=0:04 (encode) $desc"
560	rm -f z50c.skip10.until0:04.$out_fmt z50c.skip10.until0:04.$in_fmt
561	echo OK
562
563	echo -n "testing --skip=10 --until=mm:ss.sss (encode) $desc... "
564	run_flac $eopt --skip=10 --until=0:03.9001 -o z50c.skip10.until0:03.9001.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
565	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip10.until0:03.9001.$in_fmt z50c.skip10.until0:03.9001.$out_fmt || die "ERROR decoding FLAC file $desc"
566	$CMP 50c.skip10.until39.$in_fmt z50c.skip10.until0:03.9001.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=0:03.9001 (encode) $desc"
567	rm -f z50c.skip10.until0:03.9001.$out_fmt z50c.skip10.until0:03.9001.$in_fmt
568	echo OK
569
570	echo -n "testing --skip=10 --until=+# (encode) $desc... "
571	run_flac $eopt --skip=10 --until=+30 -o z50c.skip10.until+30.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
572	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip10.until+30.$in_fmt z50c.skip10.until+30.$out_fmt || die "ERROR decoding FLAC file $desc"
573	$CMP 50c.skip10.until40.$in_fmt z50c.skip10.until+30.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=+30 (encode) $desc"
574	rm -f z50c.skip10.until+30.$out_fmt z50c.skip10.until+30.$in_fmt
575	echo OK
576
577	echo -n "testing --skip=10 --until=+mm:ss (encode) $desc... "
578	run_flac $eopt --skip=10 --until=+0:03 -o z50c.skip10.until+0:03.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
579	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip10.until+0:03.$in_fmt z50c.skip10.until+0:03.$out_fmt || die "ERROR decoding FLAC file $desc"
580	$CMP 50c.skip10.until40.$in_fmt z50c.skip10.until+0:03.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=+0:03 (encode) $desc"
581	rm -f z50c.skip10.until+0:03.$out_fmt z50c.skip10.until+0:03.$in_fmt
582	echo OK
583
584	echo -n "testing --skip=10 --until=+mm:ss.sss (encode) $desc... "
585	run_flac $eopt --skip=10 --until=+0:02.9001 -o z50c.skip10.until+0:02.9001.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
586	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip10.until+0:02.9001.$in_fmt z50c.skip10.until+0:02.9001.$out_fmt || die "ERROR decoding FLAC file $desc"
587	$CMP 50c.skip10.until39.$in_fmt z50c.skip10.until+0:02.9001.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=+0:02.9001 (encode) $desc"
588	rm -f z50c.skip10.until+0:02.9001.$out_fmt z50c.skip10.until+0:02.9001.$in_fmt
589	echo OK
590
591	echo -n "testing --skip=10 --until=-# (encode) $desc... "
592	run_flac $eopt --skip=10 --until=-10 -o z50c.skip10.until-10.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
593	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip10.until-10.$in_fmt z50c.skip10.until-10.$out_fmt || die "ERROR decoding FLAC file $desc"
594	$CMP 50c.skip10.until40.$in_fmt z50c.skip10.until-10.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=-10 (encode) $desc"
595	rm -f z50c.skip10.until-10.$out_fmt z50c.skip10.until-10.$in_fmt
596	echo OK
597
598	echo -n "testing --skip=10 --until=-mm:ss (encode) $desc... "
599	run_flac $eopt --skip=10 --until=-0:01 -o z50c.skip10.until-0:01.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
600	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip10.until-0:01.$in_fmt z50c.skip10.until-0:01.$out_fmt || die "ERROR decoding FLAC file $desc"
601	$CMP 50c.skip10.until40.$in_fmt z50c.skip10.until-0:01.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=-0:01 (encode) $desc"
602	rm -f z50c.skip10.until-0:01.$out_fmt z50c.skip10.until-0:01.$in_fmt
603	echo OK
604
605	echo -n "testing --skip=10 --until=-mm:ss.sss (encode) $desc... "
606	run_flac $eopt --skip=10 --until=-0:01.1001 -o z50c.skip10.until-0:01.1001.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
607	[ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip10.until-0:01.1001.$in_fmt z50c.skip10.until-0:01.1001.$out_fmt || die "ERROR decoding FLAC file $desc"
608	$CMP 50c.skip10.until39.$in_fmt z50c.skip10.until-0:01.1001.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=-0:01.1001 (encode) $desc"
609	rm -f z50c.skip10.until-0:01.1001.$out_fmt z50c.skip10.until-0:01.1001.$in_fmt
610	echo OK
611
612	#
613	# test --skip and --until when decoding
614	#
615
616	if [ $in_fmt != $out_fmt ] ; then run_flac $eopt -o z50c.$out_fmt 50c.$in_fmt ; else cp -f 50c.$in_fmt z50c.$out_fmt ; fi || die "ERROR generating FLAC file $desc"
617
618
619	echo -n "testing --skip=10 --until=# (decode) $desc... "
620	run_flac $dopt --skip=10 --until=40 -o z50c.skip10.until40.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
621	$CMP 50c.skip10.until40.$in_fmt z50c.skip10.until40.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=40 (decode) $desc"
622	rm -f z50c.skip10.until40.$in_fmt
623	echo OK
624
625	echo -n "testing --skip=10 --until=mm:ss (decode) $desc... "
626	run_flac $dopt --skip=10 --until=0:04 -o z50c.skip10.until0:04.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
627	$CMP 50c.skip10.until40.$in_fmt z50c.skip10.until0:04.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=0:04 (decode) $desc"
628	rm -f z50c.skip10.until0:04.$in_fmt
629	echo OK
630
631	echo -n "testing --skip=10 --until=mm:ss.sss (decode) $desc... "
632	run_flac $dopt --skip=10 --until=0:03.9001 -o z50c.skip10.until0:03.9001.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
633	$CMP 50c.skip10.until39.$in_fmt z50c.skip10.until0:03.9001.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=0:03.9001 (decode) $desc"
634	rm -f z50c.skip10.until0:03.9001.$in_fmt
635	echo OK
636
637	echo -n "testing --skip=10 --until=-# (decode) $desc... "
638	run_flac $dopt --skip=10 --until=-10 -o z50c.skip10.until-10.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
639	$CMP 50c.skip10.until40.$in_fmt z50c.skip10.until-10.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=-10 (decode) $desc"
640	rm -f z50c.skip10.until-10.$in_fmt
641	echo OK
642
643	echo -n "testing --skip=10 --until=-mm:ss (decode) $desc... "
644	run_flac $dopt --skip=10 --until=-0:01 -o z50c.skip10.until-0:01.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
645	$CMP 50c.skip10.until40.$in_fmt z50c.skip10.until-0:01.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=-0:01 (decode) $desc"
646	rm -f z50c.skip10.until-0:01.$in_fmt
647	echo OK
648
649	echo -n "testing --skip=10 --until=-mm:ss.sss (decode) $desc... "
650	run_flac $dopt --skip=10 --until=-0:01.1001 -o z50c.skip10.until-0:01.1001.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
651	$CMP 50c.skip10.until39.$in_fmt z50c.skip10.until-0:01.1001.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=-0:01.1001 (decode) $desc"
652	rm -f z50c.skip10.until-0:01.1001.$in_fmt
653	echo OK
654
655	rm -f z50c.$out_fmt
656}
657
658test_skip_until raw flac
659test_skip_until wav flac
660test_skip_until aiff flac
661test_skip_until flac flac
662#@@@if [ $has_ogg = yes ] ; then
663#@@@	#@@@ doesn't work yet because md5cmp doesn't work because metaflac doesn't work on ogg flac yet
664#@@@	test_skip_until ogg flac
665#@@@fi
666
667if [ $has_ogg = yes ] ; then
668	test_skip_until raw ogg
669	test_skip_until wav ogg
670	test_skip_until aiff ogg
671	#@@@ doesn't work yet because md5cmp doesn't work because metaflac doesn't work on ogg flac yet
672	#@@@test_skip_until flac ogg
673	#@@@test_skip_until ogg ogg
674fi
675
676echo "testing seek extremes:"
677
678run_flac --verify --force $SILENT --no-padding --force-raw-format --endian=big --sign=signed --sample-rate=44100 --bps=16 --channels=2 --blocksize=576 noise.raw || die "ERROR generating FLAC file"
679
680if [ $is_win = no ] ; then
681	total_noise_cdda_samples=`run_metaflac --show-total-samples noise.flac`
682	[ $? = 0 ] || die "ERROR getting total sample count from noise.flac"
683else
684	# some flavors of cygwin don't seem to treat the \x0d as a word
685	# separator, so we hard code it.  we'll just have to fix it later
686	# if we change the way noise.flac is made.
687	total_noise_cdda_samples=393216
688fi
689
690echo -n "testing --skip=0... "
691run_flac $wav_dopt --skip=0 -o z.wav noise.flac || die "ERROR decoding FLAC file noise.flac"
692echo OK
693
694for delta in 2 1 ; do
695	n=`expr $total_noise_cdda_samples - $delta`
696	echo -n "testing --skip=$n... "
697	run_flac $wav_dopt --skip=$n -o z.wav noise.flac || die "ERROR decoding FLAC file noise.flac"
698	echo OK
699done
700
701rm noise.flac z.wav
702
703
704############################################################################
705# test --input-size
706############################################################################
707
708#@@@ cat will not work on old cygwin, need to fix
709if [ $is_win = no ] ; then
710	echo -n "testing --input-size=50 --skip=10... "
711	cat 50c.raw | run_flac $raw_eopt --input-size=50 --skip=10 -o z50c.skip10.flac - || die "ERROR generating FLAC file"
712	run_flac $raw_dopt -o z50c.skip10.raw z50c.skip10.flac || die "ERROR decoding FLAC file"
713	cmp 50c.skip10.raw z50c.skip10.raw || die "ERROR: file mismatch for --input-size=50 --skip=10"
714	rm -f z50c.skip10.raw z50c.skip10.flac
715	echo OK
716fi
717
718
719############################################################################
720# test --cue
721############################################################################
722
723#
724# create the cue sheet
725#
726cuesheet=cuetest.cue
727cat > $cuesheet << EOF
728CATALOG 1234567890123
729FILE "blah" WAVE
730  TRACK 01 AUDIO
731    INDEX 01 0
732    INDEX 02 10
733    INDEX 03 20
734  TRACK 02 AUDIO
735    INDEX 01 30
736  TRACK 04 AUDIO
737    INDEX 01 40
738EOF
739
740test_cue ()
741{
742	in_fmt=$1
743	out_fmt=$2
744
745	[ "$in_fmt" = wav ] || [ "$in_fmt" = aiff ] || [ "$in_fmt" = raw ] || [ "$in_fmt" = flac ] || [ "$in_fmt" = ogg ] || die "ERROR: internal error, bad 'in' format '$in_fmt'"
746
747	[ "$out_fmt" = flac ] || [ "$out_fmt" = ogg ] || die "ERROR: internal error, bad 'out' format '$out_fmt'"
748
749	if [ $in_fmt = raw ] ; then
750		eopt="$raw_eopt"
751		dopt="$raw_dopt"
752	else
753		eopt="$wav_eopt"
754		dopt="$wav_dopt"
755	fi
756
757	if ( [ $in_fmt = flac ] || [ $in_fmt = ogg ] ) && ( [ $out_fmt = flac ] || [ $out_fmt = ogg ] ) ; then
758		CMP=md5cmp
759	else
760		CMP=cmp
761	fi
762
763	if [ $out_fmt = ogg ] ; then
764		eopt="--ogg $eopt"
765	fi
766
767	desc="($in_fmt<->$out_fmt)"
768
769	#
770	# for this we need just need just one FLAC file; --cue only works while decoding
771	#
772	run_flac $eopt --cuesheet=$cuesheet -o z50c.cue.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
773
774	# To make it easy to translate from cue point to sample numbers, the
775	# file has a sample rate of 10 Hz and a cuesheet like so:
776	#
777	# TRACK 01, INDEX 01 : 0:00.00 -> sample 0
778	# TRACK 01, INDEX 02 : 0:01.00 -> sample 10
779	# TRACK 01, INDEX 03 : 0:02.00 -> sample 20
780	# TRACK 02, INDEX 01 : 0:03.00 -> sample 30
781	# TRACK 04, INDEX 01 : 0:04.00 -> sample 40
782	#
783	echo -n "testing --cue=- $desc... "
784	run_flac $dopt -o z50c.cued.$in_fmt --cue=- z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
785	$CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=- $desc"
786	rm -f z50c.cued.$in_fmt
787	echo OK
788
789	echo -n "testing --cue=1.0 $desc... "
790	run_flac $dopt -o z50c.cued.$in_fmt --cue=1.0 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
791	$CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.0 $desc"
792	rm -f z50c.cued.$in_fmt
793	echo OK
794
795	echo -n "testing --cue=1.0- $desc... "
796	run_flac $dopt -o z50c.cued.$in_fmt --cue=1.0- z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
797	$CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.0- $desc"
798	rm -f z50c.cued.$in_fmt
799	echo OK
800
801	echo -n "testing --cue=1.1 $desc... "
802	run_flac $dopt -o z50c.cued.$in_fmt --cue=1.1 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
803	$CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.1 $desc"
804	rm -f z50c.cued.$in_fmt
805	echo OK
806
807	echo -n "testing --cue=1.1- $desc... "
808	run_flac $dopt -o z50c.cued.$in_fmt --cue=1.1- z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
809	$CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.1- $desc"
810	rm -f z50c.cued.$in_fmt
811	echo OK
812
813	echo -n "testing --cue=1.2 $desc... "
814	run_flac $dopt -o z50c.cued.$in_fmt --cue=1.2 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
815	$CMP 50c.skip10.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.2 $desc"
816	rm -f z50c.cued.$in_fmt
817	echo OK
818
819	echo -n "testing --cue=1.2- $desc... "
820	run_flac $dopt -o z50c.cued.$in_fmt --cue=1.2- z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
821	$CMP 50c.skip10.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.2- $desc"
822	rm -f z50c.cued.$in_fmt
823	echo OK
824
825	echo -n "testing --cue=1.4 $desc... "
826	run_flac $dopt -o z50c.cued.$in_fmt --cue=1.4 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
827	$CMP 50c.skip20.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.4 $desc"
828	rm -f z50c.cued.$in_fmt
829	echo OK
830
831	echo -n "testing --cue=1.4- $desc... "
832	run_flac $dopt -o z50c.cued.$in_fmt --cue=1.4- z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
833	$CMP 50c.skip20.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.4- $desc"
834	rm -f z50c.cued.$in_fmt
835	echo OK
836
837	echo -n "testing --cue=-5.0 $desc... "
838	run_flac $dopt -o z50c.cued.$in_fmt --cue=-5.0 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
839	$CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=-5.0 $desc"
840	rm -f z50c.cued.$in_fmt
841	echo OK
842
843	echo -n "testing --cue=-4.1 $desc... "
844	run_flac $dopt -o z50c.cued.$in_fmt --cue=-4.1 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
845	$CMP 50c.until40.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=-4.1 $desc"
846	rm -f z50c.cued.$in_fmt
847	echo OK
848
849	echo -n "testing --cue=-3.1 $desc... "
850	run_flac $dopt -o z50c.cued.$in_fmt --cue=-3.1 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
851	$CMP 50c.until40.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=-3.1 $desc"
852	rm -f z50c.cued.$in_fmt
853	echo OK
854
855	echo -n "testing --cue=-1.4 $desc... "
856	run_flac $dopt -o z50c.cued.$in_fmt --cue=-1.4 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
857	$CMP 50c.until30.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=-1.4 $desc"
858	rm -f z50c.cued.$in_fmt
859	echo OK
860
861	echo -n "testing --cue=1.0-5.0 $desc... "
862	run_flac $dopt -o z50c.cued.$in_fmt --cue=1.0-5.0 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
863	$CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.0-5.0 $desc"
864	rm -f z50c.cued.$in_fmt
865	echo OK
866
867	echo -n "testing --cue=1.1-5.0 $desc... "
868	run_flac $dopt -o z50c.cued.$in_fmt --cue=1.1-5.0 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
869	$CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.1-5.0 $desc"
870	rm -f z50c.cued.$in_fmt
871	echo OK
872
873	echo -n "testing --cue=1.2-4.1 $desc... "
874	run_flac $dopt -o z50c.cued.$in_fmt --cue=1.2-4.1 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
875	$CMP 50c.skip10.until40.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.2-4.1 $desc"
876	rm -f z50c.cued.$in_fmt
877	echo OK
878
879	echo -n "testing --cue=1.4-2.0 $desc... "
880	run_flac $dopt -o z50c.cued.$in_fmt --cue=1.4-2.0 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
881	$CMP 50c.skip20.until30.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.4-2.0 $desc"
882	rm -f z50c.cued.$in_fmt
883	echo OK
884
885	rm -f z50c.cue.$out_fmt
886}
887
888test_cue raw flac
889test_cue wav flac
890test_cue aiff flac
891test_cue flac flac
892#@@@if [ $has_ogg = yes ] ; then
893#@@@	#@@@ doesn't work yet because md5cmp doesn't work because metaflac doesn't work on ogg flac yet
894#@@@	test_cue ogg flac
895#@@@fi
896
897if [ $has_ogg = yes ] ; then
898	test_cue raw ogg
899	test_cue wav ogg
900	test_cue aiff ogg
901	#@@@ doesn't work yet because md5cmp doesn't work because metaflac doesn't work on ogg flac yet
902	#@@@test_cue flac ogg
903	#@@@test_cue ogg ogg
904fi
905
906############################################################################
907# test 'fixup' code that happens when a FLAC file with total_samples == 0
908# in the STREAMINFO block is converted to WAVE or AIFF, requiring the
909# decoder go back and fix up the chunk headers
910############################################################################
911
912echo -n "WAVE fixup test... "
913
914echo -n "prepare... "
915convert_to_wav noise "$raw_eopt" "$wav_dopt" || die "ERROR creating reference WAVE"
916
917echo -n "encode... "
918# the pipe from 'cat' to 'flac' does not work on cygwin because of the EOF/
919# binary-mode stdin problem, so we use an undocumented option to metaflac to
920# set the total sample count to 0
921if [ $is_win = yes ] ; then
922	run_flac $raw_eopt noise.raw -o fixup.flac || die "ERROR generating FLAC file"
923	run_metaflac --set-total-samples=0 fixup.flac 2> /dev/null
924else
925	cat noise.raw | run_flac $raw_eopt - -c > fixup.flac || die "ERROR generating FLAC file"
926fi
927
928echo -n "decode... "
929run_flac $wav_dopt fixup.flac -o fixup.wav || die "ERROR decoding FLAC file"
930
931echo -n "compare... "
932cmp noise.wav fixup.wav || die "ERROR: file mismatch"
933
934echo OK
935rm -f noise.wav fixup.wav fixup.flac
936
937echo -n "AIFF fixup test... "
938
939echo -n "prepare... "
940convert_to_aiff noise "$raw_eopt" "$wav_dopt" || die "ERROR creating reference AIFF"
941
942echo -n "encode... "
943# the pipe from 'cat' to 'flac' does not work on cygwin because of the EOF/
944# binary-mode stdin problem, so we use an undocumented option to metaflac to
945# set the total sample count to 0
946if [ $is_win = yes ] ; then
947	run_flac $raw_eopt noise.raw -o fixup.flac || die "ERROR generating FLAC file"
948	run_metaflac --set-total-samples=0 fixup.flac 2> /dev/null
949else
950	cat noise.raw | run_flac $raw_eopt - -c > fixup.flac || die "ERROR generating FLAC file"
951fi
952
953echo -n "decode... "
954run_flac $wav_dopt fixup.flac -o fixup.aiff || die "ERROR decoding FLAC file"
955
956echo -n "compare... "
957cmp noise.aiff fixup.aiff || die "ERROR: file mismatch"
958
959echo OK
960rm -f noise.aiff fixup.aiff fixup.flac
961
962
963############################################################################
964# multi-file tests
965############################################################################
966
967echo "Generating multiple input files from noise..."
968multifile_format_decode="--endian=big --sign=signed"
969multifile_format_encode="$multifile_format_decode --sample-rate=44100 --bps=16 --channels=2 --no-padding"
970short_noise_cdda_samples=`expr $total_noise_cdda_samples / 8`
971run_flac --verify --force $SILENT --force-raw-format $multifile_format_encode --until=$short_noise_cdda_samples -o shortnoise.flac noise.raw || die "ERROR generating FLAC file"
972run_flac --decode --force $SILENT shortnoise.flac -o shortnoise.raw --force-raw-format $multifile_format_decode || die "ERROR generating RAW file"
973run_flac --decode --force $SILENT shortnoise.flac || die "ERROR generating WAVE file"
974run_flac --decode --force $SILENT shortnoise.flac -o shortnoise.aiff || die "ERROR generating AIFF file"
975cp shortnoise.flac file0.flac
976cp shortnoise.flac file1.flac
977cp shortnoise.flac file2.flac
978rm -f shortnoise.flac
979cp shortnoise.wav file0.wav
980cp shortnoise.wav file1.wav
981cp shortnoise.wav file2.wav
982rm -f shortnoise.wav
983cp shortnoise.aiff file0.aiff
984cp shortnoise.aiff file1.aiff
985cp shortnoise.aiff file2.aiff
986rm -f shortnoise.aiff
987cp shortnoise.raw file0.raw
988cp shortnoise.raw file1.raw
989cp shortnoise.raw file2.raw
990rm -f shortnoise.raw
991# create authoritative sector-aligned files for comparison
992file0_samples=`expr \( $short_noise_cdda_samples / 588 \) \* 588`
993file0_remainder=`expr $short_noise_cdda_samples - $file0_samples`
994file1_samples=`expr \( \( $file0_remainder + $short_noise_cdda_samples \) / 588 \) \* 588`
995file1_remainder=`expr $file0_remainder + $short_noise_cdda_samples - $file1_samples`
996file1_samples=`expr $file1_samples - $file0_remainder`
997file2_samples=`expr \( \( $file1_remainder + $short_noise_cdda_samples \) / 588 \) \* 588`
998file2_remainder=`expr $file1_remainder + $short_noise_cdda_samples - $file2_samples`
999file2_samples=`expr $file2_samples - $file1_remainder`
1000if [ $file2_remainder != '0' ] ; then
1001	file2_samples=`expr $file2_samples + $file2_remainder`
1002	file2_remainder=`expr 588 - $file2_remainder`
1003fi
1004
1005dd if=file0.raw ibs=4 count=$file0_samples of=file0s.raw 2>/dev/null || $dddie
1006dd if=file0.raw ibs=4 count=$file0_remainder of=file1s.raw skip=$file0_samples 2>/dev/null || $dddie
1007dd if=file1.raw ibs=4 count=$file1_samples of=z.raw 2>/dev/null || $dddie
1008cat z.raw >> file1s.raw || die "ERROR: cat-ing sector-aligned files"
1009dd if=file1.raw ibs=4 count=$file1_remainder of=file2s.raw skip=$file1_samples 2>/dev/null || $dddie
1010dd if=file2.raw ibs=4 count=$file2_samples of=z.raw 2>/dev/null || $dddie
1011cat z.raw >> file2s.raw || die "ERROR: cat-ing sector-aligned files"
1012dd if=/dev/zero ibs=4 count=$file2_remainder of=z.raw 2>/dev/null || $dddie
1013cat z.raw >> file2s.raw || die "ERROR: cat-ing sector-aligned files"
1014rm -f z.raw
1015
1016convert_to_wav file0s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned WAVE"
1017convert_to_wav file1s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned WAVE"
1018convert_to_wav file2s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned WAVE"
1019
1020convert_to_aiff file0s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned AIFF"
1021convert_to_aiff file1s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned AIFF"
1022convert_to_aiff file2s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned AIFF"
1023
1024test_multifile ()
1025{
1026	input_type=$1
1027	streamtype=$2
1028	sector_align=$3
1029	encode_options="$4"
1030
1031	extra_encode_options=""
1032	extra_decode_options=""
1033	if [ $input_type = "raw" ] ; then
1034		extra_encode_options="--force-raw-format $multifile_format_encode"
1035		extra_decode_options="--force-raw-format $multifile_format_decode"
1036	else
1037		if [ $input_type = "aiff" ] ; then
1038			extra_decode_options="--force-aiff-format"
1039		fi
1040	fi
1041
1042	if [ $streamtype = ogg ] ; then
1043		suffix=oga
1044		encode_options="$encode_options --ogg"
1045	else
1046		suffix=flac
1047	fi
1048
1049	if [ $sector_align = sector_align ] ; then
1050		encode_options="$encode_options --sector-align"
1051	fi
1052
1053	if [ $input_type = flac ] || [ $input_type = ogg ] ; then
1054		CMP=md5cmp
1055	else
1056		CMP=cmp
1057	fi
1058
1059	for n in 0 1 2 ; do
1060		cp file$n.$input_type file${n}x.$input_type
1061	done
1062	run_flac --force $encode_options $extra_encode_options file0x.$input_type file1x.$input_type file2x.$input_type || die "ERROR"
1063	run_flac --force --decode $extra_decode_options file0x.$suffix file1x.$suffix file2x.$suffix || die "ERROR"
1064	if [ $sector_align != sector_align ] ; then
1065		for n in 0 1 2 ; do
1066			$CMP file$n.$input_type file${n}x.$input_type || die "ERROR: file mismatch on file #$n"
1067		done
1068	else
1069		for n in 0 1 2 ; do
1070			$CMP file${n}s.$input_type file${n}x.$input_type || die "ERROR: file mismatch on file #$n"
1071		done
1072	fi
1073	for n in 0 1 2 ; do
1074		rm -f file${n}x.$suffix file${n}x.$input_type
1075	done
1076}
1077
1078input_types="raw wav aiff flac"
1079#@@@ doesn't work yet because md5cmp doesn't work because metaflac doesn't work on ogg flac yet
1080#@@@if [ $has_ogg = yes ] ; then
1081#@@@	input_types="$input_types ogg"
1082#@@@fi
1083for input_type in $input_types ; do
1084	echo "Testing multiple $input_type files without verify..."
1085	test_multifile $input_type flac no_sector_align ""
1086
1087	echo "Testing multiple $input_type files with verify..."
1088	test_multifile $input_type flac no_sector_align "--verify"
1089
1090	if [ $input_type != flac ] && [ $input_type != ogg ] ; then # --sector-align not supported for FLAC input
1091		echo "Testing multiple $input_type files with --sector-align, without verify..."
1092		test_multifile $input_type flac sector_align ""
1093
1094		echo "Testing multiple $input_type files with --sector-align, with verify..."
1095		test_multifile $input_type flac sector_align "--verify"
1096	fi
1097
1098	if [ $has_ogg = yes ] ; then
1099		echo "Testing multiple $input_type files with --ogg, without verify..."
1100		test_multifile $input_type ogg no_sector_align ""
1101
1102		echo "Testing multiple $input_type files with --ogg, with verify..."
1103		test_multifile $input_type ogg no_sector_align "--verify"
1104
1105		if [ $input_type != flac ] ; then # --sector-align not supported for FLAC input
1106			echo "Testing multiple $input_type files with --ogg and --sector-align, without verify..."
1107			test_multifile $input_type ogg sector_align ""
1108
1109			echo "Testing multiple $input_type files with --ogg and --sector-align, with verify..."
1110			test_multifile $input_type ogg sector_align "--verify"
1111		fi
1112
1113		echo "Testing multiple $input_type files with --ogg and --serial-number, with verify..."
1114		test_multifile $input_type ogg no_sector_align "--serial-number=321 --verify"
1115	fi
1116done
1117
1118
1119############################################################################
1120# test the metadata-handling properties of flac-to-flac encoding
1121############################################################################
1122
1123echo "Testing the metadata-handling properties of flac-to-flac encoding..."
1124
1125testdir="flac-to-flac-metadata-test-files"
1126filter ()
1127{
1128	# minor danger, changing vendor strings might change the length of the
1129	# VORBIS_COMMENT block, but if we add "^  length: " to the patterns,
1130	# we lose info about PADDING size that we need
1131	grep -Ev '^  vendor string: |^  m..imum .....size: ' | sed -e 's/, stream_offset.*//'
1132}
1133flac2flac ()
1134{
1135	file="$1"
1136	case="$2"
1137	args="$3"
1138	expect="$case-expect.meta"
1139	echo -n "$case... "
1140	run_flac $SILENT -f -o out.flac $args $file || die "ERROR encoding FLAC file"
1141	run_metaflac --list out.flac | filter > out.meta || die "ERROR listing metadata of output FLAC file"
1142	diff -q -w $expect out.meta 2>/dev/null || die "ERROR: metadata does not match expected $expect"
1143	echo OK
1144}
1145
1146#filter=', stream_offset.*|^  vendor string: |^  length: |^  m..imum .....size: '
1147cd $testdir || die "ERROR changing to directory $testdir"
1148
1149# case 00a: no alterations on a file with all metadata types, keep all metadata, in same order
1150flac2flac input-SCVAUP.flac case00a ""
1151# case 01a: on file with multiple PADDING blocks, they should be aggregated into one at the end
1152flac2flac input-SCVPAP.flac case01a ""
1153# case 01b: on file with multiple PADDING blocks and --no-padding specified, they should all be deleted
1154flac2flac input-SCVPAP.flac case01b "--no-padding"
1155# case 01c: on file with multiple PADDING blocks and -P specified, they should all be overwritten with -P value
1156flac2flac input-SCVPAP.flac case01c "-P 1234"
1157# case 01d: on file with no PADDING blocks, use -P setting
1158flac2flac input-SCVA.flac case01d "-P 1234"
1159# case 01e: on file with no PADDING blocks and no -P given, use default padding
1160flac2flac input-SCVA.flac case01e ""
1161# case 02a: on file with no VORBIS_COMMENT block, add new VORBIS_COMMENT
1162flac2flac input-SCPAP.flac case02a ""
1163# case 02b: on file with no VORBIS_COMMENT block and --tag, add new VORBIS_COMMENT with tags
1164flac2flac input-SCPAP.flac case02b "--tag=artist=0"
1165# case 02c: on file with VORBIS_COMMENT block and --tag, replace existing VORBIS_COMMENT with new tags
1166flac2flac input-SCVAUP.flac case02c "$TOTALLY_SILENT --tag=artist=0"
1167# case 03a: on file with no CUESHEET block and --cuesheet specified, add it
1168flac2flac input-SVAUP.flac case03a "--cuesheet=input0.cue"
1169# case 03b: on file with CUESHEET block and --cuesheet specified, overwrite existing CUESHEET
1170flac2flac input-SCVAUP.flac case03b "$TOTALLY_SILENT --cuesheet=input0.cue"
1171# case 03c: on file with CUESHEET block and size-changing option specified, drop existing CUESHEET
1172flac2flac input-SCVAUP.flac case03c "$TOTALLY_SILENT --skip=1"
1173# case 04a: on file with no SEEKTABLE block and --no-seektable specified, no SEEKTABLE
1174flac2flac input-VA.flac case04a "--no-padding --no-seektable"
1175# case 04b: on file with no SEEKTABLE block and -S specified, new SEEKTABLE
1176flac2flac input-VA.flac case04b "--no-padding -S 5x"
1177# case 04c: on file with no SEEKTABLE block and no seektable options specified, new SEEKTABLE with default points
1178flac2flac input-VA.flac case04c "--no-padding"
1179# case 04d: on file with SEEKTABLE block and --no-seektable specified, drop existing SEEKTABLE
1180flac2flac input-SCVA.flac case04d "--no-padding --no-seektable"
1181# case 04e: on file with SEEKTABLE block and -S specified, overwrite existing SEEKTABLE
1182flac2flac input-SCVA.flac case04e "$TOTALLY_SILENT --no-padding -S 5x"
1183# case 04f: on file with SEEKTABLE block and size-changing option specified, drop existing SEEKTABLE, new SEEKTABLE with default points
1184#(already covered by case03c)
1185
1186rm -f out.flac out.meta
1187
1188#@@@ when metaflac handles ogg flac, duplicate flac2flac tests here
1189
1190cd ..
1191