Closes #195tags/1.9.6
| @@ -25,6 +25,7 @@ | |||
| #include "CarlaLv2Utils.hpp" | |||
| #include "CarlaBase64Utils.hpp" | |||
| #include "CarlaEngineUtils.hpp" | |||
| #include "CarlaPipeUtils.hpp" | |||
| #include "CarlaPluginUI.hpp" | |||
| #include "Lv2AtomRingBuffer.hpp" | |||
| @@ -393,8 +394,9 @@ public: | |||
| UiCrashed | |||
| }; | |||
| CarlaPipeServerLV2(CarlaPluginLV2* const plugin) | |||
| : kPlugin(plugin), | |||
| CarlaPipeServerLV2(CarlaEngine* const engine, CarlaPluginLV2* const plugin) | |||
| : kEngine(engine), | |||
| kPlugin(plugin), | |||
| fFilename(), | |||
| fPluginURI(), | |||
| fUiURI(), | |||
| @@ -422,6 +424,12 @@ public: | |||
| 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); | |||
| } | |||
| @@ -470,6 +478,7 @@ protected: | |||
| bool msgReceived(const char* const msg) noexcept override; | |||
| private: | |||
| CarlaEngine* const kEngine; | |||
| CarlaPluginLV2* const kPlugin; | |||
| CarlaString fFilename; | |||
| @@ -506,7 +515,7 @@ public: | |||
| fEventsIn(), | |||
| fEventsOut(), | |||
| fLv2Options(), | |||
| fPipeServer(this), | |||
| fPipeServer(engine, this), | |||
| fCustomURIDs(), | |||
| fFirstActive(true), | |||
| 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 | |||
| : fLocale(carla_strdup_safe(::setlocale(LC_NUMERIC, nullptr))) | |||
| { | |||
| @@ -319,6 +319,22 @@ public: | |||
| 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 | |||
| @@ -258,6 +258,23 @@ void carla_setenv(const char* const key, const char* const value) noexcept | |||
| #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 | |||