1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2017 - ROLI Ltd.
JUCE is an open source library subject to commercial or open-source
licensing.
By using JUCE, you agree to the terms of both the JUCE 5 End-User License
Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
27th April 2017).
End User License Agreement: www.juce.com/juce-5-licence
Privacy Policy: www.juce.com/juce-5-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
AudioFormatReaderSource::AudioFormatReaderSource (AudioFormatReader* const r,
const bool deleteReaderWhenThisIsDeleted)
: reader (r, deleteReaderWhenThisIsDeleted),
nextPlayPos (0),
looping (false)
{
jassert (reader != nullptr);
}
AudioFormatReaderSource::~AudioFormatReaderSource() {}
int64 AudioFormatReaderSource::getTotalLength() const { return reader->lengthInSamples; }
void AudioFormatReaderSource::setNextReadPosition (int64 newPosition) { nextPlayPos = newPosition; }
void AudioFormatReaderSource::setLooping (bool shouldLoop) { looping = shouldLoop; }
int64 AudioFormatReaderSource::getNextReadPosition() const
{
return looping ? nextPlayPos % reader->lengthInSamples
: nextPlayPos;
}
void AudioFormatReaderSource::prepareToPlay (int /*samplesPerBlockExpected*/, double /*sampleRate*/) {}
void AudioFormatReaderSource::releaseResources() {}
void AudioFormatReaderSource::getNextAudioBlock (const AudioSourceChannelInfo& info)
{
if (info.numSamples > 0)
{
const int64 start = nextPlayPos;
if (looping)
{
const int64 newStart = start % reader->lengthInSamples;
const int64 newEnd = (start + info.numSamples) % reader->lengthInSamples;
if (newEnd > newStart)
{
reader->read (info.buffer, info.startSample,
(int) (newEnd - newStart), newStart, true, true);
}
else
{
const int endSamps = (int) (reader->lengthInSamples - newStart);
reader->read (info.buffer, info.startSample,
endSamps, newStart, true, true);
reader->read (info.buffer, info.startSample + endSamps,
(int) newEnd, 0, true, true);
}
nextPlayPos = newEnd;
}
else
{
reader->read (info.buffer, info.startSample,
info.numSamples, start, true, true);
nextPlayPos += info.numSamples;
}
}
}
} // namespace juce
|