Added a buffer and voice tracker to check usage.
This commit is contained in:
parent
2f203fe163
commit
7cc8edbd12
4 changed files with 26 additions and 6 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
#include "FilePool.h"
|
#include "FilePool.h"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <memory>
|
||||||
using namespace std::chrono_literals;
|
using namespace std::chrono_literals;
|
||||||
|
|
||||||
std::optional<sfz::FilePool::FileInformation> sfz::FilePool::getFileInformation(std::string_view filename)
|
std::optional<sfz::FilePool::FileInformation> sfz::FilePool::getFileInformation(std::string_view filename)
|
||||||
|
|
@ -49,20 +49,22 @@ void sfz::FilePool::loadingThread()
|
||||||
DBG("Background thread error: voice is null.");
|
DBG("Background thread error: voice is null.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBG("Background loading of: " << fileToLoad.sample);
|
DBG("Background loading of: " << fileToLoad.sample);
|
||||||
std::filesystem::path file { rootDirectory / fileToLoad.sample };
|
std::filesystem::path file { rootDirectory / fileToLoad.sample };
|
||||||
if (!std::filesystem::exists(file)) {
|
if (!std::filesystem::exists(file)) {
|
||||||
DBG("Background thread: no file " << fileToLoad.sample << " exists.");
|
DBG("Background thread: no file " << fileToLoad.sample << " exists.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SndfileHandle sndFile(reinterpret_cast<const char*>(file.c_str()));
|
SndfileHandle sndFile(reinterpret_cast<const char*>(file.c_str()));
|
||||||
auto fileLoaded = std::make_unique<StereoBuffer<float>>(fileToLoad.numFrames);
|
// auto deleteAndTrackBuffers = [this]
|
||||||
|
std::unique_ptr<StereoBuffer<float>, std::function<void(StereoBuffer<float>*)>> fileLoaded(new StereoBuffer<float>(fileToLoad.numFrames), deleteAndTrackBuffers);
|
||||||
auto readBuffer = std::make_unique<Buffer<float>>(fileToLoad.numFrames * 2);
|
auto readBuffer = std::make_unique<Buffer<float>>(fileToLoad.numFrames * 2);
|
||||||
sndFile.readf(readBuffer->data(), fileToLoad.numFrames);
|
sndFile.readf(readBuffer->data(), fileToLoad.numFrames);
|
||||||
fileLoaded->readInterleaved(*readBuffer);
|
fileLoaded->readInterleaved(*readBuffer);
|
||||||
ASSERT(fileLoaded != nullptr);
|
ASSERT(fileLoaded != nullptr);
|
||||||
|
fileBuffers++;
|
||||||
fileToLoad.voice->setFileData(std::move(fileLoaded));
|
fileToLoad.voice->setFileData(std::move(fileLoaded));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -40,6 +40,14 @@ public:
|
||||||
};
|
};
|
||||||
std::optional<FileInformation> getFileInformation(std::string_view filename);
|
std::optional<FileInformation> getFileInformation(std::string_view filename);
|
||||||
void enqueueLoading(Voice* voice, std::string_view sample, int numFrames);
|
void enqueueLoading(Voice* voice, std::string_view sample, int numFrames);
|
||||||
|
static void deleteAndTrackBuffers(StereoBuffer<float>* buffer) {
|
||||||
|
fileBuffers--;
|
||||||
|
delete buffer;
|
||||||
|
};
|
||||||
|
static int getFileBuffers()
|
||||||
|
{
|
||||||
|
return fileBuffers.load();
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
std::filesystem::path rootDirectory;
|
std::filesystem::path rootDirectory;
|
||||||
struct FileLoadingInformation
|
struct FileLoadingInformation
|
||||||
|
|
@ -48,11 +56,15 @@ private:
|
||||||
std::string_view sample;
|
std::string_view sample;
|
||||||
int numFrames;
|
int numFrames;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline static std::atomic<int> fileBuffers { 0 };
|
||||||
|
|
||||||
moodycamel::BlockingReaderWriterQueue<FileLoadingInformation> loadingQueue;
|
moodycamel::BlockingReaderWriterQueue<FileLoadingInformation> loadingQueue;
|
||||||
void loadingThread();
|
void loadingThread();
|
||||||
std::thread fileLoadingThread;
|
std::thread fileLoadingThread;
|
||||||
bool quitThread { false };
|
bool quitThread { false };
|
||||||
Buffer<float> tempReadBuffer { config::preloadSize * 2 };
|
Buffer<float> tempReadBuffer { config::preloadSize * 2 };
|
||||||
|
|
||||||
// std::map<std::string_view, std::shared_ptr<StereoBuffer<float>>> preloadedData;
|
// std::map<std::string_view, std::shared_ptr<StereoBuffer<float>>> preloadedData;
|
||||||
absl::flat_hash_map<std::string_view, std::shared_ptr<StereoBuffer<float>>> preloadedData;
|
absl::flat_hash_map<std::string_view, std::shared_ptr<StereoBuffer<float>>> preloadedData;
|
||||||
LEAK_DETECTOR(FilePool);
|
LEAK_DETECTOR(FilePool);
|
||||||
|
|
|
||||||
|
|
@ -176,8 +176,14 @@ private:
|
||||||
bool threadsShouldQuit { false };
|
bool threadsShouldQuit { false };
|
||||||
std::thread garbageCollectionThread { [&]() {
|
std::thread garbageCollectionThread { [&]() {
|
||||||
while (!threadsShouldQuit) {
|
while (!threadsShouldQuit) {
|
||||||
|
auto activeVoices { 0 };
|
||||||
for (auto& voice : voices)
|
for (auto& voice : voices)
|
||||||
|
{
|
||||||
voice->garbageCollect();
|
voice->garbageCollect();
|
||||||
|
if (!voice->isFree())
|
||||||
|
activeVoices++;
|
||||||
|
}
|
||||||
|
DBG("Active voices:" << activeVoices << " | Stray buffers: " << FilePool::getFileBuffers());
|
||||||
std::this_thread::sleep_for(1s);
|
std::this_thread::sleep_for(1s);
|
||||||
}
|
}
|
||||||
} };
|
} };
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ public:
|
||||||
normalizePercents(region->amplitudeEG.getStart(ccState, velocity)));
|
normalizePercents(region->amplitudeEG.getStart(ccState, velocity)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void setFileData(std::unique_ptr<StereoBuffer<float>> file)
|
void setFileData(std::unique_ptr<StereoBuffer<float>, std::function<void(StereoBuffer<float>*)>> file)
|
||||||
{
|
{
|
||||||
fileData = std::move(file);
|
fileData = std::move(file);
|
||||||
dataReady.store(true, std::memory_order_seq_cst);
|
dataReady.store(true, std::memory_order_seq_cst);
|
||||||
|
|
@ -232,7 +232,7 @@ private:
|
||||||
uint32_t initialDelay;
|
uint32_t initialDelay;
|
||||||
|
|
||||||
std::atomic<bool> dataReady { false };
|
std::atomic<bool> dataReady { false };
|
||||||
std::unique_ptr<StereoBuffer<float>> fileData;
|
std::unique_ptr<StereoBuffer<float>, std::function<void(StereoBuffer<float>*)>> fileData;
|
||||||
|
|
||||||
Buffer<float> tempBuffer1;
|
Buffer<float> tempBuffer1;
|
||||||
Buffer<float> tempBuffer2;
|
Buffer<float> tempBuffer2;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue