summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik de Castro Lopo <erikd@mega-nerd.com>2017-05-27 16:07:35 +1000
committerErik de Castro Lopo <erikd@mega-nerd.com>2017-05-27 17:22:19 +1000
commitbb750734287a4079ca3de9ff85c71cc62160ac46 (patch)
tree0f66793f371634a4b75a4c8639230dfbfd481257
parentb762a20ace7c7771f87f63478bcee3cf51268cff (diff)
downloadflac-bb750734287a4079ca3de9ff85c71cc62160ac46.tar.gz
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.
-rw-r--r--src/flac/decode.c2
-rw-r--r--src/test_streams/main.c6
-rwxr-xr-xtest/write_iff.pl2
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