Skip to content

Commit b03178f

Browse files
committed
More test fixes
1 parent a0c5243 commit b03178f

File tree

4 files changed

+222
-221
lines changed

4 files changed

+222
-221
lines changed

modules/yup_audio_formats/format/yup_AudioFormatReader.cpp

Lines changed: 0 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -321,143 +321,4 @@ AudioChannelSet AudioFormatReader::getChannelLayout()
321321
return AudioChannelSet::discreteChannels ((int) numChannels);
322322
}
323323

324-
//==============================================================================
325-
void AudioFormatReader::ReadHelper::read (void* destData, const void* sourceData, int numSamples, int srcBytesPerSample, bool isFloatingPoint, bool isLittleEndian) noexcept
326-
{
327-
if (isFloatingPoint)
328-
{
329-
if (srcBytesPerSample == 4)
330-
{
331-
ReadHelper::readFloat32 ((float*) destData, sourceData, numSamples, isLittleEndian);
332-
}
333-
else if (srcBytesPerSample == 8)
334-
{
335-
ReadHelper::readFloat64 ((float*) destData, sourceData, numSamples, isLittleEndian);
336-
}
337-
else
338-
{
339-
jassertfalse; // Unsupported floating-point size
340-
}
341-
}
342-
else
343-
{
344-
if (srcBytesPerSample == 1)
345-
{
346-
ReadHelper::readInt8 ((int*) destData, sourceData, numSamples);
347-
}
348-
else if (srcBytesPerSample == 2)
349-
{
350-
ReadHelper::readInt16 ((int*) destData, sourceData, numSamples, isLittleEndian);
351-
}
352-
else if (srcBytesPerSample == 3)
353-
{
354-
ReadHelper::readInt24 ((int*) destData, sourceData, numSamples, isLittleEndian);
355-
}
356-
else if (srcBytesPerSample == 4)
357-
{
358-
ReadHelper::readInt32 ((int*) destData, sourceData, numSamples, isLittleEndian);
359-
}
360-
else
361-
{
362-
jassertfalse; // Unsupported bit depth
363-
}
364-
}
365-
}
366-
367-
void AudioFormatReader::ReadHelper::readInt8 (int* dest, const void* src, int numSamples) noexcept
368-
{
369-
const auto* source = static_cast<const char*> (src);
370-
371-
for (int i = 0; i < numSamples; ++i)
372-
dest[i] = ((int) source[i]) << 24;
373-
}
374-
375-
void AudioFormatReader::ReadHelper::readInt16 (int* dest, const void* src, int numSamples, bool littleEndian) noexcept
376-
{
377-
const auto* source = static_cast<const uint16*> (src);
378-
379-
if (littleEndian)
380-
{
381-
for (int i = 0; i < numSamples; ++i)
382-
dest[i] = (int) ByteOrder::swapIfBigEndian (source[i]) << 16;
383-
}
384-
else
385-
{
386-
for (int i = 0; i < numSamples; ++i)
387-
dest[i] = (int) ByteOrder::swapIfLittleEndian (source[i]) << 16;
388-
}
389-
}
390-
391-
void AudioFormatReader::ReadHelper::readInt24 (int* dest, const void* src, int numSamples, bool littleEndian) noexcept
392-
{
393-
const auto* source = static_cast<const uint8*> (src);
394-
395-
if (littleEndian)
396-
{
397-
for (int i = 0; i < numSamples; ++i)
398-
{
399-
dest[i] = (((int) source[i * 3 + 2]) << 24)
400-
| (((int) source[i * 3 + 1]) << 16)
401-
| (((int) source[i * 3]) << 8);
402-
}
403-
}
404-
else
405-
{
406-
for (int i = 0; i < numSamples; ++i)
407-
{
408-
dest[i] = (((int) source[i * 3]) << 24)
409-
| (((int) source[i * 3 + 1]) << 16)
410-
| (((int) source[i * 3 + 2]) << 8);
411-
}
412-
}
413-
}
414-
415-
void AudioFormatReader::ReadHelper::readInt32 (int* dest, const void* src, int numSamples, bool littleEndian) noexcept
416-
{
417-
const auto* source = static_cast<const uint32*> (src);
418-
419-
if (littleEndian)
420-
{
421-
for (int i = 0; i < numSamples; ++i)
422-
dest[i] = (int) ByteOrder::swapIfBigEndian (source[i]);
423-
}
424-
else
425-
{
426-
for (int i = 0; i < numSamples; ++i)
427-
dest[i] = (int) ByteOrder::swapIfLittleEndian (source[i]);
428-
}
429-
}
430-
431-
void AudioFormatReader::ReadHelper::readFloat32 (float* dest, const void* src, int numSamples, bool littleEndian) noexcept
432-
{
433-
const auto* source = static_cast<const float*> (src);
434-
435-
if (littleEndian)
436-
{
437-
for (int i = 0; i < numSamples; ++i)
438-
dest[i] = ByteOrder::swapIfBigEndian (source[i]);
439-
}
440-
else
441-
{
442-
for (int i = 0; i < numSamples; ++i)
443-
dest[i] = ByteOrder::swapIfLittleEndian (source[i]);
444-
}
445-
}
446-
447-
void AudioFormatReader::ReadHelper::readFloat64 (float* dest, const void* src, int numSamples, bool littleEndian) noexcept
448-
{
449-
const auto* source = static_cast<const double*> (src);
450-
451-
if (littleEndian)
452-
{
453-
for (int i = 0; i < numSamples; ++i)
454-
dest[i] = (float) ByteOrder::swapIfBigEndian (source[i]);
455-
}
456-
else
457-
{
458-
for (int i = 0; i < numSamples; ++i)
459-
dest[i] = (float) ByteOrder::swapIfLittleEndian (source[i]);
460-
}
461-
}
462-
463324
} // namespace yup

modules/yup_audio_formats/format/yup_AudioFormatReader.h

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -131,32 +131,6 @@ class YUP_API AudioFormatReader
131131
/** The input stream, for use by subclasses. */
132132
std::unique_ptr<InputStream> input;
133133

134-
//==============================================================================
135-
/** Used by subclasses to copy data to different formats. */
136-
struct ReadHelper
137-
{
138-
/** Reads samples from a file in the given format. */
139-
static void read (void* destData, const void* sourceData, int numSamples, int srcBytesPerSample, bool isFloatingPoint, bool isLittleEndian) noexcept;
140-
141-
/** Reads 8-bit signed samples. */
142-
static void readInt8 (int* dest, const void* src, int numSamples) noexcept;
143-
144-
/** Reads 16-bit samples. */
145-
static void readInt16 (int* dest, const void* src, int numSamples, bool littleEndian) noexcept;
146-
147-
/** Reads 24-bit samples. */
148-
static void readInt24 (int* dest, const void* src, int numSamples, bool littleEndian) noexcept;
149-
150-
/** Reads 32-bit samples. */
151-
static void readInt32 (int* dest, const void* src, int numSamples, bool littleEndian) noexcept;
152-
153-
/** Reads 32-bit float samples. */
154-
static void readFloat32 (float* dest, const void* src, int numSamples, bool littleEndian) noexcept;
155-
156-
/** Reads 64-bit float samples. */
157-
static void readFloat64 (float* dest, const void* src, int numSamples, bool littleEndian) noexcept;
158-
};
159-
160134
protected:
161135
/** Creates an AudioFormatReader object. */
162136
AudioFormatReader (InputStream* sourceStream, const String& formatName);

modules/yup_audio_formats/formats/yup_WaveAudioFormat.cpp

Lines changed: 87 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -138,21 +138,6 @@ bool WaveAudioFormatReader::readSamples (float* const* destChannels,
138138
const auto bytesPerSample = bitsPerSample / 8;
139139
const auto bytesPerFrame = numChannels * bytesPerSample;
140140

141-
// Read the data
142-
const auto framesToRead = (drwav_uint64) numSamples;
143-
const auto bytesToRead = framesToRead * bytesPerFrame;
144-
145-
if (bytesToRead > tempBufferSize)
146-
{
147-
tempBufferSize = bytesToRead;
148-
tempBuffer.allocate (bytesToRead, false);
149-
}
150-
151-
const auto framesRead = drwav_read_pcm_frames (&wav, framesToRead, tempBuffer.getData());
152-
153-
if (framesRead == 0)
154-
return false;
155-
156141
// Create output channel pointers offset by the start position
157142
HeapBlock<float*> offsetDestChannels;
158143
offsetDestChannels.malloc (numDestChannels);
@@ -162,68 +147,114 @@ bool WaveAudioFormatReader::readSamples (float* const* destChannels,
162147
offsetDestChannels[ch] = destChannels[ch] + startOffsetInDestBuffer;
163148
}
164149

165-
// Use AudioData::deinterleaveSamples to convert and deinterleave in one step
166-
if (bitsPerSample == 8)
150+
drwav_uint64 framesRead;
151+
152+
// Handle A-law and μ-law formats using dr_wav's specialized float conversion
153+
if (wav.translatedFormatTag == DR_WAVE_FORMAT_ALAW || wav.translatedFormatTag == DR_WAVE_FORMAT_MULAW)
167154
{
168-
using SourceFormat = AudioData::Format<AudioData::UInt8, AudioData::LittleEndian>;
169-
using DestFormat = AudioData::Format<AudioData::Float32, AudioData::NativeEndian>;
155+
// For companded formats, use dr_wav's direct float conversion which handles the decompanding properly
156+
const auto framesToRead = (drwav_uint64) numSamples;
157+
const auto floatsToRead = framesToRead * numChannels;
170158

171-
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const uint8*> (tempBuffer.getData()), (int) numChannels },
172-
AudioData::NonInterleavedDest<DestFormat> { offsetDestChannels.getData(), numDestChannels },
173-
(int) framesRead);
174-
}
175-
else if (bitsPerSample == 16)
176-
{
177-
using SourceFormat = AudioData::Format<AudioData::Int16, AudioData::LittleEndian>;
178-
using DestFormat = AudioData::Format<AudioData::Float32, AudioData::NativeEndian>;
159+
if (floatsToRead * sizeof(float) > tempBufferSize)
160+
{
161+
tempBufferSize = floatsToRead * sizeof(float);
162+
tempBuffer.allocate (tempBufferSize, false);
163+
}
179164

180-
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const uint16*> (tempBuffer.getData()), (int) numChannels },
181-
AudioData::NonInterleavedDest<DestFormat> { offsetDestChannels.getData(), numDestChannels },
182-
(int) framesRead);
183-
}
184-
else if (bitsPerSample == 24)
185-
{
186-
using SourceFormat = AudioData::Format<AudioData::Int24, AudioData::LittleEndian>;
165+
framesRead = drwav_read_pcm_frames_f32 (&wav, framesToRead, reinterpret_cast<float*> (tempBuffer.getData()));
166+
167+
if (framesRead == 0)
168+
return false;
169+
170+
// Deinterleave the float data directly
171+
using SourceFormat = AudioData::Format<AudioData::Float32, AudioData::NativeEndian>;
187172
using DestFormat = AudioData::Format<AudioData::Float32, AudioData::NativeEndian>;
188173

189-
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const char*> (tempBuffer.getData()), (int) numChannels },
174+
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const float*> (tempBuffer.getData()), (int) numChannels },
190175
AudioData::NonInterleavedDest<DestFormat> { offsetDestChannels.getData(), numDestChannels },
191176
(int) framesRead);
192177
}
193-
else if (bitsPerSample == 32)
178+
else
194179
{
195-
if (usesFloatingPointData)
180+
// For all other formats, use the existing approach with raw data and AudioData conversion
181+
const auto framesToRead = (drwav_uint64) numSamples;
182+
const auto bytesToRead = framesToRead * bytesPerFrame;
183+
184+
if (bytesToRead > tempBufferSize)
196185
{
197-
using SourceFormat = AudioData::Format<AudioData::Float32, AudioData::LittleEndian>;
186+
tempBufferSize = bytesToRead;
187+
tempBuffer.allocate (bytesToRead, false);
188+
}
189+
190+
framesRead = drwav_read_pcm_frames (&wav, framesToRead, tempBuffer.getData());
191+
192+
if (framesRead == 0)
193+
return false;
194+
195+
// Use AudioData::deinterleaveSamples to convert and deinterleave in one step
196+
if (bitsPerSample == 8)
197+
{
198+
using SourceFormat = AudioData::Format<AudioData::UInt8, AudioData::LittleEndian>;
198199
using DestFormat = AudioData::Format<AudioData::Float32, AudioData::NativeEndian>;
199200

200-
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const float*> (tempBuffer.getData()), (int) numChannels },
201+
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const uint8*> (tempBuffer.getData()), (int) numChannels },
201202
AudioData::NonInterleavedDest<DestFormat> { offsetDestChannels.getData(), numDestChannels },
202203
(int) framesRead);
203204
}
204-
else
205+
else if (bitsPerSample == 16)
205206
{
206-
using SourceFormat = AudioData::Format<AudioData::Int32, AudioData::LittleEndian>;
207+
using SourceFormat = AudioData::Format<AudioData::Int16, AudioData::LittleEndian>;
207208
using DestFormat = AudioData::Format<AudioData::Float32, AudioData::NativeEndian>;
208209

209-
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const uint32*> (tempBuffer.getData()), (int) numChannels },
210+
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const uint16*> (tempBuffer.getData()), (int) numChannels },
210211
AudioData::NonInterleavedDest<DestFormat> { offsetDestChannels.getData(), numDestChannels },
211212
(int) framesRead);
212213
}
213-
}
214-
else if (bitsPerSample == 64 && usesFloatingPointData)
215-
{
216-
// Handle 64-bit double precision float samples using AudioData
217-
using SourceFormat = AudioData::Format<AudioData::Float64, AudioData::LittleEndian>;
218-
using DestFormat = AudioData::Format<AudioData::Float32, AudioData::NativeEndian>;
219-
220-
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const double*> (tempBuffer.getData()), (int) numChannels },
221-
AudioData::NonInterleavedDest<DestFormat> { offsetDestChannels.getData(), numDestChannels },
222-
(int) framesRead);
223-
}
224-
else
225-
{
226-
return false;
214+
else if (bitsPerSample == 24)
215+
{
216+
using SourceFormat = AudioData::Format<AudioData::Int24, AudioData::LittleEndian>;
217+
using DestFormat = AudioData::Format<AudioData::Float32, AudioData::NativeEndian>;
218+
219+
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const char*> (tempBuffer.getData()), (int) numChannels },
220+
AudioData::NonInterleavedDest<DestFormat> { offsetDestChannels.getData(), numDestChannels },
221+
(int) framesRead);
222+
}
223+
else if (bitsPerSample == 32)
224+
{
225+
if (usesFloatingPointData)
226+
{
227+
using SourceFormat = AudioData::Format<AudioData::Float32, AudioData::LittleEndian>;
228+
using DestFormat = AudioData::Format<AudioData::Float32, AudioData::NativeEndian>;
229+
230+
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const float*> (tempBuffer.getData()), (int) numChannels },
231+
AudioData::NonInterleavedDest<DestFormat> { offsetDestChannels.getData(), numDestChannels },
232+
(int) framesRead);
233+
}
234+
else
235+
{
236+
using SourceFormat = AudioData::Format<AudioData::Int32, AudioData::LittleEndian>;
237+
using DestFormat = AudioData::Format<AudioData::Float32, AudioData::NativeEndian>;
238+
239+
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const uint32*> (tempBuffer.getData()), (int) numChannels },
240+
AudioData::NonInterleavedDest<DestFormat> { offsetDestChannels.getData(), numDestChannels },
241+
(int) framesRead);
242+
}
243+
}
244+
else if (bitsPerSample == 64 && usesFloatingPointData)
245+
{
246+
// Handle 64-bit double precision float samples using AudioData
247+
using SourceFormat = AudioData::Format<AudioData::Float64, AudioData::LittleEndian>;
248+
using DestFormat = AudioData::Format<AudioData::Float32, AudioData::NativeEndian>;
249+
250+
AudioData::deinterleaveSamples (AudioData::InterleavedSource<SourceFormat> { reinterpret_cast<const double*> (tempBuffer.getData()), (int) numChannels },
251+
AudioData::NonInterleavedDest<DestFormat> { offsetDestChannels.getData(), numDestChannels },
252+
(int) framesRead);
253+
}
254+
else
255+
{
256+
return false;
257+
}
227258
}
228259

229260
return true;

0 commit comments

Comments
 (0)