Closes #195tags/1.9.6
| @@ -25,6 +25,7 @@ | |||||
| #include "CarlaLv2Utils.hpp" | #include "CarlaLv2Utils.hpp" | ||||
| #include "CarlaBase64Utils.hpp" | #include "CarlaBase64Utils.hpp" | ||||
| #include "CarlaEngineUtils.hpp" | |||||
| #include "CarlaPipeUtils.hpp" | #include "CarlaPipeUtils.hpp" | ||||
| #include "CarlaPluginUI.hpp" | #include "CarlaPluginUI.hpp" | ||||
| #include "Lv2AtomRingBuffer.hpp" | #include "Lv2AtomRingBuffer.hpp" | ||||
| @@ -393,8 +394,9 @@ public: | |||||
| UiCrashed | UiCrashed | ||||
| }; | }; | ||||
| CarlaPipeServerLV2(CarlaPluginLV2* const plugin) | |||||
| : kPlugin(plugin), | |||||
| CarlaPipeServerLV2(CarlaEngine* const engine, CarlaPluginLV2* const plugin) | |||||
| : kEngine(engine), | |||||
| kPlugin(plugin), | |||||
| fFilename(), | fFilename(), | ||||
| fPluginURI(), | fPluginURI(), | ||||
| fUiURI(), | fUiURI(), | ||||
| @@ -422,6 +424,12 @@ public: | |||||
| bool startPipeServer() noexcept | bool startPipeServer() noexcept | ||||
| { | { | ||||
| const ScopedEngineEnvironmentLocker _seel(kEngine); | |||||
| const ScopedEnvVar _sev1("LV2_PATH", kEngine->getOptions().pathLV2); | |||||
| #ifdef CARLA_OS_LINUX | |||||
| const ScopedEnvVar _sev2("LD_PRELOAD", nullptr); | |||||
| #endif | |||||
| return CarlaPipeServer::startPipeServer(fFilename, fPluginURI, fUiURI); | return CarlaPipeServer::startPipeServer(fFilename, fPluginURI, fUiURI); | ||||
| } | } | ||||
| @@ -470,6 +478,7 @@ protected: | |||||
| bool msgReceived(const char* const msg) noexcept override; | bool msgReceived(const char* const msg) noexcept override; | ||||
| private: | private: | ||||
| CarlaEngine* const kEngine; | |||||
| CarlaPluginLV2* const kPlugin; | CarlaPluginLV2* const kPlugin; | ||||
| CarlaString fFilename; | CarlaString fFilename; | ||||
| @@ -506,7 +515,7 @@ public: | |||||
| fEventsIn(), | fEventsIn(), | ||||
| fEventsOut(), | fEventsOut(), | ||||
| fLv2Options(), | fLv2Options(), | ||||
| fPipeServer(this), | |||||
| fPipeServer(engine, this), | |||||
| fCustomURIDs(), | fCustomURIDs(), | ||||
| fFirstActive(true), | fFirstActive(true), | ||||
| fLastStateChunk(nullptr), | fLastStateChunk(nullptr), | ||||
| @@ -1558,6 +1558,53 @@ void CarlaPipeClient::closePipeClient() noexcept | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| ScopedEnvVar::ScopedEnvVar(const char* const key, const char* const value) noexcept | |||||
| : fKey(nullptr), | |||||
| fOrigValue(nullptr) | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); | |||||
| fKey = carla_strdup_safe(key); | |||||
| CARLA_SAFE_ASSERT_RETURN(fKey != nullptr,); | |||||
| if (const char* const origValue = std::getenv(key)) | |||||
| { | |||||
| fOrigValue = carla_strdup_safe(origValue); | |||||
| CARLA_SAFE_ASSERT_RETURN(fOrigValue != nullptr,); | |||||
| } | |||||
| if (value != nullptr) | |||||
| carla_setenv(key, value); | |||||
| else if (fOrigValue != nullptr) | |||||
| carla_unsetenv(key); | |||||
| } | |||||
| ScopedEnvVar::~ScopedEnvVar() noexcept | |||||
| { | |||||
| bool hasOrigValue = false; | |||||
| if (fOrigValue != nullptr) | |||||
| { | |||||
| hasOrigValue = true; | |||||
| carla_setenv(fKey, fOrigValue); | |||||
| delete[] fOrigValue; | |||||
| fOrigValue = nullptr; | |||||
| } | |||||
| if (fKey != nullptr) | |||||
| { | |||||
| if (! hasOrigValue) | |||||
| carla_unsetenv(fKey); | |||||
| delete[] fKey; | |||||
| fKey = nullptr; | |||||
| } | |||||
| } | |||||
| // ----------------------------------------------------------------------- | |||||
| ScopedLocale::ScopedLocale() noexcept | ScopedLocale::ScopedLocale() noexcept | ||||
| : fLocale(carla_strdup_safe(::setlocale(LC_NUMERIC, nullptr))) | : fLocale(carla_strdup_safe(::setlocale(LC_NUMERIC, nullptr))) | ||||
| { | { | ||||
| @@ -319,6 +319,22 @@ public: | |||||
| CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPipeClient) | CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPipeClient) | ||||
| }; | }; | ||||
| // ----------------------------------------------------------------------- | |||||
| // ScopedEnvVar class | |||||
| class ScopedEnvVar { | |||||
| public: | |||||
| ScopedEnvVar(const char* const key, const char* const value) noexcept; | |||||
| ~ScopedEnvVar() noexcept; | |||||
| private: | |||||
| const char* fKey; | |||||
| const char* fOrigValue; | |||||
| CARLA_DECLARE_NON_COPY_CLASS(ScopedEnvVar) | |||||
| CARLA_PREVENT_HEAP_ALLOCATION | |||||
| }; | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // ScopedLocale class | // ScopedLocale class | ||||
| @@ -258,6 +258,23 @@ void carla_setenv(const char* const key, const char* const value) noexcept | |||||
| #endif | #endif | ||||
| } | } | ||||
| /* | |||||
| * Unset environment variable 'key'. | |||||
| */ | |||||
| static inline | |||||
| void carla_unsetenv(const char* const key) noexcept | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); | |||||
| #ifdef CARLA_OS_WIN | |||||
| try { | |||||
| ::SetEnvironmentVariableA(key, nullptr); | |||||
| } CARLA_SAFE_EXCEPTION("carla_unsetenv"); | |||||
| #else | |||||
| ::unsetenv(key); | |||||
| #endif | |||||
| } | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // carla_strdup | // carla_strdup | ||||