| @@ -955,7 +955,7 @@ | |||
| <item row="1" column="0" colspan="3"> | |||
| <widget class="QCheckBox" name="ch_engine_uis_always_on_top"> | |||
| <property name="text"> | |||
| <string>Make UIs always-on-top</string> | |||
| <string>Make plugin UIs always-on-top</string> | |||
| </property> | |||
| </widget> | |||
| </item> | |||
| @@ -1482,20 +1482,20 @@ | |||
| </layout> | |||
| </item> | |||
| <item> | |||
| <widget class="QGroupBox" name="group_advanced_main"> | |||
| <widget class="QGroupBox" name="group_experimental_main"> | |||
| <property name="title"> | |||
| <string>Main</string> | |||
| </property> | |||
| <layout class="QVBoxLayout" name="verticalLayout_17"> | |||
| <item> | |||
| <widget class="QCheckBox" name="cb_advanced_plugin_bridges"> | |||
| <widget class="QCheckBox" name="cb_exp_plugin_bridges"> | |||
| <property name="text"> | |||
| <string>Enable plugin bridges</string> | |||
| </property> | |||
| </widget> | |||
| </item> | |||
| <item> | |||
| <widget class="QCheckBox" name="ch_advanced_load_lib_global"> | |||
| <widget class="QCheckBox" name="ch_exp_load_lib_global"> | |||
| <property name="text"> | |||
| <string>Load Carla backend in global namespace (NOT RECOMMENDED)</string> | |||
| </property> | |||
| @@ -1505,7 +1505,7 @@ | |||
| </widget> | |||
| </item> | |||
| <item> | |||
| <widget class="QGroupBox" name="group_advanced_canvas"> | |||
| <widget class="QGroupBox" name="group_experimental_canvas"> | |||
| <property name="title"> | |||
| <string>Canvas</string> | |||
| </property> | |||
| @@ -1538,7 +1538,7 @@ | |||
| </widget> | |||
| </item> | |||
| <item> | |||
| <widget class="QGroupBox" name="group_avanced_engine"> | |||
| <widget class="QGroupBox" name="group_experimental_engine"> | |||
| <property name="title"> | |||
| <string>Engine</string> | |||
| </property> | |||
| @@ -1554,6 +1554,13 @@ This mode is not available for VST plugins.</string> | |||
| </property> | |||
| </widget> | |||
| </item> | |||
| <item> | |||
| <widget class="QCheckBox" name="ch_exp_prevent_bad_behaviour"> | |||
| <property name="text"> | |||
| <string>Prevent plugins from doing bad stuff (needs restart)</string> | |||
| </property> | |||
| </widget> | |||
| </item> | |||
| <item> | |||
| <widget class="QCheckBox" name="ch_engine_prefer_plugin_bridges"> | |||
| <property name="toolTip"> | |||
| @@ -1587,7 +1587,7 @@ void CarlaEngine::setOption(const EngineOption option, const int value, const ch | |||
| #ifdef CARLA_OS_LINUX | |||
| if (value != 0) | |||
| { | |||
| CarlaString interposerPath(CarlaString(pData->options.binaryDir) + CARLA_OS_SEP_STR "libcarla_interposer.so"); | |||
| CarlaString interposerPath(CarlaString(pData->options.binaryDir) + "/libcarla_interposer-safe.so"); | |||
| ::setenv("LD_PRELOAD", interposerPath.buffer(), 1); | |||
| } | |||
| else | |||
| @@ -26,6 +26,7 @@ | |||
| #include "CarlaBridgeUtils.hpp" | |||
| #include "CarlaEngineUtils.hpp" | |||
| #include "CarlaMathUtils.hpp" | |||
| #include "CarlaPipeUtils.hpp" | |||
| #include "CarlaShmUtils.hpp" | |||
| #include "CarlaThread.hpp" | |||
| @@ -156,10 +157,8 @@ protected: | |||
| const ScopedEngineEnvironmentLocker _seel(kEngine); | |||
| #ifdef CARLA_OS_LINUX | |||
| const char* const oldPreload(std::getenv("LD_PRELOAD")); | |||
| if (oldPreload != nullptr) | |||
| ::unsetenv("LD_PRELOAD"); | |||
| const ScopedEnvVar sev1("LD_LIBRARY_PATH", nullptr); | |||
| const ScopedEnvVar sev2("LD_PRELOAD", nullptr); | |||
| #endif | |||
| carla_setenv("ENGINE_OPTION_FORCE_STEREO", bool2str(options.forceStereo)); | |||
| @@ -235,11 +234,6 @@ protected: | |||
| fBinary.toRawUTF8(), getPluginTypeAsString(kPlugin->getType()), filename.toRawUTF8(), fLabel.toRawUTF8(), kPlugin->getUniqueId()); | |||
| started = fProcess->start(arguments); | |||
| #ifdef CARLA_OS_LINUX | |||
| if (oldPreload != nullptr) | |||
| ::setenv("LD_PRELOAD", oldPreload, 1); | |||
| #endif | |||
| } | |||
| if (! started) | |||
| @@ -1233,9 +1233,9 @@ class CarlaHostMeta(object): | |||
| # settings | |||
| self.experimental = False | |||
| self.forceStereo = False | |||
| self.manageUIs = False | |||
| self.maxParameters = 0 | |||
| self.forceStereo = False | |||
| self.preferPluginBridges = False | |||
| self.preferUIBridges = False | |||
| self.preventBadBehaviour = False | |||
| @@ -1044,9 +1044,9 @@ class PluginRefreshW(QDialog): | |||
| self.loadSettings() | |||
| # ---------------------------------------------------------------------------------------------------- | |||
| # Disable bridges (experimental for now) | |||
| # Hide bridges if disabled | |||
| if not host.experimental: | |||
| if not host.showPluginBridges: | |||
| self.ui.ch_native.setChecked(True) | |||
| self.ui.ch_native.setEnabled(False) | |||
| self.ui.ch_native.setVisible(False) | |||
| @@ -2586,16 +2586,14 @@ def setHostSettings(host): | |||
| # kdevelop likes this :) | |||
| if False: host = CarlaHostNull() | |||
| # TEST | |||
| #host.preventBadBehaviour = True | |||
| host.set_engine_option(ENGINE_OPTION_FORCE_STEREO, host.forceStereo, "") | |||
| host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, host.maxParameters, "") | |||
| host.set_engine_option(ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, host.preferPluginBridges, "") | |||
| host.set_engine_option(ENGINE_OPTION_PREFER_UI_BRIDGES, host.preferUIBridges, "") | |||
| host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, host.uisAlwaysOnTop, "") | |||
| host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, host.maxParameters, "") | |||
| host.set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, host.uiBridgesTimeout, "") | |||
| host.set_engine_option(ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR, host.preventBadBehaviour, "") | |||
| host.set_engine_option(ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT, host.showLogs, "") | |||
| host.set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, host.uiBridgesTimeout, "") | |||
| host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, host.uisAlwaysOnTop, "") | |||
| if host.isPlugin: | |||
| return | |||
| @@ -274,7 +274,7 @@ class CarlaSettingsW(QDialog): | |||
| self.ui.ch_engine_force_stereo.setEnabled(False) | |||
| if host.isControl or host.isPlugin: | |||
| self.ui.ch_advanced_load_lib_global.hide() | |||
| self.ui.ch_exp_load_lib_global.hide() | |||
| # FIXME, pipes on win32 not working | |||
| if WINDOWS: | |||
| @@ -471,13 +471,17 @@ class CarlaSettingsW(QDialog): | |||
| # ---------------------------------------------------------------------------------------------------- | |||
| # Experimental | |||
| self.ui.cb_advanced_plugin_bridges.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, | |||
| CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES, | |||
| type=bool)) | |||
| self.ui.cb_exp_plugin_bridges.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, | |||
| CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES, | |||
| type=bool)) | |||
| self.ui.ch_advanced_load_lib_global.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, | |||
| CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL, | |||
| type=bool)) | |||
| self.ui.ch_exp_load_lib_global.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, | |||
| CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL, | |||
| type=bool)) | |||
| self.ui.ch_exp_prevent_bad_behaviour.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, | |||
| CARLA_DEFAULT_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, | |||
| type=bool)) | |||
| # -------------------------------------------------------------------------------------------------------- | |||
| @@ -493,18 +497,12 @@ class CarlaSettingsW(QDialog): | |||
| # ---------------------------------------------------------------------------------------------------- | |||
| # Main | |||
| self.host.showLogs = self.ui.ch_main_show_logs.isChecked() | |||
| self.host.uisAlwaysOnTop = self.ui.ch_engine_uis_always_on_top.isChecked() | |||
| settings.setValue(CARLA_KEY_MAIN_PROJECT_FOLDER, self.ui.le_main_proj_folder.text()) | |||
| settings.setValue(CARLA_KEY_MAIN_USE_PRO_THEME, self.ui.ch_main_theme_pro.isChecked()) | |||
| settings.setValue(CARLA_KEY_MAIN_PRO_THEME_COLOR, self.ui.cb_main_theme_color.currentText()) | |||
| settings.setValue(CARLA_KEY_MAIN_REFRESH_INTERVAL, self.ui.sb_main_refresh_interval.value()) | |||
| settings.setValue(CARLA_KEY_MAIN_USE_CUSTOM_SKINS, self.ui.ch_main_use_custom_skins.isChecked()) | |||
| settings.setValue(CARLA_KEY_MAIN_SHOW_LOGS, self.host.showLogs) | |||
| settings.setValue(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop) | |||
| # ---------------------------------------------------------------------------------------------------- | |||
| # Canvas | |||
| @@ -545,29 +543,33 @@ class CarlaSettingsW(QDialog): | |||
| settings.setValue(CARLA_KEY_ENGINE_PROCESS_MODE, self.host.nextProcessMode) | |||
| self.host.forceStereo = self.ui.ch_engine_force_stereo.isChecked() | |||
| self.host.maxParameters = self.ui.sb_engine_max_params.value() | |||
| self.host.manageUIs = self.ui.ch_engine_manage_uis.isChecked() | |||
| self.host.preferPluginBridges = self.ui.ch_engine_prefer_plugin_bridges.isChecked() | |||
| self.host.preferUIBridges = self.ui.ch_engine_prefer_ui_bridges.isChecked() | |||
| self.host.maxParameters = self.ui.sb_engine_max_params.value() | |||
| self.host.showLogs = self.ui.ch_main_show_logs.isChecked() | |||
| self.host.uiBridgesTimeout = self.ui.sb_engine_ui_bridges_timeout.value() | |||
| self.host.manageUIs = self.ui.ch_engine_manage_uis.isChecked() | |||
| self.host.uisAlwaysOnTop = self.ui.ch_engine_uis_always_on_top.isChecked() | |||
| if self.ui.ch_engine_force_stereo.isEnabled(): | |||
| self.host.set_engine_option(ENGINE_OPTION_FORCE_STEREO, self.host.forceStereo, "") | |||
| self.host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, self.host.maxParameters, "") | |||
| self.host.set_engine_option(ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, self.host.preferPluginBridges, "") | |||
| self.host.set_engine_option(ENGINE_OPTION_PREFER_UI_BRIDGES, self.host.preferUIBridges, "") | |||
| self.host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop, "") | |||
| self.host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, self.host.maxParameters, "") | |||
| self.host.set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, self.host.uiBridgesTimeout, "") | |||
| self.host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop, "") | |||
| if self.ui.ch_engine_force_stereo.isEnabled(): | |||
| settings.setValue(CARLA_KEY_ENGINE_FORCE_STEREO, self.host.forceStereo) | |||
| settings.setValue(CARLA_KEY_MAIN_SHOW_LOGS, self.host.showLogs) | |||
| settings.setValue(CARLA_KEY_ENGINE_MAX_PARAMETERS, self.host.maxParameters) | |||
| settings.setValue(CARLA_KEY_ENGINE_MANAGE_UIS, self.host.manageUIs) | |||
| settings.setValue(CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, self.host.preferPluginBridges) | |||
| settings.setValue(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, self.host.preferUIBridges) | |||
| settings.setValue(CARLA_KEY_ENGINE_MAX_PARAMETERS, self.host.maxParameters) | |||
| settings.setValue(CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT, self.host.uiBridgesTimeout) | |||
| settings.setValue(CARLA_KEY_ENGINE_MANAGE_UIS, self.host.manageUIs) | |||
| settings.setValue(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop) | |||
| # ---------------------------------------------------------------------------------------------------- | |||
| # Paths | |||
| @@ -626,8 +628,9 @@ class CarlaSettingsW(QDialog): | |||
| # ---------------------------------------------------------------------------------------------------- | |||
| # Experimental | |||
| settings.setValue(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, self.ui.cb_advanced_plugin_bridges.isChecked()) | |||
| settings.setValue(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, self.ui.ch_advanced_load_lib_global.isChecked()) | |||
| settings.setValue(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, self.ui.cb_exp_plugin_bridges.isChecked()) | |||
| settings.setValue(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, self.ui.ch_exp_load_lib_global.isChecked()) | |||
| settings.setValue(CARLA_KEY_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, self.ui.ch_exp_prevent_bad_behaviour.isChecked()) | |||
| # -------------------------------------------------------------------------------------------------------- | |||
| @@ -763,8 +766,9 @@ class CarlaSettingsW(QDialog): | |||
| def resetExperimentalSettings(self): | |||
| # Forever experimental | |||
| self.ui.cb_advanced_plugin_bridges.setChecked(CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES) | |||
| self.ui.ch_advanced_load_lib_global.setChecked(CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL) | |||
| self.ui.cb_exp_plugin_bridges.setChecked(CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES) | |||
| self.ui.ch_exp_load_lib_global.setChecked(CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL) | |||
| self.ui.ch_exp_prevent_bad_behaviour.setChecked(CARLA_DEFAULT_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR) | |||
| # Temporary, until stable | |||
| self.ui.cb_canvas_fancy_eyecandy.setChecked(CARLA_DEFAULT_CANVAS_FANCY_EYE_CANDY) | |||
| @@ -22,13 +22,15 @@ | |||
| #include <sched.h> | |||
| #include <spawn.h> | |||
| #define PREVENTED_FUNC_MSG carla_stderr2("Carla prevented a plugin from calling '%s', bad plugin!", __FUNCTION__) | |||
| // ----------------------------------------------------------------------- | |||
| // Our custom functions | |||
| CARLA_EXPORT | |||
| pid_t fork() | |||
| { | |||
| carla_stdout("------------------------------- fork called"); | |||
| PREVENTED_FUNC_MSG; | |||
| errno = ENOSYS; | |||
| return -1; | |||
| } | |||
| @@ -36,7 +38,7 @@ pid_t fork() | |||
| CARLA_EXPORT | |||
| int clone(int (*)(void*), void*, int, void*, ...) | |||
| { | |||
| carla_stdout("------------------------------- clone called"); | |||
| PREVENTED_FUNC_MSG; | |||
| errno = ENOSYS; | |||
| return -1; | |||
| } | |||
| @@ -44,15 +46,37 @@ int clone(int (*)(void*), void*, int, void*, ...) | |||
| CARLA_EXPORT | |||
| int posix_spawn(pid_t*, const char*, const posix_spawn_file_actions_t*, const posix_spawnattr_t*, char* const[], char* const[]) | |||
| { | |||
| carla_stdout("------------------------------- posix_spawn called"); | |||
| PREVENTED_FUNC_MSG; | |||
| return ENOSYS; | |||
| } | |||
| CARLA_EXPORT | |||
| int posix_spawnp(pid_t*, const char*, const posix_spawn_file_actions_t*, const posix_spawnattr_t*, char* const[], char* const[]) | |||
| { | |||
| carla_stdout("------------------------------- posix_spawnp called"); | |||
| PREVENTED_FUNC_MSG; | |||
| return ENOSYS; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void gtk_init(int*, char***) | |||
| { | |||
| PREVENTED_FUNC_MSG; | |||
| } | |||
| CARLA_EXPORT | |||
| int gtk_init_check(int*, char***) | |||
| { | |||
| PREVENTED_FUNC_MSG; | |||
| return 0; | |||
| } | |||
| CARLA_EXPORT | |||
| int gtk_init_with_args(int*, char***, const char*, void*, const char*, void**) | |||
| { | |||
| PREVENTED_FUNC_MSG; | |||
| return 0; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -197,7 +197,8 @@ bool waitForClientConnect(const HANDLE pipe, const uint32_t timeOutMilliseconds) | |||
| static inline | |||
| bool startProcess(const char* const argv[], pid_t& pidinst) noexcept | |||
| { | |||
| const ScopedEnvVar sev("LD_LIBRARY_PATH", nullptr); | |||
| const ScopedEnvVar sev1("LD_LIBRARY_PATH", nullptr); | |||
| const ScopedEnvVar sev2("LD_PRELOAD", nullptr); | |||
| const pid_t ret = pidinst = vfork(); | |||