[flac-dev] awk vs. mawk
Jan Stary
hans at stare.cz
Sun Nov 30 05:33:47 PST 2014
On Nov 26 22:39:27, hans at stare.cz wrote:
> ./test_replaygain.sh fails for me in tonegenerator(), saying:
>
> ./test_replaygain.sh[91]: mawk: not found
> Testing FLAC replaygain 8000 (8000 x 1) ... -: ERROR: got partial sample
>
> Apparently, the tone-generating awk script does not work with
> my system's awk, which is "awk version 20110810" as distributed
> with current OpenBSD 5.6 GENERIC.MP#610 amd64.
> With mawk-1.3.4.20140914 it works fine
> (and ./test_replaygain.sh passes).
>
> Can anyone please shed some light on what's mawk-spacific
> about that awk script? It seems to be just a sine-generator.
> Ha! If the final
> printf("%c", byte[bx]);
> is changed to
> printf("%d", byte[bx]);
> the results produced by mawk and awk are identical.
> So the diference must be just that mawk printf's "%c" differently.
> the two sequences of samples are identical as sequences of integers
> - they just differ in the way they are printed out with AWK's printf("%c")
> as opposed to MAWK's printf("%c").
>
> I'll try to find time and look into it; this shouldn't be hard,
> we just want to generate a sine wave portably.
Indeed, the difference seems to be in how my systems AWK,
as opposed to MAWK, printf's zero bytes.
With mawk, a printf("%c") of a zero is always a zero byte (^@) in the output.
With my system awk, it's sometimes a zero byte, and sometimes nothing.
There are no other differences in the two outputs.
As AWK variables are not typed, I suspect the zero byte might
*sometimes* be considered a delimiter of an empty string.
But that's where my incoplete knowledge of AWK chimes in.
Anyway, the whole point of that AWK script is to produce a raw sine wave.
Why are we doing it with AWK in the first place? Surely the FLAC
distrubution contains tools to produce test sine waves,
e.g. src/test_streams/main.c contains some, used in test_streams.sh.
Can we make test_replaygain.sh also use the produced sine waves,
instead of generating its own with AWK?
Anyway, below is a patch to test_replaygain.sh
that replaces the current AWK script with a simpler one.
Is there a specific point in making the stream big-endian,
or shifting it to positive values to have it unsigned?
While this is a simpler script, it produces a different wave,
so this breaks the precious pre-computed *GAIN values
which we test against, right?
It also leaves the test waves unremoved;
this will go in a later version when I figure it out.
Jan
--- test_replaygain.sh.orig Fri Nov 28 18:15:11 2014
+++ test_replaygain.sh Sun Nov 30 14:17:39 2014
@@ -82,11 +82,9 @@ fi
check_flac
-if mawk ; then
+if `which mawk >/dev/null 2>&1` ; then
AWK=mawk
else
- # Really hope awk is not gawk, because the following AWK script doesn't
- # work correctly with gawk 4.0.1 but did with earlier versions.
AWK=awk
fi
@@ -95,41 +93,28 @@ else
tonegenerator ()
{
- # When using GAWK, use --lint=posix to identify non-POSIX awk usages.
- $AWK -- '
- BEGIN {
- samplerate = '$1';
+ $AWK '
+ BEGIN {
+ tone = 1000;
+ duration = 1;
+ samplerate = '$1';
+ pi = 4 * atan2(1,1);
- tone = 1000;
- duration = 1;
- bitspersample = 24;
+ bitspersample = 24;
+ amplitude = 2^bitpersample - 1;
- samplemidpoint = 1;
- for (sps = 0 ; sps < bitspersample - 1 ; sps++) {
- samplemidpoint *= 2;
+ for (s = 0; s < duration * samplerate; s++) {
+ sample = sin(2 * pi * tone * s / samplerate);
+ sample = int(amplitude * sample);
+ for (b = 0; b < bitspersample/8; b++) {
+ printf("%c", sample % 256);
+ sample /= 256;
}
+ }
- samplerange = samplemidpoint - 1;
-
- pi = 4 * atan2(1,1);
-
- for (ix = 0; ix < duration * samplerate; ++ix) {
- sample = sin(2 * pi * tone * ix / samplerate);
- sample *= samplerange;
- sample += samplemidpoint;
- sample = int(sample);
- for (bx = 0; bx < bitspersample/8; ++bx) {
- byte[bx] = sample % 256;
- sample /= 256;
- }
- while (bx--) {
- printf("%c", byte[bx]);
- }
- }
-
- }' /dev/null |
- flac${EXE} --silent --no-error-on-compression-fail --force-raw-format \
- --endian=big --channels=1 --bps=24 --sample-rate=$1 --sign=unsigned -
+ }' \
+ | flac${EXE} --silent --no-error-on-compression-fail --force-raw-format\
+ --endian=little --channels=1 --bps=24 --sample-rate=$1 --sign=signed -
}
REPLAYGAIN_FREQ=
@@ -168,6 +153,7 @@ for ACTION in $REPLAYGAIN_FREQ ; do
RATE=$(($MULTIPLE * FREQ))
[ $MULTIPLE -eq 1 -o -n "${REPLAYGAIN_FREQ##* $RATE/*}" ] || break
echo -n "Testing FLAC replaygain $RATE ($FREQ x $MULTIPLE) ... "
+ flacfile=$AWK.$RATE.replaygain.flac
tonegenerator $RATE > $flacfile
run_metaflac --add-replay-gain $flacfile
run_metaflac --list $flacfile | grep REPLAYGAIN.*GAIN= |
@@ -175,9 +161,11 @@ for ACTION in $REPLAYGAIN_FREQ ; do
MEASUREDGAIN="${REPLAYGAIN##*=}"
MEASUREDGAIN="${MEASUREDGAIN%% *}"
if [ x"$MEASUREDGAIN" != x"$GAIN" ] ; then
- die "ERROR, Expected $GAIN db instead of $REPLAYGAIN"
+ #die "ERROR, Expected $GAIN db instead of $REPLAYGAIN"
+ echo "ERROR, Expected $GAIN db instead of $REPLAYGAIN"
fi
done
+ #rm -f $flacfile
echo OK
done
done
More information about the flac-dev
mailing list