ae629089fd8e5852bd04dce8776bc2153bcd8526
[flac.git] / test / test_flac.sh
1 #!/bin/sh
2
3 #  FLAC - Free Lossless Audio Codec
4 #  Copyright (C) 2001,2002,2003,2004,2005,2006  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
20 die ()
21 {
22         echo $* 1>&2
23         exit 1
24 }
25
26 dddie="die ERROR: creating files with dd"
27
28 if [ x = x"$1" ] ; then
29         BUILD=debug
30 else
31         BUILD="$1"
32 fi
33
34 # change to 'false' to show flac output (useful for debugging)
35 if true ; then
36         SILENT='--silent'
37         TOTALLY_SILENT='--totally-silent'
38 else
39         SILENT=''
40         TOTALLY_SILENT=''
41 fi
42
43 LD_LIBRARY_PATH=`pwd`/../src/libFLAC/.libs:$LD_LIBRARY_PATH
44 LD_LIBRARY_PATH=`pwd`/../src/share/grabbag/.libs:$LD_LIBRARY_PATH
45 LD_LIBRARY_PATH=`pwd`/../src/share/getopt/.libs:$LD_LIBRARY_PATH
46 LD_LIBRARY_PATH=`pwd`/../src/share/replaygain_analysis/.libs:$LD_LIBRARY_PATH
47 LD_LIBRARY_PATH=`pwd`/../src/share/replaygain_synthesis/.libs:$LD_LIBRARY_PATH
48 LD_LIBRARY_PATH=`pwd`/../src/share/utf8/.libs:$LD_LIBRARY_PATH
49 LD_LIBRARY_PATH=`pwd`/../obj/$BUILD/lib:$LD_LIBRARY_PATH
50 export LD_LIBRARY_PATH
51 PATH=`pwd`/../src/flac:$PATH
52 PATH=`pwd`/../src/metaflac:$PATH
53 PATH=`pwd`/../src/test_streams:$PATH
54 PATH=`pwd`/../obj/$BUILD/bin:$PATH
55
56 flac --help 1>/dev/null 2>/dev/null || die "ERROR can't find flac executable"
57
58 run_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 --logfile-fd=4 flac $* 4>>test_flac.valgrind.log
63         else
64                 flac $*
65         fi
66 }
67
68 run_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 --logfile-fd=4 metaflac $* 4>>test_flac.valgrind.log
73         else
74                 metaflac $*
75         fi
76 }
77
78 md5cmp ()
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
85 if [ `env | grep -ic '^comspec='` != 0 ] ; then
86         is_win=yes
87 else
88         is_win=no
89 fi
90
91 echo "Checking for --ogg support in flac..."
92 if 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"
95 else
96         has_ogg=no;
97         echo "flac --ogg doesn't work"
98 fi
99
100 echo "Generating streams..."
101 if [ ! -f wacky1.wav ] ; then
102         test_streams || die "ERROR during test_streams"
103 fi
104
105 ############################################################################
106 # test that flac doesn't automatically overwrite files unless -f is used
107 ############################################################################
108
109 echo "Try encoding to a file that exists; should fail"
110 cp wacky1.wav exist.wav
111 touch exist.flac
112 if run_flac $TOTALLY_SILENT -0 exist.wav ; then
113         die "ERROR: it should have failed but didn't"
114 else
115         echo "OK, it failed as it should"
116 fi
117
118 echo "Try encoding with -f to a file that exists; should succeed"
119 if run_flac $TOTALLY_SILENT -0 --force exist.wav ; then
120         echo "OK, it succeeded as it should"
121 else
122         die "ERROR: it should have succeeded but didn't"
123 fi
124
125 echo "Try decoding to a file that exists; should fail"
126 if run_flac $TOTALLY_SILENT -d exist.flac ; then
127         die "ERROR: it should have failed but didn't"
128 else
129         echo "OK, it failed as it should"
130 fi
131
132 echo "Try decoding with -f to a file that exists; should succeed"
133 if run_flac $TOTALLY_SILENT -d -f exist.flac ; then
134         echo "OK, it succeeded as it should"
135 else
136         die "ERROR: it should have succeeded but didn't"
137 fi
138
139 rm -f exist.wav exist.flac
140
141 ############################################################################
142 # test fractional block sizes
143 ############################################################################
144
145 test_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.
166 for samples in 31 32 33 34 35 2046 2047 2048 2049 2050 ; do
167         test_fractional 33 $samples
168 done
169 for 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
171 done
172 for samples in 1022 1023 1024 1025 1026 2046 2047 2048 2049 2050 4094 4095 4096 4097 4098 ; do
173         test_fractional 2048 $samples
174 done
175 for 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
177 done
178
179 ############################################################################
180 # basic 'round-trip' tests of various kinds of streams
181 ############################################################################
182
183 rt_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
198 rt_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
211 rt_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
225 rt_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
241 rt_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.ogg --ogg $f || die "ERROR"
246         echo -n "re-encode... "
247         run_flac $SILENT --force --verify --lax -o rt2.ogg --ogg rt.ogg || die "ERROR"
248         echo -n "decode... "
249         run_flac $SILENT --force --decode --channel-map=none -o rt.wav rt2.ogg || die "ERROR"
250         echo -n "compare... "
251         cmp $f rt.wav || die "ERROR: file mismatch"
252         echo "OK"
253         rm -f rt.wav rt.ogg rt2.ogg
254 }
255
256 for f in rt-*.raw ; do
257         rt_test_raw $f
258 done
259 for f in rt-*.wav ; do
260         rt_test_wav $f
261 done
262 for f in rt-*.aiff ; do
263         rt_test_aiff $f
264 done
265 for f in rt-*.wav ; do
266         rt_test_flac $f
267 done
268 if [ $has_ogg = yes ] ; then
269         for f in rt-*.wav ; do
270                 rt_test_ogg_flac $f
271         done
272 fi
273
274 ############################################################################
275 # test --skip and --until
276 ############################################################################
277
278 #
279 # first make some chopped-up raw files
280 #
281 echo "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMN" > master.raw
282 dd if=master.raw ibs=1 count=50 of=50c.raw 2>/dev/null || $dddie
283 dd if=master.raw ibs=1 skip=10 count=40 of=50c.skip10.raw 2>/dev/null || $dddie
284 dd if=master.raw ibs=1 skip=11 count=39 of=50c.skip11.raw 2>/dev/null || $dddie
285 dd if=master.raw ibs=1 skip=20 count=30 of=50c.skip20.raw 2>/dev/null || $dddie
286 dd if=master.raw ibs=1 skip=30 count=20 of=50c.skip30.raw 2>/dev/null || $dddie
287 dd if=master.raw ibs=1 skip=40 count=10 of=50c.skip40.raw 2>/dev/null || $dddie
288 dd if=master.raw ibs=1 count=10 of=50c.until10.raw 2>/dev/null || $dddie
289 dd if=master.raw ibs=1 count=20 of=50c.until20.raw 2>/dev/null || $dddie
290 dd if=master.raw ibs=1 count=30 of=50c.until30.raw 2>/dev/null || $dddie
291 dd if=master.raw ibs=1 count=39 of=50c.until39.raw 2>/dev/null || $dddie
292 dd if=master.raw ibs=1 count=40 of=50c.until40.raw 2>/dev/null || $dddie
293 dd if=master.raw ibs=1 skip=10 count=20 of=50c.skip10.until30.raw 2>/dev/null || $dddie
294 dd if=master.raw ibs=1 skip=10 count=29 of=50c.skip10.until39.raw 2>/dev/null || $dddie
295 dd if=master.raw ibs=1 skip=10 count=30 of=50c.skip10.until40.raw 2>/dev/null || $dddie
296 dd if=master.raw ibs=1 skip=20 count=10 of=50c.skip20.until30.raw 2>/dev/null || $dddie
297 dd if=master.raw ibs=1 skip=20 count=20 of=50c.skip20.until40.raw 2>/dev/null || $dddie
298
299 wav_eopt="$SILENT --force --verify --no-padding --lax"
300 wav_dopt="$SILENT --force --decode"
301
302 raw_eopt="$wav_eopt --force-raw-format --endian=big --sign=signed --sample-rate=10 --bps=8 --channels=1"
303 raw_dopt="$wav_dopt --force-raw-format --endian=big --sign=signed"
304
305 #
306 # convert them to WAVE/AIFF/Ogg FLAC files
307 #
308 convert_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 }
313 convert_to_wav 50c "$raw_eopt" "$wav_dopt"
314 convert_to_wav 50c.skip10 "$raw_eopt" "$wav_dopt"
315 convert_to_wav 50c.skip11 "$raw_eopt" "$wav_dopt"
316 convert_to_wav 50c.skip20 "$raw_eopt" "$wav_dopt"
317 convert_to_wav 50c.skip30 "$raw_eopt" "$wav_dopt"
318 convert_to_wav 50c.skip40 "$raw_eopt" "$wav_dopt"
319 convert_to_wav 50c.until10 "$raw_eopt" "$wav_dopt"
320 convert_to_wav 50c.until20 "$raw_eopt" "$wav_dopt"
321 convert_to_wav 50c.until30 "$raw_eopt" "$wav_dopt"
322 convert_to_wav 50c.until39 "$raw_eopt" "$wav_dopt"
323 convert_to_wav 50c.until40 "$raw_eopt" "$wav_dopt"
324 convert_to_wav 50c.skip10.until30 "$raw_eopt" "$wav_dopt"
325 convert_to_wav 50c.skip10.until39 "$raw_eopt" "$wav_dopt"
326 convert_to_wav 50c.skip10.until40 "$raw_eopt" "$wav_dopt"
327 convert_to_wav 50c.skip20.until30 "$raw_eopt" "$wav_dopt"
328 convert_to_wav 50c.skip20.until40 "$raw_eopt" "$wav_dopt"
329
330 convert_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 }
335 convert_to_aiff 50c "$raw_eopt" "$wav_dopt"
336 convert_to_aiff 50c.skip10 "$raw_eopt" "$wav_dopt"
337 convert_to_aiff 50c.skip11 "$raw_eopt" "$wav_dopt"
338 convert_to_aiff 50c.skip20 "$raw_eopt" "$wav_dopt"
339 convert_to_aiff 50c.skip30 "$raw_eopt" "$wav_dopt"
340 convert_to_aiff 50c.skip40 "$raw_eopt" "$wav_dopt"
341 convert_to_aiff 50c.until10 "$raw_eopt" "$wav_dopt"
342 convert_to_aiff 50c.until20 "$raw_eopt" "$wav_dopt"
343 convert_to_aiff 50c.until30 "$raw_eopt" "$wav_dopt"
344 convert_to_aiff 50c.until39 "$raw_eopt" "$wav_dopt"
345 convert_to_aiff 50c.until40 "$raw_eopt" "$wav_dopt"
346 convert_to_aiff 50c.skip10.until30 "$raw_eopt" "$wav_dopt"
347 convert_to_aiff 50c.skip10.until39 "$raw_eopt" "$wav_dopt"
348 convert_to_aiff 50c.skip10.until40 "$raw_eopt" "$wav_dopt"
349 convert_to_aiff 50c.skip20.until30 "$raw_eopt" "$wav_dopt"
350 convert_to_aiff 50c.skip20.until40 "$raw_eopt" "$wav_dopt"
351
352 convert_to_ogg ()
353 {
354         run_flac "$wav_eopt" --ogg $1.wav || die "ERROR converting $1.raw to Ogg FLAC"
355 }
356 if [ $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
373 fi
374
375 test_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
658 test_skip_until raw flac
659 test_skip_until wav flac
660 test_skip_until aiff flac
661 test_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
667 if [ $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
674 fi
675
676 echo "testing seek extremes:"
677
678 run_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
680 if [ $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"
683 else
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
688 fi
689
690 echo -n "testing --skip=0... "
691 run_flac $wav_dopt --skip=0 -o z.wav noise.flac || die "ERROR decoding FLAC file noise.flac"
692 echo OK
693
694 for 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
699 done
700
701 rm noise.flac z.wav
702
703
704 ############################################################################
705 # test --input-size
706 ############################################################################
707
708 #@@@ cat will not work on old cygwin, need to fix
709 if [ $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
716 fi
717
718
719 ############################################################################
720 # test --cue
721 ############################################################################
722
723 #
724 # create the cue sheet
725 #
726 cuesheet=cuetest.cue
727 cat > $cuesheet << EOF
728 CATALOG 1234567890123
729 FILE "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
738 EOF
739
740 test_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
888 test_cue raw flac
889 test_cue wav flac
890 test_cue aiff flac
891 test_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
897 if [ $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
904 fi
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
912 echo -n "WAVE fixup test... "
913
914 echo -n "prepare... "
915 convert_to_wav noise "$raw_eopt" "$wav_dopt" || die "ERROR creating reference WAVE"
916
917 echo -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
921 if [ $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
924 else
925         cat noise.raw | run_flac $raw_eopt - -c > fixup.flac || die "ERROR generating FLAC file"
926 fi
927
928 echo -n "decode... "
929 run_flac $wav_dopt fixup.flac -o fixup.wav || die "ERROR decoding FLAC file"
930
931 echo -n "compare... "
932 cmp noise.wav fixup.wav || die "ERROR: file mismatch"
933
934 echo OK
935 rm -f noise.wav fixup.wav fixup.flac
936
937 echo -n "AIFF fixup test... "
938
939 echo -n "prepare... "
940 convert_to_aiff noise "$raw_eopt" "$wav_dopt" || die "ERROR creating reference AIFF"
941
942 echo -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
946 if [ $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
949 else
950         cat noise.raw | run_flac $raw_eopt - -c > fixup.flac || die "ERROR generating FLAC file"
951 fi
952
953 echo -n "decode... "
954 run_flac $wav_dopt fixup.flac -o fixup.aiff || die "ERROR decoding FLAC file"
955
956 echo -n "compare... "
957 cmp noise.aiff fixup.aiff || die "ERROR: file mismatch"
958
959 echo OK
960 rm -f noise.aiff fixup.aiff fixup.flac
961
962
963 ############################################################################
964 # multi-file tests
965 ############################################################################
966
967 echo "Generating multiple input files from noise..."
968 multifile_format_decode="--endian=big --sign=signed"
969 multifile_format_encode="$multifile_format_decode --sample-rate=44100 --bps=16 --channels=2 --no-padding"
970 short_noise_cdda_samples=`expr $total_noise_cdda_samples / 8`
971 run_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"
972 run_flac --decode --force $SILENT shortnoise.flac -o shortnoise.raw --force-raw-format $multifile_format_decode || die "ERROR generating RAW file"
973 run_flac --decode --force $SILENT shortnoise.flac || die "ERROR generating WAVE file"
974 run_flac --decode --force $SILENT shortnoise.flac -o shortnoise.aiff || die "ERROR generating AIFF file"
975 cp shortnoise.flac file0.flac
976 cp shortnoise.flac file1.flac
977 cp shortnoise.flac file2.flac
978 rm -f shortnoise.flac
979 cp shortnoise.wav file0.wav
980 cp shortnoise.wav file1.wav
981 cp shortnoise.wav file2.wav
982 rm -f shortnoise.wav
983 cp shortnoise.aiff file0.aiff
984 cp shortnoise.aiff file1.aiff
985 cp shortnoise.aiff file2.aiff
986 rm -f shortnoise.aiff
987 cp shortnoise.raw file0.raw
988 cp shortnoise.raw file1.raw
989 cp shortnoise.raw file2.raw
990 rm -f shortnoise.raw
991 # create authoritative sector-aligned files for comparison
992 file0_samples=`expr \( $short_noise_cdda_samples / 588 \) \* 588`
993 file0_remainder=`expr $short_noise_cdda_samples - $file0_samples`
994 file1_samples=`expr \( \( $file0_remainder + $short_noise_cdda_samples \) / 588 \) \* 588`
995 file1_remainder=`expr $file0_remainder + $short_noise_cdda_samples - $file1_samples`
996 file1_samples=`expr $file1_samples - $file0_remainder`
997 file2_samples=`expr \( \( $file1_remainder + $short_noise_cdda_samples \) / 588 \) \* 588`
998 file2_remainder=`expr $file1_remainder + $short_noise_cdda_samples - $file2_samples`
999 file2_samples=`expr $file2_samples - $file1_remainder`
1000 if [ $file2_remainder != '0' ] ; then
1001         file2_samples=`expr $file2_samples + $file2_remainder`
1002         file2_remainder=`expr 588 - $file2_remainder`
1003 fi
1004
1005 dd if=file0.raw ibs=4 count=$file0_samples of=file0s.raw 2>/dev/null || $dddie
1006 dd if=file0.raw ibs=4 count=$file0_remainder of=file1s.raw skip=$file0_samples 2>/dev/null || $dddie
1007 dd if=file1.raw ibs=4 count=$file1_samples of=z.raw 2>/dev/null || $dddie
1008 cat z.raw >> file1s.raw || die "ERROR: cat-ing sector-aligned files"
1009 dd if=file1.raw ibs=4 count=$file1_remainder of=file2s.raw skip=$file1_samples 2>/dev/null || $dddie
1010 dd if=file2.raw ibs=4 count=$file2_samples of=z.raw 2>/dev/null || $dddie
1011 cat z.raw >> file2s.raw || die "ERROR: cat-ing sector-aligned files"
1012 dd if=/dev/zero ibs=4 count=$file2_remainder of=z.raw 2>/dev/null || $dddie
1013 cat z.raw >> file2s.raw || die "ERROR: cat-ing sector-aligned files"
1014 rm -f z.raw
1015
1016 convert_to_wav file0s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned WAVE"
1017 convert_to_wav file1s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned WAVE"
1018 convert_to_wav file2s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned WAVE"
1019
1020 convert_to_aiff file0s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned AIFF"
1021 convert_to_aiff file1s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned AIFF"
1022 convert_to_aiff file2s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned AIFF"
1023
1024 test_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=ogg
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
1078 input_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
1083 for 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
1116 done
1117
1118
1119 ############################################################################
1120 # test the metadata-handling properties of flac-to-flac encoding
1121 ############################################################################
1122
1123 echo "Testing the metadata-handling properties of flac-to-flac encoding..."
1124
1125 testdir="flac-to-flac-metadata-test-files"
1126 filter ()
1127 {
1128         # minor danger, changing vendor strings will 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 }
1133 flac2flac ()
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: '
1147 cd $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
1150 flac2flac input-SCVAUP.flac case00a ""
1151 # case 01a: on file with multiple PADDING blocks, they should be aggregated into one at the end
1152 flac2flac input-SCVPAP.flac case01a ""
1153 # case 01b: on file with multiple PADDING blocks and --no-padding specified, they should all be deleted
1154 flac2flac 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
1156 flac2flac input-SCVPAP.flac case01c "-P 1234"
1157 # case 01d: on file with no PADDING blocks, use -P setting
1158 flac2flac input-SCVA.flac case01d "-P 1234"
1159 # case 01e: on file with no PADDING blocks and no -P given, use default padding
1160 flac2flac input-SCVA.flac case01e ""
1161 # case 02a: on file with no VORBIS_COMMENT block, add new VORBIS_COMMENT
1162 flac2flac input-SCPAP.flac case02a ""
1163 # case 02b: on file with no VORBIS_COMMENT block and --tag, add new VORBIS_COMMENT with tags
1164 flac2flac 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
1166 flac2flac input-SCVAUP.flac case02c "$TOTALLY_SILENT --tag=artist=0"
1167 # case 03a: on file with no CUESHEET block and --cuesheet specified, add it
1168 flac2flac input-SVAUP.flac case03a "--cuesheet=input0.cue"
1169 # case 03b: on file with CUESHEET block and --cuesheet specified, overwrite existing CUESHEET
1170 flac2flac 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
1172 flac2flac input-SCVAUP.flac case03c "$TOTALLY_SILENT --skip=1"
1173 # case 04a: on file with no SEEKTABLE block and --no-seektable specified, no SEEKTABLE
1174 flac2flac input-VA.flac case04a "--no-padding --no-seektable"
1175 # case 04b: on file with no SEEKTABLE block and -S specified, new SEEKTABLE
1176 flac2flac 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
1178 flac2flac input-VA.flac case04c "--no-padding"
1179 # case 04d: on file with SEEKTABLE block and --no-seektable specified, drop existing SEEKTABLE
1180 flac2flac input-SCVA.flac case04d "--no-padding --no-seektable"
1181 # case 04e: on file with SEEKTABLE block and -S specified, overwrite existing SEEKTABLE
1182 flac2flac 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
1186 rm -f out.flac out.meta
1187
1188 #@@@ when metaflac handles ogg flac, duplicate flac2flac tests here
1189
1190 cd ..