| @@ -267,7 +267,7 @@ | |||||
| <string>Interface</string> | <string>Interface</string> | ||||
| </property> | </property> | ||||
| <layout class="QGridLayout" name="gridLayout_4"> | <layout class="QGridLayout" name="gridLayout_4"> | ||||
| <item row="3" column="1"> | |||||
| <item row="4" column="1"> | |||||
| <widget class="QSpinBox" name="sb_main_refresh_interval"> | <widget class="QSpinBox" name="sb_main_refresh_interval"> | ||||
| <property name="suffix"> | <property name="suffix"> | ||||
| <string> ms</string> | <string> ms</string> | ||||
| @@ -283,7 +283,7 @@ | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="3" column="2"> | |||||
| <item row="4" column="2"> | |||||
| <spacer name="horizontalSpacer_12"> | <spacer name="horizontalSpacer_12"> | ||||
| <property name="orientation"> | <property name="orientation"> | ||||
| <enum>Qt::Horizontal</enum> | <enum>Qt::Horizontal</enum> | ||||
| @@ -299,7 +299,7 @@ | |||||
| </property> | </property> | ||||
| </spacer> | </spacer> | ||||
| </item> | </item> | ||||
| <item row="3" column="0"> | |||||
| <item row="4" column="0"> | |||||
| <widget class="QLabel" name="label_main_refresh_interval"> | <widget class="QLabel" name="label_main_refresh_interval"> | ||||
| <property name="text"> | <property name="text"> | ||||
| <string>Interface refresh interval:</string> | <string>Interface refresh interval:</string> | ||||
| @@ -316,13 +316,20 @@ | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="2" column="0" colspan="3"> | |||||
| <item row="3" column="0" colspan="3"> | |||||
| <widget class="QCheckBox" name="ch_main_use_custom_skins"> | <widget class="QCheckBox" name="ch_main_use_custom_skins"> | ||||
| <property name="text"> | <property name="text"> | ||||
| <string>Use custom plugin slot skins</string> | <string>Use custom plugin slot skins</string> | ||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="2" column="0" colspan="3"> | |||||
| <widget class="QCheckBox" name="ch_main_show_logs"> | |||||
| <property name="text"> | |||||
| <string>Show console output in Logs tab (needs engine restart)</string> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| </layout> | </layout> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| @@ -1073,7 +1073,12 @@ typedef enum { | |||||
| /*! | /*! | ||||
| * Set frontend winId, used to define as parent window for plugin UIs. | * Set frontend winId, used to define as parent window for plugin UIs. | ||||
| */ | */ | ||||
| ENGINE_OPTION_FRONTEND_WIN_ID = 17 | |||||
| ENGINE_OPTION_FRONTEND_WIN_ID = 17, | |||||
| /*! | |||||
| * Capture console output into debug callbacks. | |||||
| */ | |||||
| ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT = 18 | |||||
| } EngineOption; | } EngineOption; | ||||
| @@ -54,6 +54,7 @@ struct CarlaBackendStandalone { | |||||
| #ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
| EngineOptions engineOptions; | EngineOptions engineOptions; | ||||
| CarlaLogThread logThread; | CarlaLogThread logThread; | ||||
| bool logThreadEnabled; | |||||
| #endif | #endif | ||||
| FileCallbackFunc fileCallback; | FileCallbackFunc fileCallback; | ||||
| @@ -68,6 +69,7 @@ struct CarlaBackendStandalone { | |||||
| #ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
| engineOptions(), | engineOptions(), | ||||
| logThread(), | logThread(), | ||||
| logThreadEnabled(false), | |||||
| #endif | #endif | ||||
| fileCallback(nullptr), | fileCallback(nullptr), | ||||
| fileCallbackPtr(nullptr), | fileCallbackPtr(nullptr), | ||||
| @@ -320,7 +322,7 @@ bool carla_engine_init(const char* driverName, const char* clientName) | |||||
| { | { | ||||
| #ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
| juce::initialiseJuce_GUI(); | juce::initialiseJuce_GUI(); | ||||
| if (std::getenv("CARLA_LOGS_DISABLED") == nullptr) | |||||
| if (gStandalone.logThreadEnabled && std::getenv("CARLA_LOGS_DISABLED") == nullptr) | |||||
| gStandalone.logThread.init(); | gStandalone.logThread.init(); | ||||
| #endif | #endif | ||||
| gStandalone.lastError = "No error"; | gStandalone.lastError = "No error"; | ||||
| @@ -601,11 +603,15 @@ void carla_set_engine_option(EngineOption option, int value, const char* valueSt | |||||
| gStandalone.engineOptions.preventBadBehaviour = (value != 0); | gStandalone.engineOptions.preventBadBehaviour = (value != 0); | ||||
| break; | break; | ||||
| case CB::ENGINE_OPTION_FRONTEND_WIN_ID: | |||||
| case CB::ENGINE_OPTION_FRONTEND_WIN_ID: { | |||||
| CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | ||||
| const long long winId(std::strtoll(valueStr, nullptr, 16)); | const long long winId(std::strtoll(valueStr, nullptr, 16)); | ||||
| CARLA_SAFE_ASSERT_RETURN(winId >= 0,); | CARLA_SAFE_ASSERT_RETURN(winId >= 0,); | ||||
| gStandalone.engineOptions.frontendWinId = static_cast<uintptr_t>(winId); | gStandalone.engineOptions.frontendWinId = static_cast<uintptr_t>(winId); | ||||
| } break; | |||||
| case CB::ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT: | |||||
| gStandalone.logThreadEnabled = (value != 0); | |||||
| break; | break; | ||||
| } | } | ||||
| @@ -1573,11 +1573,14 @@ void CarlaEngine::setOption(const EngineOption option, const int value, const ch | |||||
| #endif | #endif | ||||
| break; | break; | ||||
| case ENGINE_OPTION_FRONTEND_WIN_ID: | |||||
| case ENGINE_OPTION_FRONTEND_WIN_ID: { | |||||
| CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | ||||
| const long long winId(std::strtoll(valueStr, nullptr, 16)); | const long long winId(std::strtoll(valueStr, nullptr, 16)); | ||||
| CARLA_SAFE_ASSERT_RETURN(winId >= 0,); | CARLA_SAFE_ASSERT_RETURN(winId >= 0,); | ||||
| pData->options.frontendWinId = static_cast<uintptr_t>(winId); | pData->options.frontendWinId = static_cast<uintptr_t>(winId); | ||||
| } break; | |||||
| case ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT: | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| @@ -781,6 +781,9 @@ ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR = 16 | |||||
| # Set frontend winId, used to define as parent window for plugin UIs. | # Set frontend winId, used to define as parent window for plugin UIs. | ||||
| ENGINE_OPTION_FRONTEND_WIN_ID = 17 | ENGINE_OPTION_FRONTEND_WIN_ID = 17 | ||||
| # Capture console output into debug callbacks | |||||
| ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT = 18 | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # Engine Process Mode | # Engine Process Mode | ||||
| # Engine process mode. | # Engine process mode. | ||||
| @@ -1216,6 +1219,7 @@ class CarlaHostMeta(object): | |||||
| self.preferUIBridges = False | self.preferUIBridges = False | ||||
| self.preventBadBehaviour = False | self.preventBadBehaviour = False | ||||
| self.manageUIs = False | self.manageUIs = False | ||||
| self.showLogs = False | |||||
| self.uisAlwaysOnTop = False | self.uisAlwaysOnTop = False | ||||
| self.maxParameters = 0 | self.maxParameters = 0 | ||||
| self.uiBridgesTimeout = 0 | self.uiBridgesTimeout = 0 | ||||
| @@ -2284,6 +2284,11 @@ def loadHostSettings(host): | |||||
| except: | except: | ||||
| host.manageUIs = CARLA_DEFAULT_MAIN_MANAGE_UIS | host.manageUIs = CARLA_DEFAULT_MAIN_MANAGE_UIS | ||||
| try: | |||||
| host.showLogs = settings.value(CARLA_KEY_MAIN_SHOW_LOGS, CARLA_DEFAULT_MAIN_SHOW_LOGS, type=bool) | |||||
| except: | |||||
| host.showLogs = CARLA_DEFAULT_MAIN_SHOW_LOGS | |||||
| try: | try: | ||||
| host.uisAlwaysOnTop = settings.value(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, CARLA_DEFAULT_UIS_ALWAYS_ON_TOP, type=bool) | host.uisAlwaysOnTop = settings.value(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, CARLA_DEFAULT_UIS_ALWAYS_ON_TOP, type=bool) | ||||
| except: | except: | ||||
| @@ -2354,7 +2359,6 @@ def setHostSettings(host): | |||||
| # TEST | # TEST | ||||
| #host.preventBadBehaviour = True | #host.preventBadBehaviour = True | ||||
| host.set_engine_option(ENGINE_OPTION_FORCE_STEREO, host.forceStereo, "") | host.set_engine_option(ENGINE_OPTION_FORCE_STEREO, host.forceStereo, "") | ||||
| host.set_engine_option(ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, host.preferPluginBridges, "") | 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_PREFER_UI_BRIDGES, host.preferUIBridges, "") | ||||
| @@ -2362,6 +2366,7 @@ def setHostSettings(host): | |||||
| host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, host.maxParameters, "") | 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_UI_BRIDGES_TIMEOUT, host.uiBridgesTimeout, "") | ||||
| host.set_engine_option(ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR, host.preventBadBehaviour, "") | host.set_engine_option(ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR, host.preventBadBehaviour, "") | ||||
| host.set_engine_option(ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT, host.showLogs, "") | |||||
| if host.isPlugin: | if host.isPlugin: | ||||
| return | return | ||||
| @@ -325,6 +325,7 @@ class CarlaSettingsW(QDialog): | |||||
| # Main | # Main | ||||
| self.ui.ch_main_manage_uis.setChecked(self.host.manageUIs) | self.ui.ch_main_manage_uis.setChecked(self.host.manageUIs) | ||||
| self.ui.ch_main_show_logs.setChecked(self.host.showLogs) | |||||
| self.ui.ch_engine_uis_always_on_top.setChecked(self.host.uisAlwaysOnTop) | self.ui.ch_engine_uis_always_on_top.setChecked(self.host.uisAlwaysOnTop) | ||||
| self.ui.le_main_proj_folder.setText(settings.value(CARLA_KEY_MAIN_PROJECT_FOLDER, CARLA_DEFAULT_MAIN_PROJECT_FOLDER, type=str)) | self.ui.le_main_proj_folder.setText(settings.value(CARLA_KEY_MAIN_PROJECT_FOLDER, CARLA_DEFAULT_MAIN_PROJECT_FOLDER, type=str)) | ||||
| @@ -449,6 +450,7 @@ class CarlaSettingsW(QDialog): | |||||
| # Main | # Main | ||||
| self.host.manageUIs = self.ui.ch_main_manage_uis.isChecked() | self.host.manageUIs = self.ui.ch_main_manage_uis.isChecked() | ||||
| self.host.showLogs = self.ui.ch_main_show_logs.isChecked() | |||||
| self.host.uisAlwaysOnTop = self.ui.ch_engine_uis_always_on_top.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_PROJECT_FOLDER, self.ui.le_main_proj_folder.text()) | ||||
| @@ -458,6 +460,7 @@ class CarlaSettingsW(QDialog): | |||||
| settings.setValue(CARLA_KEY_MAIN_USE_CUSTOM_SKINS, self.ui.ch_main_use_custom_skins.isChecked()) | settings.setValue(CARLA_KEY_MAIN_USE_CUSTOM_SKINS, self.ui.ch_main_use_custom_skins.isChecked()) | ||||
| settings.setValue(CARLA_KEY_MAIN_MANAGE_UIS, self.host.manageUIs) | settings.setValue(CARLA_KEY_MAIN_MANAGE_UIS, self.host.manageUIs) | ||||
| settings.setValue(CARLA_KEY_MAIN_SHOW_LOGS, self.host.showLogs) | |||||
| settings.setValue(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop) | settings.setValue(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop) | ||||
| # ---------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------- | ||||
| @@ -584,6 +587,7 @@ class CarlaSettingsW(QDialog): | |||||
| self.ui.sb_main_refresh_interval.setValue(CARLA_DEFAULT_MAIN_REFRESH_INTERVAL) | self.ui.sb_main_refresh_interval.setValue(CARLA_DEFAULT_MAIN_REFRESH_INTERVAL) | ||||
| self.ui.ch_main_use_custom_skins.setChecked(CARLA_DEFAULT_MAIN_USE_CUSTOM_SKINS) | self.ui.ch_main_use_custom_skins.setChecked(CARLA_DEFAULT_MAIN_USE_CUSTOM_SKINS) | ||||
| self.ui.ch_main_manage_uis.setChecked(CARLA_DEFAULT_MAIN_MANAGE_UIS) | self.ui.ch_main_manage_uis.setChecked(CARLA_DEFAULT_MAIN_MANAGE_UIS) | ||||
| self.ui.ch_main_show_logs.setChecked(CARLA_DEFAULT_MAIN_SHOW_LOGS) | |||||
| # ---------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------- | ||||
| # Canvas | # Canvas | ||||
| @@ -193,6 +193,7 @@ CARLA_KEY_MAIN_PRO_THEME_COLOR = "Main/ProThemeColor" # str | |||||
| CARLA_KEY_MAIN_REFRESH_INTERVAL = "Main/RefreshInterval" # int | CARLA_KEY_MAIN_REFRESH_INTERVAL = "Main/RefreshInterval" # int | ||||
| CARLA_KEY_MAIN_USE_CUSTOM_SKINS = "Main/UseCustomSkins" # bool | CARLA_KEY_MAIN_USE_CUSTOM_SKINS = "Main/UseCustomSkins" # bool | ||||
| CARLA_KEY_MAIN_MANAGE_UIS = "Main/ManageUIs" # bool | CARLA_KEY_MAIN_MANAGE_UIS = "Main/ManageUIs" # bool | ||||
| CARLA_KEY_MAIN_SHOW_LOGS = "Main/ShowLogs" # bool | |||||
| CARLA_KEY_CANVAS_THEME = "Canvas/Theme" # str | CARLA_KEY_CANVAS_THEME = "Canvas/Theme" # str | ||||
| CARLA_KEY_CANVAS_SIZE = "Canvas/Size" # str "NxN" | CARLA_KEY_CANVAS_SIZE = "Canvas/Size" # str "NxN" | ||||
| @@ -237,6 +238,7 @@ CARLA_DEFAULT_MAIN_PRO_THEME_COLOR = "Black" | |||||
| CARLA_DEFAULT_MAIN_REFRESH_INTERVAL = 20 | CARLA_DEFAULT_MAIN_REFRESH_INTERVAL = 20 | ||||
| CARLA_DEFAULT_MAIN_USE_CUSTOM_SKINS = True | CARLA_DEFAULT_MAIN_USE_CUSTOM_SKINS = True | ||||
| CARLA_DEFAULT_MAIN_MANAGE_UIS = True | CARLA_DEFAULT_MAIN_MANAGE_UIS = True | ||||
| CARLA_DEFAULT_MAIN_SHOW_LOGS = True | |||||
| # Canvas | # Canvas | ||||
| CARLA_DEFAULT_CANVAS_THEME = "Modern Dark" | CARLA_DEFAULT_CANVAS_THEME = "Modern Dark" | ||||
| @@ -327,6 +327,8 @@ const char* EngineOption2Str(const EngineOption option) noexcept | |||||
| return "ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR"; | return "ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR"; | ||||
| case ENGINE_OPTION_FRONTEND_WIN_ID: | case ENGINE_OPTION_FRONTEND_WIN_ID: | ||||
| return "ENGINE_OPTION_FRONTEND_WIN_ID"; | return "ENGINE_OPTION_FRONTEND_WIN_ID"; | ||||
| case ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT: | |||||
| return "ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT"; | |||||
| } | } | ||||
| carla_stderr("CarlaBackend::EngineOption2Str(%i) - invalid option", option); | carla_stderr("CarlaBackend::EngineOption2Str(%i) - invalid option", option); | ||||