33 releaseMasterResources();
38 double sourceSampleRateToCorrectFor,
int maxNumChannels)
40 if (source == newSource)
42 if (source ==
nullptr)
53 std::unique_ptr<ResamplingAudioSource> oldResamplerSource (resamplerSource);
54 std::unique_ptr<BufferingAudioSource> oldBufferingSource (bufferingSource);
57 if (newSource !=
nullptr)
59 newPositionableSource = newSource;
61 if (readAheadSize > 0)
65 jassert (readAheadThread !=
nullptr);
67 newPositionableSource = newBufferingSource
69 false, readAheadSize, maxNumChannels);
74 if (sourceSampleRateToCorrectFor > 0)
75 newMasterSource = newResamplerSource
78 newMasterSource = newPositionableSource;
82 if (newResamplerSource !=
nullptr && sourceSampleRateToCorrectFor > 0 && sampleRate > 0)
90 const ScopedLock sl (callbackLock);
93 resamplerSource = newResamplerSource;
94 bufferingSource = newBufferingSource;
95 masterSource = newMasterSource;
96 positionableSource = newPositionableSource;
97 readAheadBufferSize = readAheadSize;
98 sourceSampleRate = sourceSampleRateToCorrectFor;
103 if (oldMasterSource !=
nullptr)
109 if ((! playing) && masterSource !=
nullptr)
112 const ScopedLock sl (callbackLock);
128 while (--n >= 0 && ! stopped)
137 if (sampleRate > 0.0)
143 if (sampleRate > 0.0)
151 if (sampleRate > 0.0)
159 return positionableSource->getNextReadPosition() > positionableSource->getTotalLength() + 1
160 && ! positionableSource->isLooping();
165 if (positionableSource !=
nullptr)
167 if (sampleRate > 0 && sourceSampleRate > 0)
168 newPosition = (int64) ((
double) newPosition * sourceSampleRate / sampleRate);
170 positionableSource->setNextReadPosition (newPosition);
172 if (resamplerSource !=
nullptr)
173 resamplerSource->flushBuffers();
179 const ScopedLock sl (callbackLock);
181 if (positionableSource !=
nullptr)
183 const double ratio = (sampleRate > 0 && sourceSampleRate > 0) ? sampleRate / sourceSampleRate : 1.0;
184 return (int64) ((double) positionableSource->getNextReadPosition() * ratio);
192 const ScopedLock sl (callbackLock);
194 if (positionableSource !=
nullptr)
196 const double ratio = (sampleRate > 0 && sourceSampleRate > 0) ? sampleRate / sourceSampleRate : 1.0;
197 return (int64) ((double) positionableSource->getTotalLength() * ratio);
205 const ScopedLock sl (callbackLock);
206 return positionableSource !=
nullptr && positionableSource->isLooping();
216 const ScopedLock sl (callbackLock);
218 sampleRate = newSampleRate;
219 blockSize = samplesPerBlockExpected;
221 if (masterSource !=
nullptr)
222 masterSource->prepareToPlay (samplesPerBlockExpected, sampleRate);
224 if (resamplerSource !=
nullptr && sourceSampleRate > 0)
225 resamplerSource->setResamplingRatio (sourceSampleRate / sampleRate);
230void AudioTransportSource::releaseMasterResources()
232 const ScopedLock sl (callbackLock);
234 if (masterSource !=
nullptr)
242 releaseMasterResources();
247 const ScopedLock sl (callbackLock);
249 if (masterSource !=
nullptr && ! stopped)
251 masterSource->getNextAudioBlock (info);
int getNumChannels() const noexcept
void applyGainRamp(int channel, int startSample, int numSamples, Type startGain, Type endGain) noexcept
virtual void releaseResources()=0
virtual void prepareToPlay(int samplesPerBlockExpected, double sampleRate)=0
bool hasStreamFinished() const noexcept
void prepareToPlay(int samplesPerBlockExpected, double sampleRate) override
int64 getNextReadPosition() const override
double getCurrentPosition() const
void releaseResources() override
void getNextAudioBlock(const AudioSourceChannelInfo &) override
int64 getTotalLength() const override
~AudioTransportSource() override
void setPosition(double newPosition)
double getLengthInSeconds() const
void setGain(float newGain) noexcept
void setSource(PositionableAudioSource *newSource, int readAheadBufferSize=0, TimeSliceThread *readAheadThread=nullptr, double sourceSampleRateToCorrectFor=0.0, int maxNumChannels=2)
bool isLooping() const override
void setNextReadPosition(int64 newPosition) override
BufferingAudioSource(PositionableAudioSource *source, TimeSliceThread &backgroundThread, bool deleteSourceWhenDeleted, int numberOfSamplesToBuffer, int numberOfChannels=2, bool prefillBufferOnPrepareToPlay=true)
PositionableAudioSource()=default
virtual void setNextReadPosition(int64 newPosition)=0
void setResamplingRatio(double samplesInPerOutputSample)
ResamplingAudioSource(AudioSource *inputSource, bool deleteInputWhenDeleted, int numChannels=2)
static void JUCE_CALLTYPE sleep(int milliseconds)
void clearActiveBufferRegion() const
AudioBuffer< float > * buffer