[flac-dev] awk vs. mawk

Jan Stary hans at stare.cz
Wed Dec 10 05:07:18 PST 2014


(ping, if there is any interest).

On Dec 03 13:21:16, hans at stare.cz wrote:
> On Nov 30 14:33:47, hans at stare.cz wrote:
> > 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.
> 
> Turns out it's a 20 year old bug in OpenBSD's awk:
> http://marc.info/?l=openbsd-misc&m=141735117703872&w=2
> http://marc.info/?l=openbsd-tech&m=141739334413710&w=2
> 
> Now ./test_replaygain.sh seems to work the same with awk, mawk and gawk
> on OpenBSD/amd64, OpenBSD/i386, and Debian/x86_64.
> 
> The diff below removes the check for mawk, and the comments
> about different AWKs, and just calls 'awk' for the script.
> 
> gawk 4.0.1 and 4.1.1 works for me too.
> Erik, do you please remember what exactly happened here?
> Does gawk >= still fail for you?
> https://git.xiph.org/?p=flac.git;a=commit;h=5797009fa2beb0426d74485e7624775e2e58e1d1
> 
> While there, remove the *=2 loop, exponentiation is in the language.
> 
> > 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?
> 
> This I haven't looked at yet, but I believe we could
> remove the awk sine generator altogether and just ask
> test_streams to make the streams.
> 
> Also, the current script stores the individual bytes
> of the 24bit sample in an array, just to print them
> back in reverse and feed them to flac --endian=big.
> Why is that? Why doesn't it just print the bytes
> from the lowest and feed them to --endian=little?
> 
> Also, the current script shifts the whole wave to the positive
> and feeds it to --sign=unsigned; why can't we just leave the wave
> as it is and feed it to --sign=signed?
> 
> 
> 	Jan
> 
> 
> --- test_replaygain.sh.orig	Wed Dec  3 12:11:46 2014
> +++ test_replaygain.sh	Wed Dec  3 12:23:24 2014
> @@ -81,34 +81,19 @@ fi
>  
>  check_flac
>  
> -
> -if mawk ; 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
> -
>  # Replay gain tests - Test the rates which have specific filter table entries
>  # and verify that harmonics can be processed correctly.
>  
>  tonegenerator ()
>  {
> -	# When using GAWK, use --lint=posix to identify non-POSIX awk usages.
> -    $AWK -- '
> +    awk -- '
>      BEGIN {
>              samplerate = '$1';
>  
>              tone = 1000;
>              duration = 1;
>              bitspersample = 24;
> -
> -            samplemidpoint = 1;
> -			for (sps = 0 ; sps < bitspersample - 1 ; sps++) {
> -				samplemidpoint *= 2;
> -			}
> -
> +	    samplemidpoint = 2^(bitspersample - 1);
>              samplerange = samplemidpoint - 1;
>  
>              pi = 4 * atan2(1,1);
> @@ -127,7 +112,7 @@ tonegenerator ()
>                      }
>              }
>  
> -    }' /dev/null |
> +    }' /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-dev mailing list
> flac-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/flac-dev


More information about the flac-dev mailing list