31 audioSourceBeingRead (audioSource)
33 jassert (audioSourceBeingRead !=
nullptr);
37 sampleRate = audioSourceBeingRead->getSampleRate();
38 numChannels = (
unsigned int) audioSourceBeingRead->getChannelCount();
42 audioSourceBeingRead->addListener (
this);
44 if (audioSourceBeingRead->isSampleAccessEnabled())
45 hostReader.reset (
new ARA::PlugIn::HostAudioReader (audioSourceBeingRead));
48ARAAudioSourceReader::~ARAAudioSourceReader()
62 audioSourceBeingRead->removeListener (
this);
63 audioSourceBeingRead =
nullptr;
66void ARAAudioSourceReader::willUpdateAudioSourceProperties (ARAAudioSource* audioSource,
67 ARAAudioSource::PropertiesPtr newProperties)
69 if (audioSource->getSampleCount() != newProperties->sampleCount
70 || ! exactlyEqual (audioSource->getSampleRate(), newProperties->sampleRate)
71 || audioSource->getChannelCount() != newProperties->channelCount)
77void ARAAudioSourceReader::doUpdateAudioSourceContent ([[maybe_unused]] ARAAudioSource* audioSource,
78 ARAContentUpdateScopes scopeFlags)
80 jassert (audioSourceBeingRead == audioSource);
83 if (scopeFlags.affectSamples())
87void ARAAudioSourceReader::willEnableAudioSourceSamplesAccess ([[maybe_unused]] ARAAudioSource* audioSource,
bool enable)
89 jassert (audioSourceBeingRead == audioSource);
94 ScopedWriteLock scopedLock (lock);
99void ARAAudioSourceReader::didEnableAudioSourceSamplesAccess ([[maybe_unused]] ARAAudioSource* audioSource,
bool enable)
101 jassert (audioSourceBeingRead == audioSource);
106 ScopedWriteLock scopedLock (lock);
107 hostReader.reset (
new ARA::PlugIn::HostAudioReader (audioSourceBeingRead));
111void ARAAudioSourceReader::willDestroyAudioSource ([[maybe_unused]] ARAAudioSource* audioSource)
113 jassert (audioSourceBeingRead == audioSource);
119 int64 startSampleInFile,
int numSamples)
121 const auto destSize = (
bitsPerSample / 8) * (
size_t) numSamples;
122 const auto bufferOffset = (int) (
bitsPerSample / 8) * startOffsetInDestBuffer;
128 if (readLock.
isLocked() && hostReader !=
nullptr)
130 for (
size_t i = 0; i < tmpPtrs.size(); ++i)
132 if ((i < (
size_t) numDestChannels) && (destSamples[i] !=
nullptr))
134 tmpPtrs[i] = ((uint8_t*) destSamples[i]) + bufferOffset;
141 static thread_local std::vector<uint8_t> dummyBuffer;
143 if (destSize > dummyBuffer.size())
144 dummyBuffer.resize (destSize);
146 tmpPtrs[i] = dummyBuffer.data();
150 return hostReader->readAudioSamples (startSampleInFile, numSamples, tmpPtrs.data());
154 for (
int i = 0; i < numDestChannels; ++i)
155 if (destSamples[i] !=
nullptr)
156 zeromem (((uint8_t*) destSamples[i]) + bufferOffset, destSize);
164 playbackRegion->getAudioModification()->getAudioSource()->getChannelCount(),
169 const std::vector<ARAPlaybackRegion*>& playbackRegions)
175 positionInfo.setIsPlaying (
true);
182 auto* documentController = (! playbackRegions.empty())
183 ? playbackRegions.front()->getDocumentController<ARADocumentController>()
186 playbackRenderer.reset (documentController ?
static_cast<ARAPlaybackRenderer*
> (documentController->doCreatePlaybackRenderer())
189 if (playbackRenderer !=
nullptr)
191 double regionsStartTime = std::numeric_limits<double>::max();
192 double regionsEndTime = std::numeric_limits<double>::lowest();
194 for (
const auto& playbackRegion : playbackRegions)
196 jassert (playbackRegion->getDocumentController() == documentController);
197 auto playbackRegionTimeRange = playbackRegion->getTimeRange (ARAPlaybackRegion::IncludeHeadAndTail::yes);
198 regionsStartTime = jmin (regionsStartTime, playbackRegionTimeRange.getStart());
199 regionsEndTime = jmax (regionsEndTime, playbackRegionTimeRange.getEnd());
201 playbackRenderer->addPlaybackRegion (ARA::PlugIn::toRef (playbackRegion));
202 playbackRegion->addListener (
this);
208 playbackRenderer->prepareToPlay (rate,
211 AudioProcessor::ProcessingPrecision::singlePrecision,
212 ARARenderer::AlwaysNonRealtime::yes);
221ARAPlaybackRegionReader::~ARAPlaybackRegionReader()
233 for (
auto& playbackRegion : playbackRenderer->getPlaybackRegions())
234 playbackRegion->removeListener (
this);
236 playbackRenderer->releaseResources();
237 playbackRenderer.reset();
241 int64 startSampleInFile,
int numSamples)
243 bool success =
false;
244 bool needClearSamples =
true;
253 needClearSamples =
false;
254 positionInfo.setTimeInSamples (startSampleInFile +
startInSamples);
256 while (numSamples > 0)
258 const int numSliceSamples = jmin (numSamples, maximumBlockSize);
259 AudioBuffer<float> buffer ((
float **) destSamples, numDestChannels, startOffsetInDestBuffer, numSliceSamples);
260 positionInfo.setTimeInSeconds (
static_cast<double> (*positionInfo.getTimeInSamples()) /
sampleRate);
261 success &= playbackRenderer->processBlock (buffer, AudioProcessor::Realtime::no, positionInfo);
262 numSamples -= numSliceSamples;
263 startOffsetInDestBuffer += numSliceSamples;
264 positionInfo.setTimeInSamples (*positionInfo.getTimeInSamples() + numSliceSamples);
269 if (needClearSamples)
270 for (
int chan_i = 0; chan_i < numDestChannels; ++chan_i)
271 FloatVectorOperations::clear ((
float *) destSamples[chan_i], numSamples);
276void ARAPlaybackRegionReader::willUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion, ARAPlaybackRegion::PropertiesPtr newProperties)
278 jassert (ARA::contains (playbackRenderer->getPlaybackRegions(), playbackRegion));
280 if ((! exactlyEqual (playbackRegion->getStartInAudioModificationTime(), newProperties->startInModificationTime))
281 || ! exactlyEqual (playbackRegion->getDurationInAudioModificationTime(), newProperties->durationInModificationTime)
282 || ! exactlyEqual (playbackRegion->getStartInPlaybackTime(), newProperties->startInPlaybackTime)
283 || ! exactlyEqual (playbackRegion->getDurationInPlaybackTime(), newProperties->durationInPlaybackTime)
284 || (playbackRegion->isTimestretchEnabled() != ((newProperties->transformationFlags & ARA::kARAPlaybackTransformationTimestretch) != 0))
285 || (playbackRegion->isTimeStretchReflectingTempo() != ((newProperties->transformationFlags & ARA::kARAPlaybackTransformationTimestretchReflectingTempo) != 0))
286 || (playbackRegion->hasContentBasedFadeAtHead() != ((newProperties->transformationFlags & ARA::kARAPlaybackTransformationContentBasedFadeAtHead) != 0))
287 || (playbackRegion->hasContentBasedFadeAtTail() != ((newProperties->transformationFlags & ARA::kARAPlaybackTransformationContentBasedFadeAtTail) != 0)))
293void ARAPlaybackRegionReader::didUpdatePlaybackRegionContent ([[maybe_unused]] ARAPlaybackRegion* playbackRegion,
294 ARAContentUpdateScopes scopeFlags)
296 jassert (ARA::contains (playbackRenderer->getPlaybackRegions(), playbackRegion));
299 if (scopeFlags.affectSamples())
303void ARAPlaybackRegionReader::willDestroyPlaybackRegion ([[maybe_unused]] ARAPlaybackRegion* playbackRegion)
305 jassert (ARA::contains (playbackRenderer->getPlaybackRegions(), playbackRegion));
ARAAudioSourceReader(ARAAudioSource *audioSource)
bool readSamples(int *const *destSamples, int numDestChannels, int startOffsetInDestBuffer, int64 startSampleInFile, int numSamples) override
bool readSamples(int *const *destSamples, int numDestChannels, int startOffsetInDestBuffer, int64 startSampleInFile, int numSamples) override
ARAPlaybackRegionReader(ARAPlaybackRegion *playbackRegion)
bool isLocked() const noexcept