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