Improved setting FilData::Status

This commit is contained in:
KIRA Ryouta 2024-02-14 12:50:02 +09:00 committed by Paul Ferrand
parent 40e726c12a
commit 4e570dd9ff

View file

@ -336,8 +336,9 @@ bool sfz::FilePool::preloadFile(const FileId& fileId, uint32_t maxOffset) noexce
if (framesToLoad > fileData.preloadedData.getNumFrames()) { if (framesToLoad > fileData.preloadedData.getNumFrames()) {
preloadedFiles[fileId].information.maxOffset = maxOffset; preloadedFiles[fileId].information.maxOffset = maxOffset;
preloadedFiles[fileId].preloadedData = readFromFile(*reader, framesToLoad); preloadedFiles[fileId].preloadedData = readFromFile(*reader, framesToLoad);
if (fileData.status == FileData::Status::Preloaded) if (frames == framesToLoad && fileData.status != FileData::Status::FullLoaded)
fileData.status = frames == framesToLoad ? FileData::Status::FullLoaded : FileData::Status::Preloaded; // Forced overwrite status
fileData.status = FileData::Status::FullLoaded;
} }
fileData.preloadCallCount++; fileData.preloadCallCount++;
} else { } else {
@ -347,6 +348,7 @@ bool sfz::FilePool::preloadFile(const FileId& fileId, uint32_t maxOffset) noexce
*fileInformation *fileInformation
}); });
// Initially set status
insertedPair.first->second.status = frames == framesToLoad ? FileData::Status::FullLoaded : FileData::Status::Preloaded; insertedPair.first->second.status = frames == framesToLoad ? FileData::Status::FullLoaded : FileData::Status::Preloaded;
insertedPair.first->second.preloadCallCount++; insertedPair.first->second.preloadCallCount++;
} }
@ -402,6 +404,7 @@ sfz::FileDataHolder sfz::FilePool::loadFile(const FileId& fileId) noexcept
readFromFile(*reader, frames), readFromFile(*reader, frames),
*fileInformation *fileInformation
}); });
// Initially set status
insertedPair.first->second.status = FileData::Status::FullLoaded; insertedPair.first->second.status = FileData::Status::FullLoaded;
insertedPair.first->second.preloadCallCount++; insertedPair.first->second.preloadCallCount++;
return { &insertedPair.first->second }; return { &insertedPair.first->second };
@ -420,6 +423,7 @@ sfz::FileDataHolder sfz::FilePool::loadFromRam(const FileId& fileId, const std::
readFromFile(*reader, frames), readFromFile(*reader, frames),
*fileInformation *fileInformation
}); });
// Initially set status
insertedPair.first->second.status = FileData::Status::FullLoaded; insertedPair.first->second.status = FileData::Status::FullLoaded;
insertedPair.first->second.preloadCallCount++; insertedPair.first->second.preloadCallCount++;
DBG("Added a file " << fileId.filename()); DBG("Added a file " << fileId.filename());
@ -471,9 +475,15 @@ void sfz::FilePool::setPreloadSize(uint32_t preloadSize) noexcept
const uint32_t framesToLoad = min(frames, maxOffset + preloadSize); const uint32_t framesToLoad = min(frames, maxOffset + preloadSize);
fileData.preloadedData = readFromFile(*reader, framesToLoad); fileData.preloadedData = readFromFile(*reader, framesToLoad);
const FileData::Status status = fileData.status; FileData::Status status = fileData.status;
if (status == FileData::Status::FullLoaded || status == FileData::Status::Preloaded) { bool fullLoaded = frames == framesToLoad;
fileData.status = frames == framesToLoad ? FileData::Status::FullLoaded : FileData::Status::Preloaded; if (fullLoaded && status != FileData::Status::FullLoaded) {
// Forced overwrite status
fileData.status = FileData::Status::FullLoaded;
}
else if (!fullLoaded && status == FileData::Status::FullLoaded) {
// Exchange status
fileData.status.compare_exchange_strong(status, FileData::Status::Preloaded);
} }
} }
} }
@ -522,7 +532,10 @@ void sfz::FilePool::loadingJob(const QueuedFileData& data) noexcept
streamFromFile(*reader, data.data->fileData, &data.data->availableFrames); streamFromFile(*reader, data.data->fileData, &data.data->availableFrames);
data.data->status = FileData::Status::Done; currentStatus = data.data->status.load();
if (currentStatus == FileData::Status::Streaming) {
data.data->status.compare_exchange_strong(currentStatus, FileData::Status::Done);
}
std::lock_guard<SpinMutex> guard { garbageAndLastUsedMutex }; std::lock_guard<SpinMutex> guard { garbageAndLastUsedMutex };
if (absl::c_find(lastUsedFiles, *id) == lastUsedFiles.end()) if (absl::c_find(lastUsedFiles, *id) == lastUsedFiles.end())
@ -637,6 +650,7 @@ void sfz::FilePool::setRamLoading(bool loadInRam) noexcept
*reader, *reader,
fileData.information.end fileData.information.end
); );
// Initially set status
fileData.status = FileData::Status::FullLoaded; fileData.status = FileData::Status::FullLoaded;
} }
} else { } else {
@ -663,10 +677,13 @@ void sfz::FilePool::triggerGarbageCollection() noexcept
} }
sfz::FileData& data = it->second; sfz::FileData& data = it->second;
if (data.status == FileData::Status::Preloaded)
return true;
if (data.status != FileData::Status::Done) auto status = data.status.load();
if (data.availableFrames == 0) {
return status == FileData::Status::Preloaded || status == FileData::Status::FullLoaded;
}
if (status != FileData::Status::Done)
return false; return false;
if (data.readerCount != 0) if (data.readerCount != 0)
@ -676,7 +693,11 @@ void sfz::FilePool::triggerGarbageCollection() noexcept
if (secondsIdle < config::fileClearingPeriod) if (secondsIdle < config::fileClearingPeriod)
return false; return false;
// Queue garbage collection
// At first set availableFromes to 0
// Then forced set status
data.availableFrames = 0; data.availableFrames = 0;
if (status != FileData::Status::FullLoaded)
data.status = FileData::Status::Preloaded; data.status = FileData::Status::Preloaded;
garbageToCollect.push_back(std::move(data.fileData)); garbageToCollect.push_back(std::move(data.fileData));
return true; return true;