From 19878f0097f8abe5f0d197ff371ab11d6d12c22e Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 13 Aug 2022 00:01:06 +0100 Subject: [PATCH] Allow loading uncompressed plugin state; Allow patch wasm url --- src/CardinalCommon.cpp | 1 + src/CardinalCommon.hpp | 1 + src/CardinalPlugin.cpp | 36 ++++++++++++++++++++++++++++++++++-- src/CardinalUI.cpp | 9 +++++++++ src/PluginContext.hpp | 4 ++++ 5 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/CardinalCommon.cpp b/src/CardinalCommon.cpp index 5f3f4ef..968e1b4 100644 --- a/src/CardinalCommon.cpp +++ b/src/CardinalCommon.cpp @@ -98,6 +98,7 @@ std::string getSpecialPath(const SpecialPath type) #endif #ifdef DISTRHO_OS_WASM +char* patchFromURL = nullptr; char* patchStorageSlug = nullptr; #endif diff --git a/src/CardinalCommon.hpp b/src/CardinalCommon.hpp index d43142f..8bb471d 100644 --- a/src/CardinalCommon.hpp +++ b/src/CardinalCommon.hpp @@ -58,6 +58,7 @@ std::string getSpecialPath(SpecialPath type); #endif #ifdef DISTRHO_OS_WASM +extern char* patchFromURL; extern char* patchStorageSlug; #endif diff --git a/src/CardinalPlugin.cpp b/src/CardinalPlugin.cpp index 5eb1e95..0ddbcf9 100644 --- a/src/CardinalPlugin.cpp +++ b/src/CardinalPlugin.cpp @@ -104,6 +104,19 @@ bool d_isDiffHigherThanLimit(const T& v1, const T& v2, const T& limit) // ----------------------------------------------------------------------------------------------------------- #ifdef DISTRHO_OS_WASM +static char* getPatchFileEncodedInURL() { + return static_cast(EM_ASM_PTR({ + var searchParams = new URLSearchParams(window.location.search); + var patch = searchParams.get('patch'); + if (!patch) + return null; + var length = lengthBytesUTF8(patch) + 1; + var str = _malloc(length); + stringToUTF8(patch, str, length); + return str; + })); +}; + static char* getPatchStorageSlug() { return static_cast(EM_ASM_PTR({ var searchParams = new URLSearchParams(window.location.search); @@ -606,7 +619,8 @@ public: context->window = new rack::window::Window; #ifdef DISTRHO_OS_WASM - if ((rack::patchStorageSlug = getPatchStorageSlug()) == nullptr) + if ((rack::patchStorageSlug = getPatchStorageSlug()) == nullptr && + (rack::patchFromURL = getPatchFileEncodedInURL()) == nullptr) #endif { context->patch->loadTemplate(); @@ -1143,11 +1157,29 @@ protected: const std::vector data(d_getChunkFromBase64String(value)); + DISTRHO_SAFE_ASSERT_RETURN(data.size() >= 4,); + const ScopedContext sc(this); rack::system::removeRecursively(fAutosavePath); rack::system::createDirectories(fAutosavePath); - rack::system::unarchiveToDirectory(data, fAutosavePath); + + static constexpr const char zstdMagic[] = "\x28\xb5\x2f\xfd"; + + if (std::memcmp(data.data(), zstdMagic, sizeof(zstdMagic)) != 0) + { + FILE* const f = std::fopen(rack::system::join(fAutosavePath, "patch.json").c_str(), "w"); + DISTRHO_SAFE_ASSERT_RETURN(f != nullptr,); + + std::fwrite(data.data(), data.size(), 1, f); + std::fclose(f); + } + else + { + try { + rack::system::unarchiveToDirectory(data, fAutosavePath); + } DISTRHO_SAFE_EXCEPTION_RETURN("setState unarchiveToDirectory",); + } try { context->patch->loadAutosave(); diff --git a/src/CardinalUI.cpp b/src/CardinalUI.cpp index aaade1b..324f31b 100644 --- a/src/CardinalUI.cpp +++ b/src/CardinalUI.cpp @@ -389,9 +389,18 @@ public: #ifdef DISTRHO_OS_WASM if (rack::patchStorageSlug != nullptr) + { psDialog = new WasmPatchStorageLoadingDialog(); + } + else if (rack::patchFromURL != nullptr) + { + static_cast(context->plugin)->setState("patch", rack::patchFromURL); + rack::contextSet(context); + } else + { new WasmWelcomeDialog(); + } #endif context->window->step(); diff --git a/src/PluginContext.hpp b/src/PluginContext.hpp index 558260f..e578231 100644 --- a/src/PluginContext.hpp +++ b/src/PluginContext.hpp @@ -135,6 +135,10 @@ public: : Plugin(parameterCount, programCount, stateCount), context(new CardinalPluginContext(this)) {} ~CardinalBasePlugin() override {} + +#ifndef HEADLESS + friend class CardinalUI; +#endif }; #ifndef HEADLESS