test_replaygain.sh 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #!/bin/sh -e
  2. # FLAC - Free Lossless Audio Codec
  3. # Copyright (C) 2002-2009 Josh Coalson
  4. # Copyright (C) 2011-2023 Xiph.Org Foundation
  5. #
  6. # This file is part the FLAC project. FLAC is comprised of several
  7. # components distributed under different 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. . ./common.sh
  20. PATH="$(pwd)/../src/flac:$PATH"
  21. PATH="$(pwd)/../src/metaflac:$PATH"
  22. PATH="$(pwd)/../objs/$BUILD/bin:$PATH"
  23. if echo a | (grep -E '(a|b)') >/dev/null 2>&1
  24. then EGREP='grep -E'
  25. else EGREP='egrep'
  26. fi
  27. testdir="metaflac-test-files"
  28. flacfile="replaygain.flac"
  29. run_flac ()
  30. {
  31. if [ "$FLAC__TEST_WITH_VALGRIND" = yes ] ; then
  32. echo "valgrind --leak-check=yes --show-reachable=yes --num-callers=50 flac $*" >>test_replaygain.valgrind.log
  33. valgrind --leak-check=yes --show-reachable=yes --num-callers=50 --log-fd=4 flac --no-error-on-compression-fail $* 4>>test_replaygain.valgrind.log
  34. else
  35. flac${EXE} --no-error-on-compression-fail $*
  36. fi
  37. }
  38. run_metaflac ()
  39. {
  40. if [ "$FLAC__TEST_WITH_VALGRIND" = yes ] ; then
  41. echo "valgrind --leak-check=yes --show-reachable=yes --num-callers=50 metaflac $*" >>test_replaygain.valgrind.log
  42. valgrind --leak-check=yes --show-reachable=yes --num-callers=50 --log-fd=4 metaflac $* 4>>test_replaygain.valgrind.log
  43. else
  44. metaflac${EXE} $*
  45. fi
  46. }
  47. run_metaflac_silent ()
  48. {
  49. if [ -z "$SILENT" ] ; then
  50. run_metaflac $*
  51. else
  52. if [ "$FLAC__TEST_WITH_VALGRIND" = yes ] ; then
  53. echo "valgrind --leak-check=yes --show-reachable=yes --num-callers=50 metaflac $*" >>test_replaygain.valgrind.log
  54. valgrind --leak-check=yes --show-reachable=yes --num-callers=50 --log-fd=4 metaflac $* 2>/dev/null 4>>test_replaygain.valgrind.log
  55. else
  56. metaflac${EXE} $* 2>/dev/null
  57. fi
  58. fi
  59. }
  60. check_flac ()
  61. {
  62. run_flac --silent --test $flacfile || die "ERROR in $flacfile" 1>&2
  63. }
  64. echo "Generating stream..."
  65. bytes=80000
  66. if dd if=/dev/zero ibs=1 count=$bytes 2>/dev/null | flac${EXE} --silent --force --verify -0 --input-size=$bytes --output-name=$flacfile --force-raw-format --endian=big --sign=signed --channels=1 --bps=8 --sample-rate=8000 - ; then
  67. chmod +w $flacfile
  68. else
  69. die "ERROR during generation"
  70. fi
  71. check_flac
  72. # Replay gain tests - Test the rates which have specific filter table entries
  73. # and verify that harmonics can be processed correctly.
  74. tonegenerator ()
  75. {
  76. flac${EXE} --force --output-name=$2 --silent --no-seektable --no-error-on-compression-fail rpg-tone-$1.wav
  77. }
  78. REPLAYGAIN_FREQ=
  79. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 8000/-12.73"
  80. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 11025/-12.91"
  81. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 12000/-12.98"
  82. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 16000/-13.27"
  83. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 18900/-13.41"
  84. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 22050/-13.77"
  85. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 24000/-13.82"
  86. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 28000/-14.06"
  87. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 32000/-14.08"
  88. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 36000/-14.12"
  89. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 37800/-14.18"
  90. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 44100/-14.17"
  91. REPLAYGAIN_FREQ="$REPLAYGAIN_FREQ 48000/-14.16:1:2:4"
  92. set -e
  93. for ACTION in $REPLAYGAIN_FREQ ; do
  94. if [ -n "${ACTION##*:*}" ] ; then
  95. HARMONICS=1
  96. else
  97. HARMONICS="${ACTION#*:}"
  98. fi
  99. FREQ="${ACTION%%/*}"
  100. GAIN="${ACTION#*/}"
  101. GAIN="${GAIN%%:*}"
  102. while [ -n "$HARMONICS" ] ; do
  103. MULTIPLE="${HARMONICS%%:*}"
  104. if [ "$MULTIPLE" = "$HARMONICS" ] ; then
  105. HARMONICS=
  106. else
  107. HARMONICS="${HARMONICS#*:}"
  108. fi
  109. RATE=$((MULTIPLE * FREQ))
  110. [ $MULTIPLE -eq 1 -o -n "${REPLAYGAIN_FREQ##* $RATE/*}" ] || break
  111. echo $ECHO_N "Testing FLAC replaygain $RATE ($FREQ x $MULTIPLE) ... " $ECHO_C
  112. tonegenerator $RATE $flacfile
  113. run_metaflac --scan-replay-gain $flacfile
  114. run_metaflac --add-replay-gain $flacfile
  115. run_metaflac --list $flacfile | grep "REPLAYGAIN.*GAIN=" |
  116. while read -r REPLAYGAIN ; do
  117. MEASUREDGAIN="${REPLAYGAIN##*=}"
  118. MEASUREDGAIN="${MEASUREDGAIN%% *}"
  119. if [ x"$MEASUREDGAIN" != x"$GAIN" ] ; then
  120. die "ERROR, Expected $GAIN db instead of $REPLAYGAIN"
  121. fi
  122. done
  123. echo OK
  124. done
  125. done
  126. rm -f $testdir/out.flac $testdir/out.meta
  127. exit 0