From 432c74a2e78b89baca6cec8d2e80faac41b1ce16 Mon Sep 17 00:00:00 2001 From: Robin Eklind Date: Sun, 20 Feb 2022 14:32:34 +0100 Subject: [PATCH] cmd/flac2wav: fix encoding of 8-bps WAV; should use uint8, was using signed int ref: https://github.com/mewkiz/flac/issues/51#issuecomment-1046183409 Updates #mewkiz/flac#51. --- cmd/flac2wav/flac2wav.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/cmd/flac2wav/flac2wav.go b/cmd/flac2wav/flac2wav.go index 2ce652e..1afca46 100644 --- a/cmd/flac2wav/flac2wav.go +++ b/cmd/flac2wav/flac2wav.go @@ -81,7 +81,18 @@ func flac2wav(path string, force bool) error { data = data[:0] for i := 0; i < frame.Subframes[0].NSamples; i++ { for _, subframe := range frame.Subframes { - data = append(data, int(subframe.Samples[i])) + sample := int(subframe.Samples[i]) + if frame.BitsPerSample == 8 { + // WAV files with 8 bit-per-sample are stored with unsigned + // values, WAV files with more than 8 bit-per-sample are stored + // as signed values (ref page 59-60 of [1]). + // + // [1]: http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Docs/riffmci.pdf + // ref: https://github.com/mewkiz/flac/issues/51#issuecomment-1046183409 + const midpointValue = 0x80 + sample += midpointValue + } + data = append(data, sample) } } buf := &audio.IntBuffer{