From bb750734287a4079ca3de9ff85c71cc62160ac46 Mon Sep 17 00:00:00 2001 From: Erik de Castro Lopo Date: Sat, 27 May 2017 16:07:35 +1000 Subject: [PATCH] flac: Use WAVEFORMATEXTENSIBLE when bps != (8|16) When decoding to WAV, the legacy wFormatTag of WAVE_FORMAT_PCM should only be used if the bitwidth is 8 or 16. For all other bitwidths, use WAVEFORMATEXTENSIBLE. Two of the test programs/scripts also needed updating. --- src/flac/decode.c | 2 +- src/test_streams/main.c | 6 +----- test/write_iff.pl | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/flac/decode.c b/src/flac/decode.c index 88bc2799..de7773ec 100644 --- a/src/flac/decode.c +++ b/src/flac/decode.c @@ -582,7 +582,7 @@ FLAC__bool write_iff_headers(FILE *f, DecoderSession *decoder_session, FLAC__uin (format == FORMAT_WAVE || format == FORMAT_WAVE64 || format == FORMAT_RF64) && ( (decoder_session->channel_mask != 0 && decoder_session->channel_mask != 0x0004 && decoder_session->channel_mask != 0x0003) || - decoder_session->bps%8 || + (decoder_session->bps != 8 && decoder_session->bps != 16) || decoder_session->channels > 2 ); const FLAC__uint64 data_size = samples * decoder_session->channels * ((decoder_session->bps+7)/8); diff --git a/src/test_streams/main.c b/src/test_streams/main.c index 5c053b68..0b2dc5ed 100644 --- a/src/test_streams/main.c +++ b/src/test_streams/main.c @@ -718,11 +718,7 @@ foo: /* flavor is: 0:WAVE, 1:RF64, 2:WAVE64 */ static FLAC__bool generate_wav(const char *filename, unsigned sample_rate, unsigned channels, unsigned bps, unsigned samples, FLAC__bool strict, int flavor) { - const FLAC__bool waveformatextensible = strict && (channels > 2 || (bps%8)); - /* ^^^^^^^ - * (bps%8) allows 24 bps which is technically supposed to be WAVEFORMATEXTENSIBLE but we - * write 24bps as WAVEFORMATEX since it's unambiguous and matches how flac writes it - */ + const FLAC__bool waveformatextensible = strict && (channels > 2 || (bps != 8 && bps != 16)); const unsigned bytes_per_sample = (bps+7)/8; const unsigned shift = (bps%8)? 8 - (bps%8) : 0; diff --git a/test/write_iff.pl b/test/write_iff.pl index b423ab31..f9efa74d 100755 --- a/test/write_iff.pl +++ b/test/write_iff.pl @@ -40,7 +40,7 @@ my $bigdatasize = $bigsamples * $bps * $channels; my $padding = int($bigdatasize & 1); # for aiff/wave/rf64 chunk alignment my $padding8 = 8 - int($bigdatasize & 7); $padding8 = 0 if $padding8 == 8; # for wave64 alignment # wave-ish file needs to be WAVEFORMATEXTENSIBLE? -my $wavx = ($format eq 'wave' || $format eq 'wave64' || $format eq 'rf64') && ($channels > 2); +my $wavx = ($format eq 'wave' || $format eq 'wave64' || $format eq 'rf64') && ($channels > 2 || ($bps != 8 && $bps != 16)); # write header -- 2.11.4.GIT