add support for Wave64 (SF#1769582: https://sourceforge.net/tracker/index.php?func...
[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,2007,2008  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 --log-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 --log-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         extra="$2"
187         channels=`echo $f | awk -F- '{print $2}'`
188         bps=`echo $f | awk -F- '{print $3}'`
189         echo -n "round-trip test ($f) encode... "
190         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 $extra $f || die "ERROR"
191         echo -n "decode... "
192         run_flac $SILENT --force --decode --force-raw-format --endian=little --sign=signed -o rt.raw $extra rt.flac || die "ERROR"
193         echo -n "compare... "
194         cmp $f rt.raw || die "ERROR: file mismatch"
195         echo "OK"
196         rm -f rt.flac rt.raw
197 }
198
199 rt_test_wav ()
200 {
201         f="$1"
202         extra="$2"
203         echo -n "round-trip test ($f) encode... "
204         run_flac $SILENT --force --verify --channel-map=none --no-padding --lax -o rt.flac $extra $f || die "ERROR"
205         echo -n "decode... "
206         run_flac $SILENT --force --decode --channel-map=none -o rt.wav $extra rt.flac || die "ERROR"
207         echo -n "compare... "
208         cmp $f rt.wav || die "ERROR: file mismatch"
209         echo "OK"
210         rm -f rt.flac rt.wav
211 }
212
213 rt_test_w64 ()
214 {
215         f="$1"
216         extra="$2"
217         echo -n "round-trip test ($f) encode... "
218         run_flac $SILENT --force --verify --channel-map=none --no-padding --lax -o rt.flac $extra $f || die "ERROR"
219         echo -n "decode... "
220         run_flac $SILENT --force --decode --channel-map=none -o rt.w64 $extra rt.flac || die "ERROR"
221         echo -n "compare... "
222         cmp $f rt.w64 || die "ERROR: file mismatch"
223         echo "OK"
224         rm -f rt.flac rt.w64
225 }
226
227 rt_test_rf64 ()
228 {
229         f="$1"
230         extra="$2"
231         echo -n "round-trip test ($f) encode... "
232         run_flac $SILENT --force --verify --channel-map=none --no-padding --lax -o rt.flac $extra $f || die "ERROR"
233         echo -n "decode... "
234         run_flac $SILENT --force --decode --channel-map=none -o rt.rf64 $extra rt.flac || die "ERROR"
235         echo -n "compare... "
236         cmp $f rt.rf64 || die "ERROR: file mismatch"
237         echo "OK"
238         rm -f rt.flac rt.rf64
239 }
240
241 rt_test_aiff ()
242 {
243         f="$1"
244         extra="$2"
245         echo -n "round-trip test ($f) encode... "
246         run_flac $SILENT --force --verify --channel-map=none --no-padding --lax -o rt.flac $extra $f || die "ERROR"
247         echo -n "decode... "
248         run_flac $SILENT --force --decode --channel-map=none -o rt.aiff $extra rt.flac || die "ERROR"
249         echo -n "compare... "
250         cmp $f rt.aiff || die "ERROR: file mismatch"
251         echo "OK"
252         rm -f rt.flac rt.aiff
253 }
254
255 # assumes input file is WAVE; does not check the metadata-preserving features of flac-to-flac; that is checked later
256 rt_test_flac ()
257 {
258         f="$1"
259         extra="$2"
260         echo -n "round-trip test ($f->flac->flac->wav) encode... "
261         run_flac $SILENT --force --verify --channel-map=none --no-padding --lax -o rt.flac $extra $f || die "ERROR"
262         echo -n "re-encode... "
263         run_flac $SILENT --force --verify --lax -o rt2.flac rt.flac || die "ERROR"
264         echo -n "decode... "
265         run_flac $SILENT --force --decode --channel-map=none -o rt.wav $extra rt2.flac || die "ERROR"
266         echo -n "compare... "
267         cmp $f rt.wav || die "ERROR: file mismatch"
268         echo "OK"
269         rm -f rt.wav rt.flac rt2.flac
270 }
271
272 # assumes input file is WAVE; does not check the metadata-preserving features of flac-to-flac; that is checked later
273 rt_test_ogg_flac ()
274 {
275         f="$1"
276         extra="$2"
277         echo -n "round-trip test ($f->oggflac->oggflac->wav) encode... "
278         run_flac $SILENT --force --verify --channel-map=none --no-padding --lax -o rt.oga --ogg $extra $f || die "ERROR"
279         echo -n "re-encode... "
280         run_flac $SILENT --force --verify --lax -o rt2.oga --ogg rt.oga || die "ERROR"
281         echo -n "decode... "
282         run_flac $SILENT --force --decode --channel-map=none -o rt.wav $extra rt2.oga || die "ERROR"
283         echo -n "compare... "
284         cmp $f rt.wav || die "ERROR: file mismatch"
285         echo "OK"
286         rm -f rt.wav rt.oga rt2.oga
287 }
288
289 for f in rt-*.raw ; do
290         rt_test_raw $f
291 done
292 for f in rt-*.wav ; do
293         rt_test_wav $f
294 done
295 for f in rt-*.w64 ; do
296         rt_test_w64 $f
297 done
298 for f in rt-*.rf64 ; do
299         rt_test_rf64 $f
300 done
301 for f in rt-*.aiff ; do
302         rt_test_aiff $f
303 done
304 for f in rt-*.wav ; do
305         rt_test_flac $f
306 done
307 if [ $has_ogg = yes ] ; then
308         for f in rt-*.wav ; do
309                 rt_test_ogg_flac $f
310         done
311 fi
312
313 ############################################################################
314 # test --skip and --until
315 ############################################################################
316
317 #
318 # first make some chopped-up raw files
319 #
320 echo "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMN" > master.raw
321 dd if=master.raw ibs=1 count=50 of=50c.raw 2>/dev/null || $dddie
322 dd if=master.raw ibs=1 skip=10 count=40 of=50c.skip10.raw 2>/dev/null || $dddie
323 dd if=master.raw ibs=1 skip=11 count=39 of=50c.skip11.raw 2>/dev/null || $dddie
324 dd if=master.raw ibs=1 skip=20 count=30 of=50c.skip20.raw 2>/dev/null || $dddie
325 dd if=master.raw ibs=1 skip=30 count=20 of=50c.skip30.raw 2>/dev/null || $dddie
326 dd if=master.raw ibs=1 skip=40 count=10 of=50c.skip40.raw 2>/dev/null || $dddie
327 dd if=master.raw ibs=1 count=10 of=50c.until10.raw 2>/dev/null || $dddie
328 dd if=master.raw ibs=1 count=20 of=50c.until20.raw 2>/dev/null || $dddie
329 dd if=master.raw ibs=1 count=30 of=50c.until30.raw 2>/dev/null || $dddie
330 dd if=master.raw ibs=1 count=39 of=50c.until39.raw 2>/dev/null || $dddie
331 dd if=master.raw ibs=1 count=40 of=50c.until40.raw 2>/dev/null || $dddie
332 dd if=master.raw ibs=1 skip=10 count=20 of=50c.skip10.until30.raw 2>/dev/null || $dddie
333 dd if=master.raw ibs=1 skip=10 count=29 of=50c.skip10.until39.raw 2>/dev/null || $dddie
334 dd if=master.raw ibs=1 skip=10 count=30 of=50c.skip10.until40.raw 2>/dev/null || $dddie
335 dd if=master.raw ibs=1 skip=20 count=10 of=50c.skip20.until30.raw 2>/dev/null || $dddie
336 dd if=master.raw ibs=1 skip=20 count=20 of=50c.skip20.until40.raw 2>/dev/null || $dddie
337
338 wav_eopt="$SILENT --force --verify --no-padding --lax"
339 wav_dopt="$SILENT --force --decode"
340
341 raw_eopt="$wav_eopt --force-raw-format --endian=big --sign=signed --sample-rate=10 --bps=8 --channels=1"
342 raw_dopt="$wav_dopt --force-raw-format --endian=big --sign=signed"
343
344 #
345 # convert them to WAVE/AIFF/Ogg FLAC files
346 #
347 convert_to_wav ()
348 {
349         run_flac "$2" $1.raw || die "ERROR converting $1.raw to WAVE"
350         run_flac "$3" $1.flac || die "ERROR converting $1.raw to WAVE"
351 }
352 convert_to_wav 50c "$raw_eopt" "$wav_dopt"
353 convert_to_wav 50c.skip10 "$raw_eopt" "$wav_dopt"
354 convert_to_wav 50c.skip11 "$raw_eopt" "$wav_dopt"
355 convert_to_wav 50c.skip20 "$raw_eopt" "$wav_dopt"
356 convert_to_wav 50c.skip30 "$raw_eopt" "$wav_dopt"
357 convert_to_wav 50c.skip40 "$raw_eopt" "$wav_dopt"
358 convert_to_wav 50c.until10 "$raw_eopt" "$wav_dopt"
359 convert_to_wav 50c.until20 "$raw_eopt" "$wav_dopt"
360 convert_to_wav 50c.until30 "$raw_eopt" "$wav_dopt"
361 convert_to_wav 50c.until39 "$raw_eopt" "$wav_dopt"
362 convert_to_wav 50c.until40 "$raw_eopt" "$wav_dopt"
363 convert_to_wav 50c.skip10.until30 "$raw_eopt" "$wav_dopt"
364 convert_to_wav 50c.skip10.until39 "$raw_eopt" "$wav_dopt"
365 convert_to_wav 50c.skip10.until40 "$raw_eopt" "$wav_dopt"
366 convert_to_wav 50c.skip20.until30 "$raw_eopt" "$wav_dopt"
367 convert_to_wav 50c.skip20.until40 "$raw_eopt" "$wav_dopt"
368
369 convert_to_aiff ()
370 {
371         run_flac "$2" $1.raw || die "ERROR converting $1.raw to AIFF"
372         run_flac "$3" $1.flac -o $1.aiff || die "ERROR converting $1.raw to AIFF"
373 }
374 convert_to_aiff 50c "$raw_eopt" "$wav_dopt"
375 convert_to_aiff 50c.skip10 "$raw_eopt" "$wav_dopt"
376 convert_to_aiff 50c.skip11 "$raw_eopt" "$wav_dopt"
377 convert_to_aiff 50c.skip20 "$raw_eopt" "$wav_dopt"
378 convert_to_aiff 50c.skip30 "$raw_eopt" "$wav_dopt"
379 convert_to_aiff 50c.skip40 "$raw_eopt" "$wav_dopt"
380 convert_to_aiff 50c.until10 "$raw_eopt" "$wav_dopt"
381 convert_to_aiff 50c.until20 "$raw_eopt" "$wav_dopt"
382 convert_to_aiff 50c.until30 "$raw_eopt" "$wav_dopt"
383 convert_to_aiff 50c.until39 "$raw_eopt" "$wav_dopt"
384 convert_to_aiff 50c.until40 "$raw_eopt" "$wav_dopt"
385 convert_to_aiff 50c.skip10.until30 "$raw_eopt" "$wav_dopt"
386 convert_to_aiff 50c.skip10.until39 "$raw_eopt" "$wav_dopt"
387 convert_to_aiff 50c.skip10.until40 "$raw_eopt" "$wav_dopt"
388 convert_to_aiff 50c.skip20.until30 "$raw_eopt" "$wav_dopt"
389 convert_to_aiff 50c.skip20.until40 "$raw_eopt" "$wav_dopt"
390
391 convert_to_ogg ()
392 {
393         run_flac "$wav_eopt" --ogg $1.wav || die "ERROR converting $1.raw to Ogg FLAC"
394 }
395 if [ $has_ogg = yes ] ; then
396         convert_to_ogg 50c
397         convert_to_ogg 50c.skip10
398         convert_to_ogg 50c.skip11
399         convert_to_ogg 50c.skip20
400         convert_to_ogg 50c.skip30
401         convert_to_ogg 50c.skip40
402         convert_to_ogg 50c.until10
403         convert_to_ogg 50c.until20
404         convert_to_ogg 50c.until30
405         convert_to_ogg 50c.until39
406         convert_to_ogg 50c.until40
407         convert_to_ogg 50c.skip10.until30
408         convert_to_ogg 50c.skip10.until39
409         convert_to_ogg 50c.skip10.until40
410         convert_to_ogg 50c.skip20.until30
411         convert_to_ogg 50c.skip20.until40
412 fi
413
414 test_skip_until ()
415 {
416         in_fmt=$1
417         out_fmt=$2
418
419         [ "$in_fmt" = wav ] || [ "$in_fmt" = aiff ] || [ "$in_fmt" = raw ] || [ "$in_fmt" = flac ] || [ "$in_fmt" = ogg ] || die "ERROR: internal error, bad 'in' format '$in_fmt'"
420
421         [ "$out_fmt" = flac ] || [ "$out_fmt" = ogg ] || die "ERROR: internal error, bad 'out' format '$out_fmt'"
422
423         if [ $in_fmt = raw ] ; then
424                 eopt="$raw_eopt"
425                 dopt="$raw_dopt"
426         else
427                 eopt="$wav_eopt"
428                 dopt="$wav_dopt"
429         fi
430
431         if ( [ $in_fmt = flac ] || [ $in_fmt = ogg ] ) && ( [ $out_fmt = flac ] || [ $out_fmt = ogg ] ) ; then
432                 CMP=md5cmp
433         else
434                 CMP=cmp
435         fi
436
437         if [ $out_fmt = ogg ] ; then
438                 eopt="--ogg $eopt"
439         fi
440
441         #
442         # test --skip when encoding
443         #
444
445         desc="($in_fmt<->$out_fmt)"
446
447         echo -n "testing --skip=# (encode) $desc... "
448         run_flac $eopt --skip=10 -o z50c.skip10.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
449         [ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip10.$in_fmt z50c.skip10.$out_fmt || die "ERROR decoding FLAC file $desc"
450         $CMP 50c.skip10.$in_fmt z50c.skip10.$in_fmt || die "ERROR: file mismatch for --skip=10 (encode) $desc"
451         rm -f z50c.skip10.$out_fmt z50c.skip10.$in_fmt
452         echo OK
453
454         echo -n "testing --skip=mm:ss (encode) $desc... "
455         run_flac $eopt --skip=0:01 -o z50c.skip0_01.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
456         [ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip0_01.$in_fmt z50c.skip0_01.$out_fmt || die "ERROR decoding FLAC file $desc"
457         $CMP 50c.skip10.$in_fmt z50c.skip0_01.$in_fmt || die "ERROR: file mismatch for --skip=0:01 (encode) $desc"
458         rm -f z50c.skip0_01.$out_fmt z50c.skip0_01.$in_fmt
459         echo OK
460
461         echo -n "testing --skip=mm:ss.sss (encode) $desc... "
462         run_flac $eopt --skip=0:01.1001 -o z50c.skip0_01.1001.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
463         [ $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"
464         $CMP 50c.skip11.$in_fmt z50c.skip0_01.1001.$in_fmt || die "ERROR: file mismatch for --skip=0:01.1001 (encode) $desc"
465         rm -f z50c.skip0_01.1001.$out_fmt z50c.skip0_01.1001.$in_fmt
466         echo OK
467
468         #
469         # test --skip when decoding
470         #
471
472         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"
473
474         echo -n "testing --skip=# (decode) $desc... "
475         run_flac $dopt --skip=10 -o z50c.skip10.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
476         $CMP 50c.skip10.$in_fmt z50c.skip10.$in_fmt || die "ERROR: file mismatch for --skip=10 (decode) $desc"
477         rm -f z50c.skip10.$in_fmt
478         echo OK
479
480         echo -n "testing --skip=mm:ss (decode) $desc... "
481         run_flac $dopt --skip=0:01 -o z50c.skip0_01.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
482         $CMP 50c.skip10.$in_fmt z50c.skip0_01.$in_fmt || die "ERROR: file mismatch for --skip=0:01 (decode) $desc"
483         rm -f z50c.skip0_01.$in_fmt
484         echo OK
485
486         echo -n "testing --skip=mm:ss.sss (decode) $desc... "
487         run_flac $dopt --skip=0:01.1001 -o z50c.skip0_01.1001.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
488         $CMP 50c.skip11.$in_fmt z50c.skip0_01.1001.$in_fmt || die "ERROR: file mismatch for --skip=0:01.1001 (decode) $desc"
489         rm -f z50c.skip0_01.1001.$in_fmt
490         echo OK
491
492         rm -f z50c.$out_fmt
493
494         #
495         # test --until when encoding
496         #
497
498         echo -n "testing --until=# (encode) $desc... "
499         run_flac $eopt --until=40 -o z50c.until40.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
500         [ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.until40.$in_fmt z50c.until40.$out_fmt || die "ERROR decoding FLAC file $desc"
501         $CMP 50c.until40.$in_fmt z50c.until40.$in_fmt || die "ERROR: file mismatch for --until=40 (encode) $desc"
502         rm -f z50c.until40.$out_fmt z50c.until40.$in_fmt
503         echo OK
504
505         echo -n "testing --until=mm:ss (encode) $desc... "
506         run_flac $eopt --until=0:04 -o z50c.until0_04.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
507         [ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.until0_04.$in_fmt z50c.until0_04.$out_fmt || die "ERROR decoding FLAC file $desc"
508         $CMP 50c.until40.$in_fmt z50c.until0_04.$in_fmt || die "ERROR: file mismatch for --until=0:04 (encode) $desc"
509         rm -f z50c.until0_04.$out_fmt z50c.until0_04.$in_fmt
510         echo OK
511
512         echo -n "testing --until=mm:ss.sss (encode) $desc... "
513         run_flac $eopt --until=0:03.9001 -o z50c.until0_03.9001.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
514         [ $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"
515         $CMP 50c.until39.$in_fmt z50c.until0_03.9001.$in_fmt || die "ERROR: file mismatch for --until=0:03.9001 (encode) $desc"
516         rm -f z50c.until0_03.9001.$out_fmt z50c.until0_03.9001.$in_fmt
517         echo OK
518
519         echo -n "testing --until=-# (encode) $desc... "
520         run_flac $eopt --until=-10 -o z50c.until-10.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
521         [ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.until-10.$in_fmt z50c.until-10.$out_fmt || die "ERROR decoding FLAC file $desc"
522         $CMP 50c.until40.$in_fmt z50c.until-10.$in_fmt || die "ERROR: file mismatch for --until=-10 (encode) $desc"
523         rm -f z50c.until-10.$out_fmt z50c.until-10.$in_fmt
524         echo OK
525
526         echo -n "testing --until=-mm:ss (encode) $desc... "
527         run_flac $eopt --until=-0:01 -o z50c.until-0_01.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
528         [ $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"
529         $CMP 50c.until40.$in_fmt z50c.until-0_01.$in_fmt || die "ERROR: file mismatch for --until=-0:01 (encode) $desc"
530         rm -f z50c.until-0_01.$out_fmt z50c.until-0_01.$in_fmt
531         echo OK
532
533         echo -n "testing --until=-mm:ss.sss (encode) $desc... "
534         run_flac $eopt --until=-0:01.1001 -o z50c.until-0_01.1001.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
535         [ $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"
536         $CMP 50c.until39.$in_fmt z50c.until-0_01.1001.$in_fmt || die "ERROR: file mismatch for --until=-0:01.1001 (encode) $desc"
537         rm -f z50c.until-0_01.1001.$out_fmt z50c.until-0_01.1001.$in_fmt
538         echo OK
539
540         #
541         # test --until when decoding
542         #
543
544         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"
545
546         echo -n "testing --until=# (decode) $desc... "
547         run_flac $dopt --until=40 -o z50c.until40.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
548         $CMP 50c.until40.$in_fmt z50c.until40.$in_fmt || die "ERROR: file mismatch for --until=40 (decode) $desc"
549         rm -f z50c.until40.$in_fmt
550         echo OK
551
552         echo -n "testing --until=mm:ss (decode) $desc... "
553         run_flac $dopt --until=0:04 -o z50c.until0_04.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
554         $CMP 50c.until40.$in_fmt z50c.until0_04.$in_fmt || die "ERROR: file mismatch for --until=0:04 (decode) $desc"
555         rm -f z50c.until0_04.$in_fmt
556         echo OK
557
558         echo -n "testing --until=mm:ss.sss (decode) $desc... "
559         run_flac $dopt --until=0:03.9001 -o z50c.until0_03.9001.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
560         $CMP 50c.until39.$in_fmt z50c.until0_03.9001.$in_fmt || die "ERROR: file mismatch for --until=0:03.9001 (decode) $desc"
561         rm -f z50c.until0_03.9001.$in_fmt
562         echo OK
563
564         echo -n "testing --until=-# (decode) $desc... "
565         run_flac $dopt --until=-10 -o z50c.until-10.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
566         $CMP 50c.until40.$in_fmt z50c.until-10.$in_fmt || die "ERROR: file mismatch for --until=-10 (decode) $desc"
567         rm -f z50c.until-10.$in_fmt
568         echo OK
569
570         echo -n "testing --until=-mm:ss (decode) $desc... "
571         run_flac $dopt --until=-0:01 -o z50c.until-0_01.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
572         $CMP 50c.until40.$in_fmt z50c.until-0_01.$in_fmt || die "ERROR: file mismatch for --until=-0:01 (decode) $desc"
573         rm -f z50c.until-0_01.$in_fmt
574         echo OK
575
576         echo -n "testing --until=-mm:ss.sss (decode) $desc... "
577         run_flac $dopt --until=-0:01.1001 -o z50c.until-0_01.1001.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
578         $CMP 50c.until39.$in_fmt z50c.until-0_01.1001.$in_fmt || die "ERROR: file mismatch for --until=-0:01.1001 (decode) $desc"
579         rm -f z50c.until-0_01.1001.$in_fmt
580         echo OK
581
582         rm -f z50c.$out_fmt
583
584         #
585         # test --skip and --until when encoding
586         #
587
588         echo -n "testing --skip=10 --until=# (encode) $desc... "
589         run_flac $eopt --skip=10 --until=40 -o z50c.skip10.until40.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
590         [ $in_fmt = $out_fmt ] || run_flac $dopt -o z50c.skip10.until40.$in_fmt z50c.skip10.until40.$out_fmt || die "ERROR decoding FLAC file $desc"
591         $CMP 50c.skip10.until40.$in_fmt z50c.skip10.until40.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=40 (encode) $desc"
592         rm -f z50c.skip10.until40.$out_fmt z50c.skip10.until40.$in_fmt
593         echo OK
594
595         echo -n "testing --skip=10 --until=mm:ss (encode) $desc... "
596         run_flac $eopt --skip=10 --until=0:04 -o z50c.skip10.until0_04.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
597         [ $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"
598         $CMP 50c.skip10.until40.$in_fmt z50c.skip10.until0_04.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=0:04 (encode) $desc"
599         rm -f z50c.skip10.until0_04.$out_fmt z50c.skip10.until0_04.$in_fmt
600         echo OK
601
602         echo -n "testing --skip=10 --until=mm:ss.sss (encode) $desc... "
603         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"
604         [ $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"
605         $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"
606         rm -f z50c.skip10.until0_03.9001.$out_fmt z50c.skip10.until0_03.9001.$in_fmt
607         echo OK
608
609         echo -n "testing --skip=10 --until=+# (encode) $desc... "
610         run_flac $eopt --skip=10 --until=+30 -o z50c.skip10.until+30.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
611         [ $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"
612         $CMP 50c.skip10.until40.$in_fmt z50c.skip10.until+30.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=+30 (encode) $desc"
613         rm -f z50c.skip10.until+30.$out_fmt z50c.skip10.until+30.$in_fmt
614         echo OK
615
616         echo -n "testing --skip=10 --until=+mm:ss (encode) $desc... "
617         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"
618         [ $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"
619         $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"
620         rm -f z50c.skip10.until+0_03.$out_fmt z50c.skip10.until+0_03.$in_fmt
621         echo OK
622
623         echo -n "testing --skip=10 --until=+mm:ss.sss (encode) $desc... "
624         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"
625         [ $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"
626         $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"
627         rm -f z50c.skip10.until+0_02.9001.$out_fmt z50c.skip10.until+0_02.9001.$in_fmt
628         echo OK
629
630         echo -n "testing --skip=10 --until=-# (encode) $desc... "
631         run_flac $eopt --skip=10 --until=-10 -o z50c.skip10.until-10.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
632         [ $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"
633         $CMP 50c.skip10.until40.$in_fmt z50c.skip10.until-10.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=-10 (encode) $desc"
634         rm -f z50c.skip10.until-10.$out_fmt z50c.skip10.until-10.$in_fmt
635         echo OK
636
637         echo -n "testing --skip=10 --until=-mm:ss (encode) $desc... "
638         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"
639         [ $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"
640         $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"
641         rm -f z50c.skip10.until-0_01.$out_fmt z50c.skip10.until-0_01.$in_fmt
642         echo OK
643
644         echo -n "testing --skip=10 --until=-mm:ss.sss (encode) $desc... "
645         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"
646         [ $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"
647         $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"
648         rm -f z50c.skip10.until-0_01.1001.$out_fmt z50c.skip10.until-0_01.1001.$in_fmt
649         echo OK
650
651         #
652         # test --skip and --until when decoding
653         #
654
655         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"
656
657
658         echo -n "testing --skip=10 --until=# (decode) $desc... "
659         run_flac $dopt --skip=10 --until=40 -o z50c.skip10.until40.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
660         $CMP 50c.skip10.until40.$in_fmt z50c.skip10.until40.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=40 (decode) $desc"
661         rm -f z50c.skip10.until40.$in_fmt
662         echo OK
663
664         echo -n "testing --skip=10 --until=mm:ss (decode) $desc... "
665         run_flac $dopt --skip=10 --until=0:04 -o z50c.skip10.until0_04.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
666         $CMP 50c.skip10.until40.$in_fmt z50c.skip10.until0_04.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=0:04 (decode) $desc"
667         rm -f z50c.skip10.until0_04.$in_fmt
668         echo OK
669
670         echo -n "testing --skip=10 --until=mm:ss.sss (decode) $desc... "
671         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"
672         $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"
673         rm -f z50c.skip10.until0_03.9001.$in_fmt
674         echo OK
675
676         echo -n "testing --skip=10 --until=-# (decode) $desc... "
677         run_flac $dopt --skip=10 --until=-10 -o z50c.skip10.until-10.$in_fmt z50c.$out_fmt || die "ERROR decoding FLAC file $desc"
678         $CMP 50c.skip10.until40.$in_fmt z50c.skip10.until-10.$in_fmt || die "ERROR: file mismatch for --skip=10 --until=-10 (decode) $desc"
679         rm -f z50c.skip10.until-10.$in_fmt
680         echo OK
681
682         echo -n "testing --skip=10 --until=-mm:ss (decode) $desc... "
683         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"
684         $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"
685         rm -f z50c.skip10.until-0_01.$in_fmt
686         echo OK
687
688         echo -n "testing --skip=10 --until=-mm:ss.sss (decode) $desc... "
689         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"
690         $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"
691         rm -f z50c.skip10.until-0_01.1001.$in_fmt
692         echo OK
693
694         rm -f z50c.$out_fmt
695 }
696
697 test_skip_until raw flac
698 test_skip_until wav flac
699 test_skip_until aiff flac
700 test_skip_until flac flac
701 #@@@if [ $has_ogg = yes ] ; then
702 #@@@    #@@@ doesn't work yet because md5cmp doesn't work because metaflac doesn't work on ogg flac yet
703 #@@@    test_skip_until ogg flac
704 #@@@fi
705
706 if [ $has_ogg = yes ] ; then
707         test_skip_until raw ogg
708         test_skip_until wav ogg
709         test_skip_until aiff ogg
710         #@@@ doesn't work yet because md5cmp doesn't work because metaflac doesn't work on ogg flac yet
711         #@@@test_skip_until flac ogg
712         #@@@test_skip_until ogg ogg
713 fi
714
715 echo "testing seek extremes:"
716
717 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"
718
719 if [ $is_win = no ] ; then
720         total_noise_cdda_samples=`run_metaflac --show-total-samples noise.flac`
721         [ $? = 0 ] || die "ERROR getting total sample count from noise.flac"
722 else
723         # some flavors of cygwin don't seem to treat the \x0d as a word
724         # separator, so we hard code it.  we'll just have to fix it later
725         # if we change the way noise.flac is made.
726         total_noise_cdda_samples=393216
727 fi
728
729 echo -n "testing --skip=0... "
730 run_flac $wav_dopt --skip=0 -o z.wav noise.flac || die "ERROR decoding FLAC file noise.flac"
731 echo OK
732
733 for delta in 2 1 ; do
734         n=`expr $total_noise_cdda_samples - $delta`
735         echo -n "testing --skip=$n... "
736         run_flac $wav_dopt --skip=$n -o z.wav noise.flac || die "ERROR decoding FLAC file noise.flac"
737         echo OK
738 done
739
740 rm noise.flac z.wav
741
742
743 ############################################################################
744 # test --input-size
745 ############################################################################
746
747 #@@@ cat will not work on old cygwin, need to fix
748 if [ $is_win = no ] ; then
749         echo -n "testing --input-size=50 --skip=10... "
750         cat 50c.raw | run_flac $raw_eopt --input-size=50 --skip=10 -o z50c.skip10.flac - || die "ERROR generating FLAC file"
751         run_flac $raw_dopt -o z50c.skip10.raw z50c.skip10.flac || die "ERROR decoding FLAC file"
752         cmp 50c.skip10.raw z50c.skip10.raw || die "ERROR: file mismatch for --input-size=50 --skip=10"
753         rm -f z50c.skip10.raw z50c.skip10.flac
754         echo OK
755 fi
756
757
758 ############################################################################
759 # test --cue
760 ############################################################################
761
762 #
763 # create the cue sheet
764 #
765 cuesheet=cuetest.cue
766 cat > $cuesheet << EOF
767 CATALOG 1234567890123
768 FILE "blah" WAVE
769   TRACK 01 AUDIO
770     INDEX 01 0
771     INDEX 02 10
772     INDEX 03 20
773   TRACK 02 AUDIO
774     INDEX 01 30
775   TRACK 04 AUDIO
776     INDEX 01 40
777 EOF
778
779 test_cue ()
780 {
781         in_fmt=$1
782         out_fmt=$2
783
784         [ "$in_fmt" = wav ] || [ "$in_fmt" = aiff ] || [ "$in_fmt" = raw ] || [ "$in_fmt" = flac ] || [ "$in_fmt" = ogg ] || die "ERROR: internal error, bad 'in' format '$in_fmt'"
785
786         [ "$out_fmt" = flac ] || [ "$out_fmt" = ogg ] || die "ERROR: internal error, bad 'out' format '$out_fmt'"
787
788         if [ $in_fmt = raw ] ; then
789                 eopt="$raw_eopt"
790                 dopt="$raw_dopt"
791         else
792                 eopt="$wav_eopt"
793                 dopt="$wav_dopt"
794         fi
795
796         if ( [ $in_fmt = flac ] || [ $in_fmt = ogg ] ) && ( [ $out_fmt = flac ] || [ $out_fmt = ogg ] ) ; then
797                 CMP=md5cmp
798         else
799                 CMP=cmp
800         fi
801
802         if [ $out_fmt = ogg ] ; then
803                 eopt="--ogg $eopt"
804         fi
805
806         desc="($in_fmt<->$out_fmt)"
807
808         #
809         # for this we need just need just one FLAC file; --cue only works while decoding
810         #
811         run_flac $eopt --cuesheet=$cuesheet -o z50c.cue.$out_fmt 50c.$in_fmt || die "ERROR generating FLAC file $desc"
812
813         # To make it easy to translate from cue point to sample numbers, the
814         # file has a sample rate of 10 Hz and a cuesheet like so:
815         #
816         # TRACK 01, INDEX 01 : 0:00.00 -> sample 0
817         # TRACK 01, INDEX 02 : 0:01.00 -> sample 10
818         # TRACK 01, INDEX 03 : 0:02.00 -> sample 20
819         # TRACK 02, INDEX 01 : 0:03.00 -> sample 30
820         # TRACK 04, INDEX 01 : 0:04.00 -> sample 40
821         #
822         echo -n "testing --cue=- $desc... "
823         run_flac $dopt -o z50c.cued.$in_fmt --cue=- z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
824         $CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=- $desc"
825         rm -f z50c.cued.$in_fmt
826         echo OK
827
828         echo -n "testing --cue=1.0 $desc... "
829         run_flac $dopt -o z50c.cued.$in_fmt --cue=1.0 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
830         $CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.0 $desc"
831         rm -f z50c.cued.$in_fmt
832         echo OK
833
834         echo -n "testing --cue=1.0- $desc... "
835         run_flac $dopt -o z50c.cued.$in_fmt --cue=1.0- z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
836         $CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.0- $desc"
837         rm -f z50c.cued.$in_fmt
838         echo OK
839
840         echo -n "testing --cue=1.1 $desc... "
841         run_flac $dopt -o z50c.cued.$in_fmt --cue=1.1 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
842         $CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.1 $desc"
843         rm -f z50c.cued.$in_fmt
844         echo OK
845
846         echo -n "testing --cue=1.1- $desc... "
847         run_flac $dopt -o z50c.cued.$in_fmt --cue=1.1- z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
848         $CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.1- $desc"
849         rm -f z50c.cued.$in_fmt
850         echo OK
851
852         echo -n "testing --cue=1.2 $desc... "
853         run_flac $dopt -o z50c.cued.$in_fmt --cue=1.2 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
854         $CMP 50c.skip10.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.2 $desc"
855         rm -f z50c.cued.$in_fmt
856         echo OK
857
858         echo -n "testing --cue=1.2- $desc... "
859         run_flac $dopt -o z50c.cued.$in_fmt --cue=1.2- z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
860         $CMP 50c.skip10.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.2- $desc"
861         rm -f z50c.cued.$in_fmt
862         echo OK
863
864         echo -n "testing --cue=1.4 $desc... "
865         run_flac $dopt -o z50c.cued.$in_fmt --cue=1.4 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
866         $CMP 50c.skip20.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.4 $desc"
867         rm -f z50c.cued.$in_fmt
868         echo OK
869
870         echo -n "testing --cue=1.4- $desc... "
871         run_flac $dopt -o z50c.cued.$in_fmt --cue=1.4- z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
872         $CMP 50c.skip20.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.4- $desc"
873         rm -f z50c.cued.$in_fmt
874         echo OK
875
876         echo -n "testing --cue=-5.0 $desc... "
877         run_flac $dopt -o z50c.cued.$in_fmt --cue=-5.0 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
878         $CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=-5.0 $desc"
879         rm -f z50c.cued.$in_fmt
880         echo OK
881
882         echo -n "testing --cue=-4.1 $desc... "
883         run_flac $dopt -o z50c.cued.$in_fmt --cue=-4.1 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
884         $CMP 50c.until40.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=-4.1 $desc"
885         rm -f z50c.cued.$in_fmt
886         echo OK
887
888         echo -n "testing --cue=-3.1 $desc... "
889         run_flac $dopt -o z50c.cued.$in_fmt --cue=-3.1 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
890         $CMP 50c.until40.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=-3.1 $desc"
891         rm -f z50c.cued.$in_fmt
892         echo OK
893
894         echo -n "testing --cue=-1.4 $desc... "
895         run_flac $dopt -o z50c.cued.$in_fmt --cue=-1.4 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
896         $CMP 50c.until30.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=-1.4 $desc"
897         rm -f z50c.cued.$in_fmt
898         echo OK
899
900         echo -n "testing --cue=1.0-5.0 $desc... "
901         run_flac $dopt -o z50c.cued.$in_fmt --cue=1.0-5.0 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
902         $CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.0-5.0 $desc"
903         rm -f z50c.cued.$in_fmt
904         echo OK
905
906         echo -n "testing --cue=1.1-5.0 $desc... "
907         run_flac $dopt -o z50c.cued.$in_fmt --cue=1.1-5.0 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
908         $CMP 50c.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.1-5.0 $desc"
909         rm -f z50c.cued.$in_fmt
910         echo OK
911
912         echo -n "testing --cue=1.2-4.1 $desc... "
913         run_flac $dopt -o z50c.cued.$in_fmt --cue=1.2-4.1 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
914         $CMP 50c.skip10.until40.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.2-4.1 $desc"
915         rm -f z50c.cued.$in_fmt
916         echo OK
917
918         echo -n "testing --cue=1.4-2.0 $desc... "
919         run_flac $dopt -o z50c.cued.$in_fmt --cue=1.4-2.0 z50c.cue.$out_fmt || die "ERROR decoding FLAC file $desc"
920         $CMP 50c.skip20.until30.$in_fmt z50c.cued.$in_fmt || die "ERROR: file mismatch for --cue=1.4-2.0 $desc"
921         rm -f z50c.cued.$in_fmt
922         echo OK
923
924         rm -f z50c.cue.$out_fmt
925 }
926
927 test_cue raw flac
928 test_cue wav flac
929 test_cue aiff flac
930 test_cue flac flac
931 #@@@if [ $has_ogg = yes ] ; then
932 #@@@    #@@@ doesn't work yet because md5cmp doesn't work because metaflac doesn't work on ogg flac yet
933 #@@@    test_cue ogg flac
934 #@@@fi
935
936 if [ $has_ogg = yes ] ; then
937         test_cue raw ogg
938         test_cue wav ogg
939         test_cue aiff ogg
940         #@@@ doesn't work yet because md5cmp doesn't work because metaflac doesn't work on ogg flac yet
941         #@@@test_cue flac ogg
942         #@@@test_cue ogg ogg
943 fi
944
945 ############################################################################
946 # test 'fixup' code that happens when a FLAC file with total_samples == 0
947 # in the STREAMINFO block is converted to WAVE or AIFF, requiring the
948 # decoder go back and fix up the chunk headers
949 ############################################################################
950
951 echo -n "WAVE fixup test... "
952
953 echo -n "prepare... "
954 convert_to_wav noise "$raw_eopt" "$wav_dopt" || die "ERROR creating reference WAVE"
955
956 echo -n "encode... "
957 # the pipe from 'cat' to 'flac' does not work on cygwin because of the EOF/
958 # binary-mode stdin problem, so we use an undocumented option to metaflac to
959 # set the total sample count to 0
960 if [ $is_win = yes ] ; then
961         run_flac $raw_eopt noise.raw -o fixup.flac || die "ERROR generating FLAC file"
962         run_metaflac --set-total-samples=0 fixup.flac 2> /dev/null
963 else
964         cat noise.raw | run_flac $raw_eopt - -c > fixup.flac || die "ERROR generating FLAC file"
965 fi
966
967 echo -n "decode... "
968 run_flac $wav_dopt fixup.flac -o fixup.wav || die "ERROR decoding FLAC file"
969
970 echo -n "compare... "
971 cmp noise.wav fixup.wav || die "ERROR: file mismatch"
972
973 echo OK
974 rm -f noise.wav fixup.wav fixup.flac
975
976 echo -n "AIFF fixup test... "
977
978 echo -n "prepare... "
979 convert_to_aiff noise "$raw_eopt" "$wav_dopt" || die "ERROR creating reference AIFF"
980
981 echo -n "encode... "
982 # the pipe from 'cat' to 'flac' does not work on cygwin because of the EOF/
983 # binary-mode stdin problem, so we use an undocumented option to metaflac to
984 # set the total sample count to 0
985 if [ $is_win = yes ] ; then
986         run_flac $raw_eopt noise.raw -o fixup.flac || die "ERROR generating FLAC file"
987         run_metaflac --set-total-samples=0 fixup.flac 2> /dev/null
988 else
989         cat noise.raw | run_flac $raw_eopt - -c > fixup.flac || die "ERROR generating FLAC file"
990 fi
991
992 echo -n "decode... "
993 run_flac $wav_dopt fixup.flac -o fixup.aiff || die "ERROR decoding FLAC file"
994
995 echo -n "compare... "
996 cmp noise.aiff fixup.aiff || die "ERROR: file mismatch"
997
998 echo OK
999 rm -f noise.aiff fixup.aiff fixup.flac
1000
1001
1002 ############################################################################
1003 # multi-file tests
1004 ############################################################################
1005
1006 echo "Generating multiple input files from noise..."
1007 multifile_format_decode="--endian=big --sign=signed"
1008 multifile_format_encode="$multifile_format_decode --sample-rate=44100 --bps=16 --channels=2 --no-padding"
1009 short_noise_cdda_samples=`expr $total_noise_cdda_samples / 8`
1010 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"
1011 run_flac --decode --force $SILENT shortnoise.flac -o shortnoise.raw --force-raw-format $multifile_format_decode || die "ERROR generating RAW file"
1012 run_flac --decode --force $SILENT shortnoise.flac || die "ERROR generating WAVE file"
1013 run_flac --decode --force $SILENT shortnoise.flac -o shortnoise.aiff || die "ERROR generating AIFF file"
1014 cp shortnoise.flac file0.flac
1015 cp shortnoise.flac file1.flac
1016 cp shortnoise.flac file2.flac
1017 rm -f shortnoise.flac
1018 cp shortnoise.wav file0.wav
1019 cp shortnoise.wav file1.wav
1020 cp shortnoise.wav file2.wav
1021 rm -f shortnoise.wav
1022 cp shortnoise.aiff file0.aiff
1023 cp shortnoise.aiff file1.aiff
1024 cp shortnoise.aiff file2.aiff
1025 rm -f shortnoise.aiff
1026 cp shortnoise.raw file0.raw
1027 cp shortnoise.raw file1.raw
1028 cp shortnoise.raw file2.raw
1029 rm -f shortnoise.raw
1030 # create authoritative sector-aligned files for comparison
1031 file0_samples=`expr \( $short_noise_cdda_samples / 588 \) \* 588`
1032 file0_remainder=`expr $short_noise_cdda_samples - $file0_samples`
1033 file1_samples=`expr \( \( $file0_remainder + $short_noise_cdda_samples \) / 588 \) \* 588`
1034 file1_remainder=`expr $file0_remainder + $short_noise_cdda_samples - $file1_samples`
1035 file1_samples=`expr $file1_samples - $file0_remainder`
1036 file2_samples=`expr \( \( $file1_remainder + $short_noise_cdda_samples \) / 588 \) \* 588`
1037 file2_remainder=`expr $file1_remainder + $short_noise_cdda_samples - $file2_samples`
1038 file2_samples=`expr $file2_samples - $file1_remainder`
1039 if [ $file2_remainder != '0' ] ; then
1040         file2_samples=`expr $file2_samples + $file2_remainder`
1041         file2_remainder=`expr 588 - $file2_remainder`
1042 fi
1043
1044 dd if=file0.raw ibs=4 count=$file0_samples of=file0s.raw 2>/dev/null || $dddie
1045 dd if=file0.raw ibs=4 count=$file0_remainder of=file1s.raw skip=$file0_samples 2>/dev/null || $dddie
1046 dd if=file1.raw ibs=4 count=$file1_samples of=z.raw 2>/dev/null || $dddie
1047 cat z.raw >> file1s.raw || die "ERROR: cat-ing sector-aligned files"
1048 dd if=file1.raw ibs=4 count=$file1_remainder of=file2s.raw skip=$file1_samples 2>/dev/null || $dddie
1049 dd if=file2.raw ibs=4 count=$file2_samples of=z.raw 2>/dev/null || $dddie
1050 cat z.raw >> file2s.raw || die "ERROR: cat-ing sector-aligned files"
1051 dd if=/dev/zero ibs=4 count=$file2_remainder of=z.raw 2>/dev/null || $dddie
1052 cat z.raw >> file2s.raw || die "ERROR: cat-ing sector-aligned files"
1053 rm -f z.raw
1054
1055 convert_to_wav file0s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned WAVE"
1056 convert_to_wav file1s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned WAVE"
1057 convert_to_wav file2s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned WAVE"
1058
1059 convert_to_aiff file0s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned AIFF"
1060 convert_to_aiff file1s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned AIFF"
1061 convert_to_aiff file2s "$multifile_format_encode --force" "$SILENT --force --decode" || die "ERROR creating authoritative sector-aligned AIFF"
1062
1063 test_multifile ()
1064 {
1065         input_type=$1
1066         streamtype=$2
1067         sector_align=$3
1068         encode_options="$4"
1069
1070         extra_encode_options=""
1071         extra_decode_options=""
1072         if [ $input_type = "raw" ] ; then
1073                 extra_encode_options="--force-raw-format $multifile_format_encode"
1074                 extra_decode_options="--force-raw-format $multifile_format_decode"
1075         else
1076                 if [ $input_type = "aiff" ] ; then
1077                         extra_decode_options="--force-aiff-format"
1078                 fi
1079         fi
1080
1081         if [ $streamtype = ogg ] ; then
1082                 suffix=oga
1083                 encode_options="$encode_options --ogg"
1084         else
1085                 suffix=flac
1086         fi
1087
1088         if [ $sector_align = sector_align ] ; then
1089                 encode_options="$encode_options --sector-align"
1090         fi
1091
1092         if [ $input_type = flac ] || [ $input_type = ogg ] ; then
1093                 CMP=md5cmp
1094         else
1095                 CMP=cmp
1096         fi
1097
1098         for n in 0 1 2 ; do
1099                 cp file$n.$input_type file${n}x.$input_type
1100         done
1101         run_flac --force $encode_options $extra_encode_options file0x.$input_type file1x.$input_type file2x.$input_type || die "ERROR"
1102         run_flac --force --decode $extra_decode_options file0x.$suffix file1x.$suffix file2x.$suffix || die "ERROR"
1103         if [ $sector_align != sector_align ] ; then
1104                 for n in 0 1 2 ; do
1105                         $CMP file$n.$input_type file${n}x.$input_type || die "ERROR: file mismatch on file #$n"
1106                 done
1107         else
1108                 for n in 0 1 2 ; do
1109                         $CMP file${n}s.$input_type file${n}x.$input_type || die "ERROR: file mismatch on file #$n"
1110                 done
1111         fi
1112         for n in 0 1 2 ; do
1113                 rm -f file${n}x.$suffix file${n}x.$input_type
1114         done
1115 }
1116
1117 input_types="raw wav aiff flac"
1118 #@@@ doesn't work yet because md5cmp doesn't work because metaflac doesn't work on ogg flac yet
1119 #@@@if [ $has_ogg = yes ] ; then
1120 #@@@    input_types="$input_types ogg"
1121 #@@@fi
1122 for input_type in $input_types ; do
1123         echo "Testing multiple $input_type files without verify..."
1124         test_multifile $input_type flac no_sector_align ""
1125
1126         echo "Testing multiple $input_type files with verify..."
1127         test_multifile $input_type flac no_sector_align "--verify"
1128
1129         if [ $input_type != flac ] && [ $input_type != ogg ] ; then # --sector-align not supported for FLAC input
1130                 echo "Testing multiple $input_type files with --sector-align, without verify..."
1131                 test_multifile $input_type flac sector_align ""
1132
1133                 echo "Testing multiple $input_type files with --sector-align, with verify..."
1134                 test_multifile $input_type flac sector_align "--verify"
1135         fi
1136
1137         if [ $has_ogg = yes ] ; then
1138                 echo "Testing multiple $input_type files with --ogg, without verify..."
1139                 test_multifile $input_type ogg no_sector_align ""
1140
1141                 echo "Testing multiple $input_type files with --ogg, with verify..."
1142                 test_multifile $input_type ogg no_sector_align "--verify"
1143
1144                 if [ $input_type != flac ] ; then # --sector-align not supported for FLAC input
1145                         echo "Testing multiple $input_type files with --ogg and --sector-align, without verify..."
1146                         test_multifile $input_type ogg sector_align ""
1147
1148                         echo "Testing multiple $input_type files with --ogg and --sector-align, with verify..."
1149                         test_multifile $input_type ogg sector_align "--verify"
1150                 fi
1151
1152                 echo "Testing multiple $input_type files with --ogg and --serial-number, with verify..."
1153                 test_multifile $input_type ogg no_sector_align "--serial-number=321 --verify"
1154         fi
1155 done
1156
1157
1158 ############################################################################
1159 # test --keep-foreign-metadata
1160 ############################################################################
1161
1162 echo "Testing --keep-foreign-metadata..."
1163
1164 rt_test_wav wacky1.wav '--keep-foreign-metadata'
1165 rt_test_wav wacky2.wav '--keep-foreign-metadata'
1166 rt_test_w64 wacky1.w64 '--keep-foreign-metadata'
1167 rt_test_w64 wacky2.w64 '--keep-foreign-metadata'
1168 rt_test_rf64 wacky1.rf64 '--keep-foreign-metadata'
1169 rt_test_rf64 wacky2.rf64 '--keep-foreign-metadata'
1170
1171
1172 ############################################################################
1173 # test the metadata-handling properties of flac-to-flac encoding
1174 ############################################################################
1175
1176 echo "Testing the metadata-handling properties of flac-to-flac encoding..."
1177
1178 testdir="flac-to-flac-metadata-test-files"
1179 filter ()
1180 {
1181         # minor danger, changing vendor strings might change the length of the
1182         # VORBIS_COMMENT block, but if we add "^  length: " to the patterns,
1183         # we lose info about PADDING size that we need
1184         grep -Ev '^  vendor string: |^  m..imum .....size: ' | sed -e 's/, stream_offset.*//'
1185 }
1186 flac2flac ()
1187 {
1188         file="$1"
1189         case="$2"
1190         args="$3"
1191         expect="$case-expect.meta"
1192         echo -n "$case... "
1193         run_flac $SILENT -f -o out.flac $args $file || die "ERROR encoding FLAC file"
1194         run_metaflac --list out.flac | filter > out.meta || die "ERROR listing metadata of output FLAC file"
1195         diff -q -w $expect out.meta 2>/dev/null || die "ERROR: metadata does not match expected $expect"
1196         echo OK
1197 }
1198
1199 #filter=', stream_offset.*|^  vendor string: |^  length: |^  m..imum .....size: '
1200 cd $testdir || die "ERROR changing to directory $testdir"
1201
1202 # case 00a: no alterations on a file with all metadata types, keep all metadata, in same order
1203 flac2flac input-SCVAUP.flac case00a ""
1204 # case 01a: on file with multiple PADDING blocks, they should be aggregated into one at the end
1205 flac2flac input-SCVPAP.flac case01a ""
1206 # case 01b: on file with multiple PADDING blocks and --no-padding specified, they should all be deleted
1207 flac2flac input-SCVPAP.flac case01b "--no-padding"
1208 # case 01c: on file with multiple PADDING blocks and -P specified, they should all be overwritten with -P value
1209 flac2flac input-SCVPAP.flac case01c "-P 1234"
1210 # case 01d: on file with no PADDING blocks, use -P setting
1211 flac2flac input-SCVA.flac case01d "-P 1234"
1212 # case 01e: on file with no PADDING blocks and no -P given, use default padding
1213 flac2flac input-SCVA.flac case01e ""
1214 # case 02a: on file with no VORBIS_COMMENT block, add new VORBIS_COMMENT
1215 flac2flac input-SCPAP.flac case02a ""
1216 # case 02b: on file with no VORBIS_COMMENT block and --tag, add new VORBIS_COMMENT with tags
1217 flac2flac input-SCPAP.flac case02b "--tag=artist=0"
1218 # case 02c: on file with VORBIS_COMMENT block and --tag, replace existing VORBIS_COMMENT with new tags
1219 flac2flac input-SCVAUP.flac case02c "$TOTALLY_SILENT --tag=artist=0"
1220 # case 03a: on file with no CUESHEET block and --cuesheet specified, add it
1221 flac2flac input-SVAUP.flac case03a "--cuesheet=input0.cue"
1222 # case 03b: on file with CUESHEET block and --cuesheet specified, overwrite existing CUESHEET
1223 flac2flac input-SCVAUP.flac case03b "$TOTALLY_SILENT --cuesheet=input0.cue"
1224 # case 03c: on file with CUESHEET block and size-changing option specified, drop existing CUESHEET
1225 flac2flac input-SCVAUP.flac case03c "$TOTALLY_SILENT --skip=1"
1226 # case 04a: on file with no SEEKTABLE block and --no-seektable specified, no SEEKTABLE
1227 flac2flac input-VA.flac case04a "--no-padding --no-seektable"
1228 # case 04b: on file with no SEEKTABLE block and -S specified, new SEEKTABLE
1229 flac2flac input-VA.flac case04b "--no-padding -S 5x"
1230 # case 04c: on file with no SEEKTABLE block and no seektable options specified, new SEEKTABLE with default points
1231 flac2flac input-VA.flac case04c "--no-padding"
1232 # case 04d: on file with SEEKTABLE block and --no-seektable specified, drop existing SEEKTABLE
1233 flac2flac input-SCVA.flac case04d "--no-padding --no-seektable"
1234 # case 04e: on file with SEEKTABLE block and -S specified, overwrite existing SEEKTABLE
1235 flac2flac input-SCVA.flac case04e "$TOTALLY_SILENT --no-padding -S 5x"
1236 # case 04f: on file with SEEKTABLE block and size-changing option specified, drop existing SEEKTABLE, new SEEKTABLE with default points
1237 #(already covered by case03c)
1238
1239 rm -f out.flac out.meta
1240
1241 #@@@ when metaflac handles ogg flac, duplicate flac2flac tests here
1242
1243 cd ..