From 0ecf6954e1a10f926bec993043b3ba1b7420035c Mon Sep 17 00:00:00 2001 From: falkTX Date: Mon, 18 Oct 2021 00:31:55 +0100 Subject: [PATCH] Create unique temporary path per instance for auto-save function Signed-off-by: falkTX --- src/CardinalPlugin.cpp | 43 ++++++++++++++++++++++++++++++++++++++--- src/DistrhoPluginInfo.h | 2 +- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/CardinalPlugin.cpp b/src/CardinalPlugin.cpp index 20f5433..da3f52d 100644 --- a/src/CardinalPlugin.cpp +++ b/src/CardinalPlugin.cpp @@ -130,6 +130,7 @@ static const Initializer& getInitializerInstance() class CardinalPlugin : public Plugin { rack::Context* const fContext; + std::string fAutosavePath; struct ScopedContext { ScopedContext(CardinalPlugin* const plugin) @@ -148,20 +149,44 @@ public: : Plugin(0, 0, 0), fContext(new rack::Context) { + // create unique temporary path for this instance + try { + char uidBuf[24]; + const std::string tmp = rack::system::getTempDirectory(); + + for (int i=1;; ++i) + { + std::snprintf(uidBuf, sizeof(uidBuf), "Cardinal.%04d", i); + const std::string trypath = rack::system::join(tmp, uidBuf); + + if (! rack::system::exists(trypath)) + { + if (rack::system::createDirectories(trypath)) + fAutosavePath = trypath; + break; + } + } + } DISTRHO_SAFE_EXCEPTION("create unique temporary path"); + + // create temporary path const ScopedContext sc(this); fContext->engine = new rack::engine::Engine; fContext->history = new rack::history::State; fContext->patch = new rack::patch::Manager; - fContext->patch->autosavePath = "/OBVIOUSLY-NOT-VALID-PATH/"; + fContext->patch->autosavePath = fAutosavePath; fContext->engine->startFallbackThread(); } ~CardinalPlugin() override { - const ScopedContext sc(this); + { + const ScopedContext sc(this); + delete fContext; + } - delete fContext; + if (! fAutosavePath.empty()) + rack::system::removeRecursively(fAutosavePath); } rack::Context* getRackContext() const noexcept @@ -246,6 +271,11 @@ protected: */ void run(const float** inputs, float** outputs, uint32_t frames) override { + /* + fContext->engine->setFrame(getTimePosition().frame); + fContext->engine->stepBlock(frames); + */ + // copy inputs over outputs if needed if (outputs[0] != inputs[0]) std::memcpy(outputs[0], inputs[0], sizeof(float)*frames); @@ -254,6 +284,13 @@ protected: std::memcpy(outputs[1], inputs[1], sizeof(float)*frames); } + /* + void sampleRateChanged(const double newSampleRate) override + { + fContext->engine->setSampleRate(newSampleRate); + } + */ + // ------------------------------------------------------------------------------------------------------- private: diff --git a/src/DistrhoPluginInfo.h b/src/DistrhoPluginInfo.h index 1fe8ce0..6d8ca52 100644 --- a/src/DistrhoPluginInfo.h +++ b/src/DistrhoPluginInfo.h @@ -25,12 +25,12 @@ #define DISTRHO_PLUGIN_HAS_UI 1 #define DISTRHO_PLUGIN_NUM_INPUTS 2 #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 +#define DISTRHO_PLUGIN_WANT_TIMEPOS 1 #define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 1 // #define DISTRHO_PLUGIN_LV2_CATEGORY "lv2:AnalyserPlugin" // #define DISTRHO_PLUGIN_VST3_CATEGORIES "Fx|Analyzer" #define DISTRHO_UI_USE_NANOVG 1 #define DISTRHO_UI_USER_RESIZABLE 0 -#define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 1 enum Parameters { kParameterCount