30 buffer.makeCopyOf (bufferToUse);
47 if (
buffer.getNumSamples() == 0)
53 auto& dst = *bufferToFill.
buffer;
54 auto channels =
jmin (dst.getNumChannels(),
buffer.getNumChannels());
56 auto n =
buffer.getNumSamples();
65 for (; ch < channels; ++ch)
68 for (; ch < dst.getNumChannels(); ++ch)
93 return buffer.getNumSamples();
113 if (
a.getNumChannels() !=
b.getNumChannels())
116 for (
int channel = 0; channel <
a.getNumChannels(); ++channel)
118 auto* aPtr =
a.getReadPointer (channel);
119 auto* bPtr =
b.getReadPointer (channel);
121 if (std::vector<float> (aPtr, aPtr +
a.getNumSamples())
122 != std::vector<float> (bPtr, bPtr +
b.getNumSamples()))
131struct MemoryAudioSourceTests :
public UnitTest
133 MemoryAudioSourceTests() : UnitTest (
"MemoryAudioSource", UnitTestCategories::audio) {}
135 void runTest()
override
137 constexpr int blockSize = 512;
138 AudioBuffer<float> bufferToFill { 2, blockSize };
139 AudioSourceChannelInfo channelInfo { bufferToFill };
141 beginTest (
"A zero-length buffer produces silence, whether or not looping is enabled");
143 for (
const bool enableLooping : {
false,
true })
145 AudioBuffer<float>
buffer;
146 MemoryAudioSource source {
buffer,
true,
false };
147 source.setLooping (enableLooping);
148 source.prepareToPlay (blockSize, 44100.0);
150 for (
int i = 0;
i < 2; ++
i)
152 play (source, channelInfo);
153 expect (isSilent (bufferToFill));
158 beginTest (
"A short buffer without looping is played once and followed by silence");
160 auto buffer = getShortBuffer();
161 MemoryAudioSource source {
buffer,
true,
false };
162 source.setLooping (
false);
163 source.prepareToPlay (blockSize, 44100.0);
165 play (source, channelInfo);
168 copy.setSize (
buffer.getNumChannels(), blockSize,
true,
true,
false);
170 expect (bufferToFill ==
copy);
172 play (source, channelInfo);
174 expect (isSilent (bufferToFill));
177 beginTest (
"A short buffer with looping is played multiple times");
179 auto buffer = getShortBuffer();
180 MemoryAudioSource source {
buffer,
true,
false };
181 source.setLooping (
true);
182 source.prepareToPlay (blockSize, 44100.0);
184 play (source, channelInfo);
189 expect (! isSilent (bufferToFill));
192 beginTest (
"A long buffer without looping is played once");
194 auto buffer = getLongBuffer();
195 MemoryAudioSource source {
buffer,
true,
false };
196 source.setLooping (
false);
197 source.prepareToPlay (blockSize, 44100.0);
199 play (source, channelInfo);
202 copy.setSize (
buffer.getNumChannels(), blockSize,
true,
true,
false);
204 expect (bufferToFill ==
copy);
206 for (
int i = 0;
i < 10; ++
i)
207 play (source, channelInfo);
209 expect (isSilent (bufferToFill));
212 beginTest (
"A long buffer with looping is played multiple times");
214 auto buffer = getLongBuffer();
215 MemoryAudioSource source {
buffer,
true,
false };
216 source.setLooping (
true);
217 source.prepareToPlay (blockSize, 44100.0);
219 for (
int i = 0;
i < 100; ++
i)
221 play (source, channelInfo);
222 expect (bufferToFill.getSample (0, 0) ==
buffer.getSample (0, (
i * blockSize) %
buffer.getNumSamples()));
227 static AudioBuffer<float> getTestBuffer (
int length)
231 for (
int channel = 0; channel <
buffer.getNumChannels(); ++channel)
238 static AudioBuffer<float> getShortBuffer() {
return getTestBuffer (5); }
239 static AudioBuffer<float> getLongBuffer() {
return getTestBuffer (1000); }
241 static void play (MemoryAudioSource& source, AudioSourceChannelInfo&
info)
243 info.clearActiveBufferRegion();
244 source.getNextAudioBlock (
info);
247 static bool isSilent (
const AudioBuffer<float>&
b)
249 for (
int channel = 0; channel <
b.getNumChannels(); ++channel)
250 if (
b.findMinMax (channel, 0,
b.getNumSamples()) != Range<float>{})
257static MemoryAudioSourceTests memoryAudioSourceTests;
#define copy(x)
Definition ADnoteParameters.cpp:1011
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
uint8_t a
Definition Spc_Cpu.h:141
Definition juce_AudioSampleBuffer.h:34
int getNumChannels() const noexcept
Definition juce_AudioSampleBuffer.h:236
int getNumSamples() const noexcept
Definition juce_AudioSampleBuffer.h:242
Type ** getArrayOfWritePointers() noexcept
Definition juce_AudioSampleBuffer.h:342
bool isLooping() const override
Definition juce_MemoryAudioSource.cpp:97
bool isCurrentlyLooping
Definition juce_MemoryAudioSource.h:76
int64 getNextReadPosition() const override
Definition juce_MemoryAudioSource.cpp:86
MemoryAudioSource(AudioBuffer< float > &audioBuffer, bool copyMemory, bool shouldLoop=false)
Definition juce_MemoryAudioSource.cpp:26
void setNextReadPosition(int64 newPosition) override
Definition juce_MemoryAudioSource.cpp:81
int64 getTotalLength() const override
Definition juce_MemoryAudioSource.cpp:91
void prepareToPlay(int samplesPerBlockExpected, double sampleRate) override
Definition juce_MemoryAudioSource.cpp:38
void setLooping(bool shouldLoop) override
Definition juce_MemoryAudioSource.cpp:102
int position
Definition juce_MemoryAudioSource.h:75
AudioBuffer< float > buffer
Definition juce_MemoryAudioSource.h:74
void getNextAudioBlock(const AudioSourceChannelInfo &bufferToFill) override
Definition juce_MemoryAudioSource.cpp:45
void releaseResources() override
Definition juce_MemoryAudioSource.cpp:43
unsigned * m
Definition inflate.c:1559
register unsigned i
Definition inflate.c:1575
struct backing_store_struct * info
Definition jmemsys.h:183
JOCTET * buffer
Definition juce_JPEGLoader.cpp:302
Definition carla_juce.cpp:31
constexpr Type jmap(Type value0To1, Type targetRangeMin, Type targetRangeMax)
Definition juce_MathsFunctions.h:120
long long int64
Definition juce_MathsFunctions.h:54
bool isSilent(const SampleFrame *src, int frames)
Definition MixHelpers.cpp:72
#define max(x, y)
Definition os.h:78
png_uint_32 length
Definition png.c:2247
Definition juce_AudioSource.h:33
int numSamples
Definition juce_AudioSource.h:81
void clearActiveBufferRegion() const
Definition juce_AudioSource.h:84
AudioBuffer< float > * buffer
Definition juce_AudioSource.h:73
int startSample
Definition juce_AudioSource.h:77
signed int sample
Definition tap_dynamics_m.c:41
int n
Definition crypt.c:458
typedef int(UZ_EXP MsgFn)()