Corrected a bug when preloading data for regions with large offsets

This commit is contained in:
paulfd 2019-09-16 14:25:47 +02:00
parent f41c36d241
commit 8e02171cb2
3 changed files with 9 additions and 5 deletions

View file

@ -45,7 +45,7 @@ std::unique_ptr<AudioBuffer<T>> readFromFile(SndfileHandle& sndFile, int numFram
return returnedBuffer; return returnedBuffer;
} }
std::optional<sfz::FilePool::FileInformation> sfz::FilePool::getFileInformation(std::string_view filename) noexcept std::optional<sfz::FilePool::FileInformation> sfz::FilePool::getFileInformation(std::string_view filename, uint32_t offset) noexcept
{ {
std::filesystem::path file { rootDirectory / filename }; std::filesystem::path file { rootDirectory / filename };
if (!std::filesystem::exists(file)) if (!std::filesystem::exists(file))
@ -72,11 +72,15 @@ std::optional<sfz::FilePool::FileInformation> sfz::FilePool::getFileInformation(
if (config::preloadSize == 0) if (config::preloadSize == 0)
return returnedValue.end; return returnedValue.end;
else else
return std::min(returnedValue.end, static_cast<uint32_t>(config::preloadSize)); return std::min(returnedValue.end, offset + static_cast<uint32_t>(config::preloadSize));
}(); }();
if (preloadedData.contains(filename)) { if (preloadedData.contains(filename)) {
returnedValue.preloadedData = preloadedData[filename]; auto alreadyPreloaded = preloadedData[filename];
if (preloadedSize > alreadyPreloaded->getNumFrames()) {
alreadyPreloaded.reset(readFromFile<float>(sndFile, preloadedSize).get());
}
returnedValue.preloadedData = alreadyPreloaded;
} else { } else {
returnedValue.preloadedData = std::shared_ptr<AudioBuffer<float>>(readFromFile<float>(sndFile, preloadedSize)); returnedValue.preloadedData = std::shared_ptr<AudioBuffer<float>>(readFromFile<float>(sndFile, preloadedSize));
preloadedData[filename] = returnedValue.preloadedData; preloadedData[filename] = returnedValue.preloadedData;

View file

@ -57,7 +57,7 @@ public:
double sampleRate { config::defaultSampleRate }; double sampleRate { config::defaultSampleRate };
std::shared_ptr<AudioBuffer<float>> preloadedData; std::shared_ptr<AudioBuffer<float>> preloadedData;
}; };
std::optional<FileInformation> getFileInformation(std::string_view filename) noexcept; std::optional<FileInformation> getFileInformation(std::string_view filename, uint32_t offset) noexcept;
void enqueueLoading(Voice* voice, std::string_view sample, int numFrames, unsigned ticket) noexcept; void enqueueLoading(Voice* voice, std::string_view sample, int numFrames, unsigned ticket) noexcept;
private: private:
std::filesystem::path rootDirectory; std::filesystem::path rootDirectory;

View file

@ -194,7 +194,7 @@ bool sfz::Synth::loadSfzFile(const std::filesystem::path& filename)
auto region = currentRegion->get(); auto region = currentRegion->get();
if (!region->isGenerator()) { if (!region->isGenerator()) {
auto fileInformation = filePool.getFileInformation(region->sample); auto fileInformation = filePool.getFileInformation(region->sample, region->offset + region->offsetRandom);
if (!fileInformation) { if (!fileInformation) {
DBG("Removing the region with sample " << region->sample); DBG("Removing the region with sample " << region->sample);
std::iter_swap(currentRegion, lastRegion); std::iter_swap(currentRegion, lastRegion);