From bfb3fd8776cb89b5ccb042cf28e791f42927dc8f Mon Sep 17 00:00:00 2001 From: David Adams Date: Fri, 9 May 2025 22:50:00 -0700 Subject: [PATCH 1/3] Samples from an AudioFile are cast to float and a reference is taken *before* reinterpret_cat to int32_t& followed by cast to int32_t when an AudioFile is saved to IEEE 32-bit float WAV. --- AudioFile.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/AudioFile.h b/AudioFile.h index bc71da8..2b2ec4a 100644 --- a/AudioFile.h +++ b/AudioFile.h @@ -995,7 +995,16 @@ bool AudioFile::encodeWaveFile (std::vector& fileData) int32_t sampleAsInt; if (audioFormat == WavAudioFormat::IEEEFloat) - sampleAsInt = (int32_t) reinterpret_cast (samples[channel][i]); + { + if constexpr (std::is_same_v) + sampleAsInt = (int32_t) reinterpret_cast (samples[channel][i]); + else if constexpr (std::is_same_v) + { + auto sampleAsFloat = (float) samples[channel][i]; + float& referenceToSample = sampleAsFloat; + sampleAsInt = (int32_t) reinterpret_cast (referenceToSample); + } + } else // assume PCM sampleAsInt = AudioSampleConverter::sampleToThirtyTwoBitInt (samples[channel][i]); From 7c07038c9b58a46ee56de42ae92347bf79b740b9 Mon Sep 17 00:00:00 2001 From: Adam Stark Date: Fri, 30 May 2025 22:48:54 +0100 Subject: [PATCH 2/3] Ensure we are re-reading and testing 32-bit files and test double precision --- tests/FileWritingTests.cpp | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/tests/FileWritingTests.cpp b/tests/FileWritingTests.cpp index 434d397..33f92a1 100644 --- a/tests/FileWritingTests.cpp +++ b/tests/FileWritingTests.cpp @@ -85,10 +85,9 @@ void writeTestAudioFile (int numChannels, int sampleRate, int bitDepth, AudioFil REQUIRE (OK); //----------------------------------------------------------------- - // for some key bit depths and mono/stereo files, read in the audio file - // we just wrote and do a sample-by-sample comparison to confirm we are - // writing good files - if ((bitDepth == 8 || bitDepth == 16 || bitDepth == 24) && numChannels <= 2) + // read in the audio file we just wrote and do a sample-by-sample + // comparison to confirm we are writing good files + if (numChannels <= 2) { AudioFile audioFileReader; audioFileReader.load (filePath); @@ -136,13 +135,38 @@ TEST_SUITE ("Writing Tests") for (auto& format : audioFormats) { auto fmt_str = format == AudioFileFormat::Wave ? "wav" : "aiff"; - std::cerr << sampleRate << "Hz " << bitDepth << "-bit " << channels << " " << fmt_str << " (floating point)" << std::endl; + std::cerr << sampleRate << "Hz " << bitDepth << "-bit " << channels << " " << fmt_str << " (float)" << std::endl; writeTestAudioFile (channels, sampleRate, bitDepth, format); } } } } } + + //============================================================= + TEST_CASE ("WritingTest::WriteSineToneToManyFormats::DoublePrecision") + { + std::vector sampleRates = {22050, 44100, 48000, 96000}; + std::vector bitDepths = {8, 16, 24, 32}; + std::vector numChannels = {1, 2, 8}; + std::vector audioFormats = {AudioFileFormat::Wave, AudioFileFormat::Aiff}; + + for (auto& sampleRate : sampleRates) + { + for (auto& bitDepth : bitDepths) + { + for (auto& channels : numChannels) + { + for (auto& format : audioFormats) + { + auto fmt_str = format == AudioFileFormat::Wave ? "wav" : "aiff"; + std::cerr << sampleRate << "Hz " << bitDepth << "-bit " << channels << " " << fmt_str << " (double)" << std::endl; + writeTestAudioFile (channels, sampleRate, bitDepth, format); + } + } + } + } + } //============================================================= TEST_CASE ("WritingTest::WriteSineToneToManyFormats::Integer") From ee362897684e55935b0ee694a70dd48a46c28dce Mon Sep 17 00:00:00 2001 From: Adam Stark Date: Fri, 30 May 2025 22:49:09 +0100 Subject: [PATCH 3/3] style: add brackets for consistency --- AudioFile.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AudioFile.h b/AudioFile.h index 2b2ec4a..3897949 100644 --- a/AudioFile.h +++ b/AudioFile.h @@ -997,7 +997,9 @@ bool AudioFile::encodeWaveFile (std::vector& fileData) if (audioFormat == WavAudioFormat::IEEEFloat) { if constexpr (std::is_same_v) + { sampleAsInt = (int32_t) reinterpret_cast (samples[channel][i]); + } else if constexpr (std::is_same_v) { auto sampleAsFloat = (float) samples[channel][i]; @@ -1006,7 +1008,9 @@ bool AudioFile::encodeWaveFile (std::vector& fileData) } } else // assume PCM + { sampleAsInt = AudioSampleConverter::sampleToThirtyTwoBitInt (samples[channel][i]); + } addInt32ToFileData (fileData, sampleAsInt, Endianness::LittleEndian); }