31 auto maxVal = (double) 0x7fff;
32 auto intData =
static_cast<char*
> (dest);
34 if (dest != (
void*) source || destBytesPerSample <= 4)
36 for (
int i = 0;
i < numSamples; ++
i)
39 intData += destBytesPerSample;
44 intData += destBytesPerSample * numSamples;
46 for (
int i = numSamples; --
i >= 0;)
48 intData -= destBytesPerSample;
56 auto maxVal = (double) 0x7fff;
57 auto intData =
static_cast<char*
> (dest);
59 if (dest != (
void*) source || destBytesPerSample <= 4)
61 for (
int i = 0;
i < numSamples; ++
i)
64 intData += destBytesPerSample;
69 intData += destBytesPerSample * numSamples;
71 for (
int i = numSamples; --
i >= 0;)
73 intData -= destBytesPerSample;
81 auto maxVal = (double) 0x7fffff;
82 auto intData =
static_cast<char*
> (dest);
84 if (dest != (
void*) source || destBytesPerSample <= 4)
86 for (
int i = 0;
i < numSamples; ++
i)
89 intData += destBytesPerSample;
94 intData += destBytesPerSample * numSamples;
96 for (
int i = numSamples; --
i >= 0;)
98 intData -= destBytesPerSample;
106 auto maxVal = (double) 0x7fffff;
107 auto intData =
static_cast<char*
> (dest);
109 if (dest != (
void*) source || destBytesPerSample <= 4)
111 for (
int i = 0;
i < numSamples; ++
i)
114 intData += destBytesPerSample;
119 intData += destBytesPerSample * numSamples;
121 for (
int i = numSamples; --
i >= 0;)
123 intData -= destBytesPerSample;
131 auto maxVal = (double) 0x7fffffff;
132 auto intData =
static_cast<char*
> (dest);
134 if (dest != (
void*) source || destBytesPerSample <= 4)
136 for (
int i = 0;
i < numSamples; ++
i)
139 intData += destBytesPerSample;
144 intData += destBytesPerSample * numSamples;
146 for (
int i = numSamples; --
i >= 0;)
148 intData -= destBytesPerSample;
156 auto maxVal = (double) 0x7fffffff;
157 auto intData =
static_cast<char*
> (dest);
159 if (dest != (
void*) source || destBytesPerSample <= 4)
161 for (
int i = 0;
i < numSamples; ++
i)
164 intData += destBytesPerSample;
169 intData += destBytesPerSample * numSamples;
171 for (
int i = numSamples; --
i >= 0;)
173 intData -= destBytesPerSample;
181 jassert (dest != (
void*) source || destBytesPerSample <= 4);
183 char*
d =
static_cast<char*
> (dest);
185 for (
int i = 0;
i < numSamples; ++
i)
193 d += destBytesPerSample;
199 jassert (dest != (
void*) source || destBytesPerSample <= 4);
201 auto d =
static_cast<char*
> (dest);
203 for (
int i = 0;
i < numSamples; ++
i)
207 #if JUCE_LITTLE_ENDIAN
211 d += destBytesPerSample;
218 const float scale = 1.0f / 0x7fff;
219 auto intData =
static_cast<const char*
> (source);
221 if (source != (
void*) dest || srcBytesPerSample >= 4)
223 for (
int i = 0;
i < numSamples; ++
i)
226 intData += srcBytesPerSample;
231 intData += srcBytesPerSample * numSamples;
233 for (
int i = numSamples; --
i >= 0;)
235 intData -= srcBytesPerSample;
243 const float scale = 1.0f / 0x7fff;
244 auto intData =
static_cast<const char*
> (source);
246 if (source != (
void*) dest || srcBytesPerSample >= 4)
248 for (
int i = 0;
i < numSamples; ++
i)
251 intData += srcBytesPerSample;
256 intData += srcBytesPerSample * numSamples;
258 for (
int i = numSamples; --
i >= 0;)
260 intData -= srcBytesPerSample;
268 const float scale = 1.0f / 0x7fffff;
269 auto intData =
static_cast<const char*
> (source);
271 if (source != (
void*) dest || srcBytesPerSample >= 4)
273 for (
int i = 0;
i < numSamples; ++
i)
276 intData += srcBytesPerSample;
281 intData += srcBytesPerSample * numSamples;
283 for (
int i = numSamples; --
i >= 0;)
285 intData -= srcBytesPerSample;
293 const float scale = 1.0f / 0x7fffff;
294 auto intData =
static_cast<const char*
> (source);
296 if (source != (
void*) dest || srcBytesPerSample >= 4)
298 for (
int i = 0;
i < numSamples; ++
i)
301 intData += srcBytesPerSample;
306 intData += srcBytesPerSample * numSamples;
308 for (
int i = numSamples; --
i >= 0;)
310 intData -= srcBytesPerSample;
318 const float scale = 1.0f / (float) 0x7fffffff;
319 auto intData =
static_cast<const char*
> (source);
321 if (source != (
void*) dest || srcBytesPerSample >= 4)
323 for (
int i = 0;
i < numSamples; ++
i)
326 intData += srcBytesPerSample;
331 intData += srcBytesPerSample * numSamples;
333 for (
int i = numSamples; --
i >= 0;)
335 intData -= srcBytesPerSample;
343 const float scale = 1.0f / (float) 0x7fffffff;
344 auto intData =
static_cast<const char*
> (source);
346 if (source != (
void*) dest || srcBytesPerSample >= 4)
348 for (
int i = 0;
i < numSamples; ++
i)
351 intData += srcBytesPerSample;
356 intData += srcBytesPerSample * numSamples;
358 for (
int i = numSamples; --
i >= 0;)
360 intData -= srcBytesPerSample;
368 auto s =
static_cast<const char*
> (source);
370 for (
int i = 0;
i < numSamples; ++
i)
379 s += srcBytesPerSample;
385 auto s =
static_cast<const char*
> (source);
387 for (
int i = 0;
i < numSamples; ++
i)
391 #if JUCE_LITTLE_ENDIAN
396 s += srcBytesPerSample;
420 switch (sourceFormat)
457class AudioConversionTests :
public UnitTest
460 AudioConversionTests()
464 template <
class F1,
class E1,
class F2,
class E2>
467 static void test (UnitTest& unitTest, Random&
r)
469 test (unitTest,
false,
r);
470 test (unitTest,
true,
r);
474 static
void test (UnitTest& unitTest,
bool inPlace, Random&
r)
476 const int numSamples = 2048;
477 int32 original [(size_t) numSamples],
478 converted[(size_t) numSamples],
479 reversed [(size_t) numSamples];
482 AudioData::Pointer<F1, E1, AudioData::NonInterleaved, AudioData::NonConst>
d (original);
483 bool clippingFailed =
false;
485 for (
int i = 0;
i < numSamples / 2; ++
i)
487 d.setAsFloat (
r.nextFloat() * 2.2f - 1.1f);
489 if (!
d.isFloatingPoint())
490 clippingFailed =
d.getAsFloat() > 1.0f ||
d.getAsFloat() < -1.0f || clippingFailed;
493 d.setAsInt32 (
r.nextInt());
497 unitTest.expect (! clippingFailed);
501 std::unique_ptr<AudioData::Converter> conv (
new AudioData::ConverterInstance<AudioData::Pointer<F1, E1, AudioData::NonInterleaved, AudioData::Const>,
502 AudioData::Pointer<F2, E2, AudioData::NonInterleaved, AudioData::NonConst>>());
503 conv->convertSamples (inPlace ? reversed : converted, original, numSamples);
506 conv.reset (
new AudioData::ConverterInstance<AudioData::Pointer<F2, E2, AudioData::NonInterleaved, AudioData::Const>,
507 AudioData::Pointer<F1, E1, AudioData::NonInterleaved, AudioData::NonConst>>());
509 zeromem (reversed,
sizeof (reversed));
511 conv->convertSamples (reversed, inPlace ? reversed : converted, numSamples);
515 AudioData::Pointer<F1, E1, AudioData::NonInterleaved, AudioData::Const> d1 (original);
516 AudioData::Pointer<F1, E1, AudioData::NonInterleaved, AudioData::Const> d2 (reversed);
518 const int errorMargin = 2 * AudioData::Pointer<F1, E1, AudioData::NonInterleaved, AudioData::Const>::get32BitResolution()
519 + AudioData::Pointer<F2, E2, AudioData::NonInterleaved, AudioData::Const>::get32BitResolution();
521 for (
int i = 0;
i < numSamples; ++
i)
523 biggestDiff =
jmax (biggestDiff, std::abs (d1.getAsInt32() - d2.getAsInt32()));
528 unitTest.expect (biggestDiff <= errorMargin);
534 template <
class F1,
class E1,
class FormatType>
537 static void test (UnitTest& unitTest, Random&
r)
539 Test5 <F1, E1, FormatType, AudioData::BigEndian>::test (unitTest,
r);
540 Test5 <F1, E1, FormatType, AudioData::LittleEndian>::test (unitTest,
r);
544 template <
class FormatType,
class Endianness>
547 static void test (UnitTest& unitTest, Random&
r)
549 Test3 <FormatType, Endianness, AudioData::Int8>::test (unitTest,
r);
550 Test3 <FormatType, Endianness, AudioData::UInt8>::test (unitTest,
r);
551 Test3 <FormatType, Endianness, AudioData::Int16>::test (unitTest,
r);
552 Test3 <FormatType, Endianness, AudioData::Int24>::test (unitTest,
r);
553 Test3 <FormatType, Endianness, AudioData::Int32>::test (unitTest,
r);
554 Test3 <FormatType, Endianness, AudioData::Float32>::test (unitTest,
r);
558 template <
class FormatType>
561 static void test (UnitTest& unitTest, Random&
r)
563 Test2 <FormatType, AudioData::BigEndian>::test (unitTest,
r);
564 Test2 <FormatType, AudioData::LittleEndian>::test (unitTest,
r);
568 void runTest()
override
570 auto r = getRandom();
571 beginTest (
"Round-trip conversion: Int8");
572 Test1 <AudioData::Int8>::test (*
this,
r);
573 beginTest (
"Round-trip conversion: Int16");
574 Test1 <AudioData::Int16>::test (*
this,
r);
575 beginTest (
"Round-trip conversion: Int24");
576 Test1 <AudioData::Int24>::test (*
this,
r);
577 beginTest (
"Round-trip conversion: Int32");
578 Test1 <AudioData::Int32>::test (*
this,
r);
579 beginTest (
"Round-trip conversion: Float32");
580 Test1 <AudioData::Float32>::test (*
this,
r);
582 using Format = AudioData::Format<AudioData::Float32, AudioData::NativeEndian>;
584 beginTest (
"Interleaving");
586 constexpr auto numChannels = 4;
587 constexpr auto numSamples = 512;
589 AudioBuffer<float> sourceBuffer { numChannels, numSamples },
590 destBuffer { 1, numChannels * numSamples };
592 for (
int ch = 0; ch < numChannels; ++ch)
593 for (
int i = 0;
i < numSamples; ++
i)
594 sourceBuffer.setSample (ch,
i,
r.nextFloat());
596 AudioData::interleaveSamples (AudioData::NonInterleavedSource<Format> { sourceBuffer.getArrayOfReadPointers(), numChannels },
597 AudioData::InterleavedDest<Format> { destBuffer.getWritePointer (0), numChannels },
600 for (
int ch = 0; ch < numChannels; ++ch)
601 for (
int i = 0;
i < numSamples; ++
i)
602 expect (destBuffer.getSample (0, ch + (
i * numChannels)) == sourceBuffer.getSample (ch,
i));
605 beginTest (
"Deinterleaving");
607 constexpr auto numChannels = 4;
608 constexpr auto numSamples = 512;
610 AudioBuffer<float> sourceBuffer { 1, numChannels * numSamples },
611 destBuffer { numChannels, numSamples };
613 for (
int ch = 0; ch < numChannels; ++ch)
614 for (
int i = 0;
i < numSamples; ++
i)
615 sourceBuffer.setSample (0, ch + (
i * numChannels),
r.nextFloat());
617 AudioData::deinterleaveSamples (AudioData::InterleavedSource<Format> { sourceBuffer.getReadPointer (0), numChannels },
618 AudioData::NonInterleavedDest<Format> { destBuffer.getArrayOfWritePointers(), numChannels },
621 for (
int ch = 0; ch < numChannels; ++ch)
622 for (
int i = 0;
i < numSamples; ++
i)
623 expect (sourceBuffer.getSample (0, ch + (
i * numChannels)) == destBuffer.getSample (ch,
i));
628static AudioConversionTests audioConversionUnitTests;
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
int32_t int32
Definition basics.h:89
static void littleEndian24BitToChars(int value, void *destBytes) noexcept
Definition ByteOrder.h:247
static uint16 swapIfLittleEndian(uint16 value) noexcept
Definition ByteOrder.h:227
static void bigEndian24BitToChars(int value, void *destBytes) noexcept
Definition ByteOrder.h:248
static uint16 swap(uint16 value) noexcept
Definition ByteOrder.h:151
static uint16 swapIfBigEndian(uint16 value) noexcept
Definition ByteOrder.h:218
static void convertFloatToInt16LE(const float *source, void *dest, int numSamples, int destBytesPerSample=2)
Definition juce_AudioDataConverters.cpp:29
static void convertFloatToInt24BE(const float *source, void *dest, int numSamples, int destBytesPerSample=3)
Definition juce_AudioDataConverters.cpp:104
static void convertFloatToInt32LE(const float *source, void *dest, int numSamples, int destBytesPerSample=4)
Definition juce_AudioDataConverters.cpp:129
DataFormat
Definition juce_AudioDataConverters.h:828
@ float32LE
Definition juce_AudioDataConverters.h:835
@ int24BE
Definition juce_AudioDataConverters.h:832
@ int24LE
Definition juce_AudioDataConverters.h:831
@ int16BE
Definition juce_AudioDataConverters.h:830
@ float32BE
Definition juce_AudioDataConverters.h:836
@ int16LE
Definition juce_AudioDataConverters.h:829
@ int32LE
Definition juce_AudioDataConverters.h:833
@ int32BE
Definition juce_AudioDataConverters.h:834
static void convertFloat32LEToFloat(const void *source, float *dest, int numSamples, int srcBytesPerSample=4)
Definition juce_AudioDataConverters.cpp:366
static void convertInt32LEToFloat(const void *source, float *dest, int numSamples, int srcBytesPerSample=4)
Definition juce_AudioDataConverters.cpp:316
static void convertInt24BEToFloat(const void *source, float *dest, int numSamples, int srcBytesPerSample=3)
Definition juce_AudioDataConverters.cpp:291
static void convertFloatToInt16BE(const float *source, void *dest, int numSamples, int destBytesPerSample=2)
Definition juce_AudioDataConverters.cpp:54
static void convertFloatToInt24LE(const float *source, void *dest, int numSamples, int destBytesPerSample=3)
Definition juce_AudioDataConverters.cpp:79
static void convertFloatToInt32BE(const float *source, void *dest, int numSamples, int destBytesPerSample=4)
Definition juce_AudioDataConverters.cpp:154
static void convertFloatToFloat32LE(const float *source, void *dest, int numSamples, int destBytesPerSample=4)
Definition juce_AudioDataConverters.cpp:179
static void interleaveSamples(const float **source, float *dest, int numSamples, int numChannels)
Definition juce_AudioDataConverters.cpp:435
static void convertFloatToFloat32BE(const float *source, void *dest, int numSamples, int destBytesPerSample=4)
Definition juce_AudioDataConverters.cpp:197
static void convertFormatToFloat(DataFormat sourceFormat, const void *source, float *dest, int numSamples)
Definition juce_AudioDataConverters.cpp:418
static void convertFloat32BEToFloat(const void *source, float *dest, int numSamples, int srcBytesPerSample=4)
Definition juce_AudioDataConverters.cpp:383
static void deinterleaveSamples(const float *source, float **dest, int numSamples, int numChannels)
Definition juce_AudioDataConverters.cpp:444
static void convertFloatToFormat(DataFormat destFormat, const float *source, void *dest, int numSamples)
Definition juce_AudioDataConverters.cpp:402
static void convertInt16BEToFloat(const void *source, float *dest, int numSamples, int srcBytesPerSample=2)
Definition juce_AudioDataConverters.cpp:241
static void convertInt16LEToFloat(const void *source, float *dest, int numSamples, int srcBytesPerSample=2)
Definition juce_AudioDataConverters.cpp:216
static void convertInt32BEToFloat(const void *source, float *dest, int numSamples, int srcBytesPerSample=4)
Definition juce_AudioDataConverters.cpp:341
static void convertInt24LEToFloat(const void *source, float *dest, int numSamples, int srcBytesPerSample=3)
Definition juce_AudioDataConverters.cpp:266
static void interleaveSamples(NonInterleavedSource< SourceFormat... > source, InterleavedDest< DestFormat... > dest, int numSamples)
Definition juce_AudioDataConverters.h:720
ChannelData< true, true, Format... > InterleavedSource
Definition juce_AudioDataConverters.h:694
ChannelData< true, false, Format... > InterleavedDest
Definition juce_AudioDataConverters.h:696
ChannelData< false, true, Format... > NonInterleavedSource
Definition juce_AudioDataConverters.h:698
ChannelData< false, false, Format... > NonInterleavedDest
Definition juce_AudioDataConverters.h:700
static void deinterleaveSamples(InterleavedSource< SourceFormat... > source, NonInterleavedDest< DestFormat... > dest, int numSamples)
Definition juce_AudioDataConverters.h:764
static Type swapIfLittleEndian(Type value) noexcept
Definition juce_ByteOrder.h:78
static constexpr int littleEndian24Bit(const void *bytes) noexcept
Definition juce_ByteOrder.h:218
static Type swapIfBigEndian(Type value) noexcept
Definition juce_ByteOrder.h:67
static constexpr int bigEndian24Bit(const void *bytes) noexcept
Definition juce_ByteOrder.h:219
Definition juce_UnitTest.h:70
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
#define JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE(...)
Definition juce_CompilerWarnings.h:181
#define JUCE_END_IGNORE_WARNINGS_GCC_LIKE
Definition juce_CompilerWarnings.h:182
#define JUCE_BEGIN_IGNORE_WARNINGS_MSVC(warnings)
Definition juce_CompilerWarnings.h:198
#define JUCE_END_IGNORE_WARNINGS_MSVC
Definition juce_CompilerWarnings.h:199
Definition juce_UnitTestCategories.h:27
Definition carla_juce.cpp:31
unsigned short uint16
Definition juce_MathsFunctions.h:41
Type unalignedPointerCast(void *ptr) noexcept
Definition juce_Memory.h:88
unsigned int uint32
Definition juce_MathsFunctions.h:45
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Definition juce_MathsFunctions.h:262
int roundToInt(const FloatType value) noexcept
Definition juce_MathsFunctions.h:465
void zeromem(void *memory, size_t numBytes) noexcept
Definition juce_Memory.h:28
static int test(SerdEnv *env, bool top_level, bool pretty_numbers)
Definition sratom_test.c:79
int r
Definition crypt.c:458
#define const
Definition zconf.h:137