From 575c72a2e5435d7ffbbf6c3ff5f251dc7e50a32f Mon Sep 17 00:00:00 2001 From: Steven Atkinson Date: Fri, 15 Aug 2025 18:08:13 -0700 Subject: [PATCH] Fix 32-bit (fixed-point) PCM WAVE loading --- dsp/wav.cpp | 21 ++++++++++++++++++--- dsp/wav.h | 4 +++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/dsp/wav.cpp b/dsp/wav.cpp index c72fe81..c553746 100644 --- a/dsp/wav.cpp +++ b/dsp/wav.cpp @@ -306,7 +306,7 @@ dsp::wav::LoadReturnCode ReadDataChunk(std::ifstream& wavFile, WaveFileData& wfd if (audioFormat == AUDIO_FORMAT_IEEE) { if (wfd.fmtChunk.bitsPerSample == 32) - dsp::wav::_LoadSamples32(wavFile, wfd.dataChunk.size, audio); + dsp::wav::_LoadSamples32FloatingPoint(wavFile, wfd.dataChunk.size, audio); else { std::cerr << "Error: Unsupported bits per sample for IEEE files: " << wfd.fmtChunk.bitsPerSample << std::endl; @@ -320,7 +320,7 @@ dsp::wav::LoadReturnCode ReadDataChunk(std::ifstream& wavFile, WaveFileData& wfd else if (wfd.fmtChunk.bitsPerSample == 24) dsp::wav::_LoadSamples24(wavFile, wfd.dataChunk.size, audio); else if (wfd.fmtChunk.bitsPerSample == 32) - dsp::wav::_LoadSamples32(wavFile, wfd.dataChunk.size, audio); + dsp::wav::_LoadSamples32FixedPoint(wavFile, wfd.dataChunk.size, audio); else { std::cerr << "Error: Unsupported bits per sample for PCM files: " << wfd.fmtChunk.bitsPerSample << std::endl; @@ -455,10 +455,25 @@ int dsp::wav::_ReadSigned24BitInt(std::ifstream& stream) return value; } -void dsp::wav::_LoadSamples32(std::ifstream& wavFile, const int chunkSize, std::vector& samples) +void dsp::wav::_LoadSamples32FloatingPoint(std::ifstream& wavFile, const int chunkSize, std::vector& samples) { // NOTE: 32-bit is float. samples.resize(chunkSize / 4); // 32 bits (4 bytes) per sample // Read the samples from the file into the array wavFile.read(reinterpret_cast(samples.data()), chunkSize); } + +void dsp::wav::_LoadSamples32FixedPoint(std::ifstream& wavFile, const int chunkSize, std::vector& samples) +{ + // Allocate an array to hold the samples + std::vector tmp(chunkSize / 4); // 32 bits (4 bytes) per sample + + // Read the samples from the file into the array + wavFile.read(reinterpret_cast(tmp.data()), chunkSize); + + // Copy into the return array + const float scale = 1.0 / ((double)(1 << 31)); // 2^31 for 32-bit fixed point + samples.resize(tmp.size()); + for (auto i = 0; i < samples.size(); i++) + samples[i] = scale * ((float)tmp[i]); +} diff --git a/dsp/wav.h b/dsp/wav.h index 772565e..83f3ef8 100644 --- a/dsp/wav.h +++ b/dsp/wav.h @@ -45,7 +45,9 @@ void _LoadSamples16(std::ifstream& wavFile, const int chunkSize, std::vector& samples); // Load samples, 32-bit -void _LoadSamples32(std::ifstream& wavFile, const int chunkSize, std::vector& samples); +void _LoadSamples32FloatingPoint(std::ifstream& wavFile, const int chunkSize, std::vector& samples); +// Load samples, 32-bit fixed point +void _LoadSamples32FixedPoint(std::ifstream& wavFile, const int chunkSize, std::vector& samples); // Read in a 24-bit sample and convert it to an int int _ReadSigned24BitInt(std::ifstream& stream);