|
|
|
@@ -214,7 +214,7 @@ private: |
|
|
|
std::unique_ptr<InputSource> source;
|
|
|
|
std::unique_ptr<AudioFormatReader> reader;
|
|
|
|
CriticalSection readerLock;
|
|
|
|
uint32 lastReaderUseTime = 0;
|
|
|
|
std::atomic<uint32> lastReaderUseTime { 0 };
|
|
|
|
|
|
|
|
void createReader()
|
|
|
|
{
|
|
|
|
@@ -645,6 +645,7 @@ bool AudioThumbnail::setDataSource (LevelDataSource* newSource) |
|
|
|
JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
|
|
|
|
|
|
|
|
numSamplesFinished = 0;
|
|
|
|
auto wasSuccessful = [&] { return sampleRate > 0 && totalSamples > 0; };
|
|
|
|
|
|
|
|
if (cache.loadThumb (*this, newSource->hashCode) && isFullyLoaded())
|
|
|
|
{
|
|
|
|
@@ -654,22 +655,22 @@ bool AudioThumbnail::setDataSource (LevelDataSource* newSource) |
|
|
|
source->sampleRate = sampleRate;
|
|
|
|
source->numChannels = (unsigned int) numChannels;
|
|
|
|
source->numSamplesFinished = numSamplesFinished;
|
|
|
|
|
|
|
|
return wasSuccessful();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
source.reset (newSource); // (make sure this isn't done before loadThumb is called)
|
|
|
|
|
|
|
|
const ScopedLock sl (lock);
|
|
|
|
source->initialise (numSamplesFinished);
|
|
|
|
source.reset (newSource);
|
|
|
|
|
|
|
|
totalSamples = source->lengthInSamples;
|
|
|
|
sampleRate = source->sampleRate;
|
|
|
|
numChannels = (int32) source->numChannels;
|
|
|
|
const ScopedLock sl (lock);
|
|
|
|
source->initialise (numSamplesFinished);
|
|
|
|
|
|
|
|
createChannels (1 + (int) (totalSamples / samplesPerThumbSample));
|
|
|
|
}
|
|
|
|
totalSamples = source->lengthInSamples;
|
|
|
|
sampleRate = source->sampleRate;
|
|
|
|
numChannels = (int32) source->numChannels;
|
|
|
|
|
|
|
|
createChannels (1 + (int) (totalSamples / samplesPerThumbSample));
|
|
|
|
|
|
|
|
return sampleRate > 0 && totalSamples > 0;
|
|
|
|
return wasSuccessful();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool AudioThumbnail::setSource (InputSource* const newSource)
|
|
|
|
|