diff --git a/carla b/carla index ca15445..93d3fff 160000 --- a/carla +++ b/carla @@ -1 +1 @@ -Subproject commit ca15445429d7ff872fd40db23e24840cc6b90436 +Subproject commit 93d3fff123f7630be1a28912c029b9775ffd0feb diff --git a/dpf b/dpf index 58153fd..5e77ebb 160000 --- a/dpf +++ b/dpf @@ -1 +1 @@ -Subproject commit 58153fdefd7c2e33421a1cd1aa15d02add36262a +Subproject commit 5e77ebb317d5fd7209386ce8eb367682896d02b2 diff --git a/plugins/Common/IldaeilBasePlugin.hpp b/plugins/Common/IldaeilBasePlugin.hpp index 6e2d0dc..39b5203 100644 --- a/plugins/Common/IldaeilBasePlugin.hpp +++ b/plugins/Common/IldaeilBasePlugin.hpp @@ -32,6 +32,7 @@ class IldaeilBasePlugin : public Plugin { public: static Mutex sPluginInfoLoadMutex; + static const char* getPathForJSFX(); const NativePluginDescriptor* fCarlaPluginDescriptor; NativePluginHandle fCarlaPluginHandle; diff --git a/plugins/Common/IldaeilPlugin.cpp b/plugins/Common/IldaeilPlugin.cpp index 6e2bde8..7b68365 100644 --- a/plugins/Common/IldaeilPlugin.cpp +++ b/plugins/Common/IldaeilPlugin.cpp @@ -18,14 +18,13 @@ #include "IldaeilBasePlugin.hpp" #include "CarlaEngine.hpp" +#include "water/files/File.h" #include "water/streams/MemoryOutputStream.h" #include "water/xml/XmlDocument.h" START_NAMESPACE_DISTRHO -// -------------------------------------------------------------------------------------------------------------------- - -Mutex IldaeilBasePlugin::sPluginInfoLoadMutex; +using namespace CARLA_BACKEND_NAMESPACE; // -------------------------------------------------------------------------------------------------------------------- @@ -44,7 +43,39 @@ static intptr_t host_dispatcher(NativeHostHandle handle, NativeHostDispatcherOpc // -------------------------------------------------------------------------------------------------------------------- -using namespace CARLA_BACKEND_NAMESPACE; +Mutex IldaeilBasePlugin::sPluginInfoLoadMutex; + +// -------------------------------------------------------------------------------------------------------------------- + +const char* IldaeilBasePlugin::getPathForJSFX() +{ + static water::String path; + + if (path.isEmpty()) + { + #if defined(CARLA_OS_MAC) + path = water::File::getSpecialLocation(File::userHomeDirectory).getFullPathName() + + "/Library/Application Support/REAPER/Effects"; + #elif defined(CARLA_OS_WASM) + path = "/jsfx"; + #elif defined(CARLA_OS_WIN) + path = water::File::getSpecialLocation(water::File::winAppData).getFullPathName() + "\\REAPER\\Effects"; + if (! system::exists(path)) + path = water::File::getSpecialLocation(water::File::winProgramFiles).getFullPathName() + + "\\REAPER\\InstallData\\Effects"; + #else + if (const char* const configHome = std::getenv("XDG_CONFIG_HOME")) + path = configHome; + else + path = water::File::getSpecialLocation(water::File::userHomeDirectory).getFullPathName() + "/.config"; + path += "/REAPER/Effects"; + #endif + } + + return path.toRawUTF8(); +} + +// -------------------------------------------------------------------------------------------------------------------- class IldaeilPlugin : public IldaeilBasePlugin { @@ -119,6 +150,8 @@ public: if (const char* const path = std::getenv("LV2_PATH")) carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LV2, path); + carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PLUGIN_PATH, PLUGIN_JSFX, getPathForJSFX()); + fCarlaPluginDescriptor->dispatcher(fCarlaPluginHandle, NATIVE_PLUGIN_OPCODE_HOST_USES_EMBED, 0, 0, nullptr, 0.0f); diff --git a/plugins/Common/IldaeilUI.cpp b/plugins/Common/IldaeilUI.cpp index 71f9313..923509f 100644 --- a/plugins/Common/IldaeilUI.cpp +++ b/plugins/Common/IldaeilUI.cpp @@ -43,14 +43,14 @@ namespace ildaeil { } #endif -#define WASM_TESTING +// #define WASM_TESTING START_NAMESPACE_DISTRHO -// -------------------------------------------------------------------------------------------------------------------- - using namespace CARLA_BACKEND_NAMESPACE; +// -------------------------------------------------------------------------------------------------------------------- + class IldaeilUI : public UI, public Runner, public PluginHostWindow::Callbacks @@ -258,7 +258,7 @@ public: fPlugin->fUI = this; #ifdef WASM_TESTING - if (carla_add_plugin(handle, BINARY_NATIVE, fPluginType, nullptr, nullptr, + if (carla_add_plugin(handle, BINARY_NATIVE, PLUGIN_INTERNAL, nullptr, nullptr, "midifile", 0, 0x0, PLUGIN_OPTIONS_NULL)) { d_stdout("Special hack for MIDI file playback activated"); @@ -267,14 +267,14 @@ public: carla_set_parameter_value(handle, 0, 1, 0.0f); fPluginId = 2; } - carla_add_plugin(handle, BINARY_NATIVE, fPluginType, nullptr, nullptr, "miditranspose", 0, 0x0, PLUGIN_OPTIONS_NULL); - carla_add_plugin(handle, BINARY_NATIVE, fPluginType, nullptr, nullptr, "bypass", 0, 0x0, PLUGIN_OPTIONS_NULL); - carla_add_plugin(handle, BINARY_NATIVE, fPluginType, nullptr, nullptr, "3bandeq", 0, 0x0, PLUGIN_OPTIONS_NULL); - carla_add_plugin(handle, BINARY_NATIVE, fPluginType, nullptr, nullptr, "pingpongpan", 0, 0x0, PLUGIN_OPTIONS_NULL); + carla_add_plugin(handle, BINARY_NATIVE, PLUGIN_INTERNAL, nullptr, nullptr, "miditranspose", 0, 0x0, PLUGIN_OPTIONS_NULL); + carla_add_plugin(handle, BINARY_NATIVE, PLUGIN_INTERNAL, nullptr, nullptr, "bypass", 0, 0x0, PLUGIN_OPTIONS_NULL); + carla_add_plugin(handle, BINARY_NATIVE, PLUGIN_INTERNAL, nullptr, nullptr, "3bandeq", 0, 0x0, PLUGIN_OPTIONS_NULL); + carla_add_plugin(handle, BINARY_NATIVE, PLUGIN_INTERNAL, nullptr, nullptr, "pingpongpan", 0, 0x0, PLUGIN_OPTIONS_NULL); carla_set_parameter_value(handle, 4, 1, 0.0f); - carla_add_plugin(handle, BINARY_NATIVE, fPluginType, nullptr, nullptr, "audiogain_s", 0, 0x0, PLUGIN_OPTIONS_NULL); + carla_add_plugin(handle, BINARY_NATIVE, PLUGIN_INTERNAL, nullptr, nullptr, "audiogain_s", 0, 0x0, PLUGIN_OPTIONS_NULL); for (uint i=0; i<5; ++i) - carla_add_plugin(handle, BINARY_NATIVE, fPluginType, nullptr, nullptr, "bypass", 0, 0x0, PLUGIN_OPTIONS_NULL); + carla_add_plugin(handle, BINARY_NATIVE, PLUGIN_INTERNAL, nullptr, nullptr, "bypass", 0, 0x0, PLUGIN_OPTIONS_NULL); #endif } @@ -572,13 +572,13 @@ protected: { case kIdleInit: fIdleState = kIdleNothing; - startRunner(); + initAndStartRunner(); break; case kIdleInitPluginAlreadyLoaded: fIdleState = kIdleNothing; showPluginUI(handle, false); - startRunner(); + initAndStartRunner(); break; case kIdlePluginLoadedFromDSP: @@ -624,7 +624,7 @@ protected: fPluginSelected = -1; stopRunner(); fPluginType = fNextPluginType; - startRunner(); + initAndStartRunner(); break; case kIdleNothing: @@ -644,7 +644,7 @@ protected: { case PLUGIN_INTERNAL: case PLUGIN_AU: - // case PLUGIN_JSFX: + case PLUGIN_JSFX: case PLUGIN_SFZ: label = info.label; break; @@ -670,13 +670,13 @@ protected: carla_set_custom_data(fPlugin->fCarlaHostHandle, fPluginId, CUSTOM_DATA_TYPE_STRING, "file", filename); } - bool startRunner() + bool initAndStartRunner() { if (isRunnerActive()) stopRunner(); - fRunnerData.needsReinit = true; - return Runner::startRunner(); + fRunnerData.init(); + return startRunner(); } bool run() override @@ -691,14 +691,14 @@ protected: case PLUGIN_LV2: path = std::getenv("LV2_PATH"); break; + case PLUGIN_JSFX: + path = fPlugin->getPathForJSFX(); + break; default: path = nullptr; break; } - if (path != nullptr) - carla_set_engine_option(fPlugin->fCarlaHostHandle, ENGINE_OPTION_PLUGIN_PATH, fPluginType, path); - fPluginCount = 0; delete[] fPlugins; @@ -1055,6 +1055,7 @@ protected: static const char* pluginTypes[] = { getPluginTypeAsString(PLUGIN_INTERNAL), getPluginTypeAsString(PLUGIN_LV2), + getPluginTypeAsString(PLUGIN_JSFX), }; setupMainWindowPos(); @@ -1100,6 +1101,9 @@ protected: int current; switch (fPluginType) { + case PLUGIN_JSFX: + current = 2; + break; case PLUGIN_LV2: current = 1; break; @@ -1119,6 +1123,9 @@ protected: case 1: fNextPluginType = PLUGIN_LV2; break; + case 2: + fNextPluginType = PLUGIN_JSFX; + break; } } @@ -1155,7 +1162,7 @@ protected: case PLUGIN_INTERNAL: case PLUGIN_AU: case PLUGIN_SFZ: - // case PLUGIN_JSFX: + case PLUGIN_JSFX: ImGui::TableSetupColumn("Name"); ImGui::TableSetupColumn("Label"); ImGui::TableHeadersRow(); @@ -1182,7 +1189,7 @@ protected: { case PLUGIN_INTERNAL: case PLUGIN_AU: - // case PLUGIN_JSFX: + case PLUGIN_JSFX: case PLUGIN_SFZ: ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0);