diff --git a/resources/ui/carla_settings.ui b/resources/ui/carla_settings.ui index fde865a38..70d945dcf 100644 --- a/resources/ui/carla_settings.ui +++ b/resources/ui/carla_settings.ui @@ -1155,13 +1155,13 @@ - + Core - + Enable OSC @@ -1197,7 +1197,7 @@ - + Enable TCP port @@ -1205,59 +1205,13 @@ true - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Use randomly assigned port: - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + Use specific port: - - - - Maximum number of parameters to allow in the built-in 'Edit' dialog - - - 1024 - - - 32767 - - - @@ -1295,7 +1249,7 @@ - Can also use CARLA_OSC_TCP_PORT env var + Overridden by CARLA_OSC_TCP_PORT env var Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse @@ -1317,11 +1271,63 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + Maximum number of parameters to allow in the built-in 'Edit' dialog + + + 1024 + + + 32767 + + + + + + + Use randomly assigned port + + + true + + + - + Enable UDP port @@ -1330,7 +1336,7 @@ - + Use specific port: @@ -1363,7 +1369,10 @@ - + + + false + Maximum number of parameters to allow in the built-in 'Edit' dialog @@ -1376,10 +1385,13 @@ - + Use randomly assigned port + + true + @@ -1419,7 +1431,7 @@ - Can also use CARLA_OSC_UDP_PORT env var + Overridden by CARLA_OSC_UDP_PORT env var Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse @@ -1584,15 +1596,10 @@ verticalSpacer_10 - layoutWidget label_36 - layoutWidget_2 - groupBox_2 - label_35 - label_35 - groupBox_3 - groupBox_4 - layoutWidget_3 + group_osc_tcp_port + group_osc_udp_port + group_osc_core @@ -2615,5 +2622,37 @@ This mode is not available for VST plugins. + + rb_osc_tcp_port_specific + toggled(bool) + sb_osc_tcp_port_number + setEnabled(bool) + + + 368 + 174 + + + 467 + 174 + + + + + rb_osc_udp_port_specific + toggled(bool) + sb_osc_udp_port_number + setEnabled(bool) + + + 368 + 282 + + + 467 + 282 + + + diff --git a/source/backend/CarlaBackend.h b/source/backend/CarlaBackend.h index 79eaa53ed..82b24c948 100644 --- a/source/backend/CarlaBackend.h +++ b/source/backend/CarlaBackend.h @@ -1139,12 +1139,13 @@ typedef enum { /*! * Wherever to enable OSC support in the engine. */ - ENGINE_OPTION_OSC_ENABLE = 13, + ENGINE_OPTION_OSC_ENABLED = 13, /*! * The network TCP port to use for OSC. * A value of 0 means use a random port. * A value of < 0 means to not enable the TCP port for OSC. + * @note Valid ports begin at 1024 */ ENGINE_OPTION_OSC_PORT_TCP = 14, @@ -1153,6 +1154,7 @@ typedef enum { * A value of 0 means use a random port. * A value of < 0 means to not enable the UDP port for OSC. * @note Disabling this option prevents DSSI UIs from working! + * @note Valid ports begin at 1024 */ ENGINE_OPTION_OSC_PORT_UDP = 15, diff --git a/source/backend/CarlaStandalone.cpp b/source/backend/CarlaStandalone.cpp index 5265aeaf2..11be28082 100644 --- a/source/backend/CarlaStandalone.cpp +++ b/source/backend/CarlaStandalone.cpp @@ -352,7 +352,7 @@ static void carla_engine_init_common(CarlaEngine* const engine) if (gStandalone.engineOptions.audioDevice != nullptr) engine->setOption(CB::ENGINE_OPTION_AUDIO_DEVICE, 0, gStandalone.engineOptions.audioDevice); - engine->setOption(CB::ENGINE_OPTION_OSC_ENABLE, gStandalone.engineOptions.oscEnabled, nullptr); + engine->setOption(CB::ENGINE_OPTION_OSC_ENABLED, gStandalone.engineOptions.oscEnabled, nullptr); engine->setOption(CB::ENGINE_OPTION_OSC_PORT_TCP, gStandalone.engineOptions.oscPortTCP, nullptr); engine->setOption(CB::ENGINE_OPTION_OSC_PORT_UDP, gStandalone.engineOptions.oscPortUDP, nullptr); @@ -704,7 +704,7 @@ void carla_set_engine_option(EngineOption option, int value, const char* valueSt gStandalone.engineOptions.audioDevice = carla_strdup_safe(valueStr); break; - case CB::ENGINE_OPTION_OSC_ENABLE: + case CB::ENGINE_OPTION_OSC_ENABLED: CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,); gStandalone.engineOptions.oscEnabled = (value != 0); break; diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp index 87dfefc33..bc277b2c1 100644 --- a/source/backend/engine/CarlaEngine.cpp +++ b/source/backend/engine/CarlaEngine.cpp @@ -1574,7 +1574,7 @@ void CarlaEngine::setOption(const EngineOption option, const int value, const ch pData->options.audioDevice = carla_strdup_safe(valueStr); break; - case ENGINE_OPTION_OSC_ENABLE: + case ENGINE_OPTION_OSC_ENABLED: CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,); #ifndef BUILD_BRIDGE pData->options.oscEnabled = (value != 0); diff --git a/source/backend/engine/CarlaEngineData.cpp b/source/backend/engine/CarlaEngineData.cpp index b651c4464..d6faeac5a 100644 --- a/source/backend/engine/CarlaEngineData.cpp +++ b/source/backend/engine/CarlaEngineData.cpp @@ -1,6 +1,6 @@ /* * Carla Plugin Host - * Copyright (C) 2011-2018 Filipe Coelho + * Copyright (C) 2011-2019 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -203,8 +203,8 @@ EngineOptions::EngineOptions() noexcept # else oscEnabled(true), # endif - oscPortTCP(0), - oscPortUDP(0), + oscPortTCP(22752), + oscPortUDP(22752), #endif pathLADSPA(nullptr), pathDSSI(nullptr), diff --git a/source/backend/engine/CarlaEngineNative.cpp b/source/backend/engine/CarlaEngineNative.cpp index 4109c4588..3267ed431 100644 --- a/source/backend/engine/CarlaEngineNative.cpp +++ b/source/backend/engine/CarlaEngineNative.cpp @@ -695,6 +695,13 @@ public: pData->sampleRate = pHost->get_sample_rate(pHost->handle); pData->initTime(nullptr); +#ifndef BUILD_BRIDGE + // Forced OSC setup when running as plugin + pData->options.oscEnabled = true; + pData->options.oscPortTCP = -1; + pData->options.oscPortUDP = 0; +#endif + if (outChan == 0) outChan = inChan; diff --git a/source/frontend/carla_backend.py b/source/frontend/carla_backend.py index 8a521469b..e3f6554a5 100644 --- a/source/frontend/carla_backend.py +++ b/source/frontend/carla_backend.py @@ -821,17 +821,19 @@ ENGINE_OPTION_AUDIO_TRIPLE_BUFFER = 11 ENGINE_OPTION_AUDIO_DEVICE = 12 # Wherever to enable OSC support in the engine. -ENGINE_OPTION_OSC_ENABLE = 13 +ENGINE_OPTION_OSC_ENABLED = 13 # The network TCP port to use for OSC. # A value of 0 means use a random port. # A value of < 0 means to not enable the TCP port for OSC. +# @note Valid ports begin at 1024 ENGINE_OPTION_OSC_PORT_TCP = 14 # The network UDP port to use for OSC. # A value of 0 means use a random port. # A value of < 0 means to not enable the UDP port for OSC. # @note Disabling this option prevents DSSI UIs from working! +# @note Valid ports begin at 1024 ENGINE_OPTION_OSC_PORT_UDP = 15 # Set path used for a specific plugin type. diff --git a/source/frontend/carla_host.py b/source/frontend/carla_host.py index 2ca39b841..83c61c858 100644 --- a/source/frontend/carla_host.py +++ b/source/frontend/carla_host.py @@ -2979,6 +2979,29 @@ def setEngineSettings(host): if host.isPlugin: return "Plugin" + # -------------------------------------------------------------------------------------------------------- + # osc settings + + oscEnabled = settings.value(CARLA_KEY_OSC_ENABLED, CARLA_DEFAULT_OSC_ENABLED, type=bool) + + if not settings.value(CARLA_KEY_OSC_TCP_PORT_ENABLED, CARLA_DEFAULT_OSC_TCP_PORT_ENABLED, type=bool): + portNumTCP = -1 + elif settings.value(CARLA_KEY_OSC_TCP_PORT_RANDOM, CARLA_DEFAULT_OSC_TCP_PORT_RANDOM, type=bool): + portNumTCP = 0 + else: + portNumTCP = settings.value(CARLA_KEY_OSC_TCP_PORT_NUMBER, CARLA_DEFAULT_OSC_TCP_PORT_NUMBER, type=int) + + if not settings.value(CARLA_KEY_OSC_UDP_PORT_ENABLED, CARLA_DEFAULT_OSC_UDP_PORT_ENABLED, type=bool): + portNumUDP = -1 + elif settings.value(CARLA_KEY_OSC_UDP_PORT_RANDOM, CARLA_DEFAULT_OSC_UDP_PORT_RANDOM, type=bool): + portNumUDP = 0 + else: + portNumUDP = settings.value(CARLA_KEY_OSC_UDP_PORT_NUMBER, CARLA_DEFAULT_OSC_UDP_PORT_NUMBER, type=int) + + host.set_engine_option(ENGINE_OPTION_OSC_ENABLED, 1 if oscEnabled else 0, "") + host.set_engine_option(ENGINE_OPTION_OSC_PORT_TCP, portNumTCP, "") + host.set_engine_option(ENGINE_OPTION_OSC_PORT_UDP, portNumUDP, "") + # -------------------------------------------------------------------------------------------------------- # wine settings diff --git a/source/frontend/carla_settings.py b/source/frontend/carla_settings.py index f73c28b67..0ba50583f 100755 --- a/source/frontend/carla_settings.py +++ b/source/frontend/carla_settings.py @@ -197,10 +197,11 @@ class CarlaSettingsW(QDialog): TAB_INDEX_MAIN = 0 TAB_INDEX_CANVAS = 1 TAB_INDEX_ENGINE = 2 - TAB_INDEX_PATHS = 3 - TAB_INDEX_WINE = 4 - TAB_INDEX_EXPERIMENTAL = 5 - TAB_INDEX_NONE = 6 + TAB_INDEX_OSC = 3 + TAB_INDEX_PATHS = 4 + TAB_INDEX_WINE = 5 + TAB_INDEX_EXPERIMENTAL = 6 + TAB_INDEX_NONE = 7 # Path indexes PATH_INDEX_LADSPA = 0 @@ -281,6 +282,7 @@ class CarlaSettingsW(QDialog): if host.isControl or host.isPlugin: self.ui.ch_main_confirm_exit.hide() self.ui.ch_exp_load_lib_global.hide() + self.ui.lw_page.hideRow(self.TAB_INDEX_OSC) self.ui.lw_page.hideRow(self.TAB_INDEX_WINE) if not LINUX: @@ -438,6 +440,43 @@ class CarlaSettingsW(QDialog): self.ui.cb_exp_plugin_bridges.setChecked(self.host.showPluginBridges) self.ui.ch_exp_wine_bridges.setChecked(self.host.showWineBridges) + # ---------------------------------------------------------------------------------------------------- + # OSC + + self.ui.ch_osc_enable.setChecked(settings.value(CARLA_KEY_OSC_ENABLED, + CARLA_DEFAULT_OSC_ENABLED, + type=bool)) + + self.ui.group_osc_tcp_port.setChecked(settings.value(CARLA_KEY_OSC_TCP_PORT_ENABLED, + CARLA_DEFAULT_OSC_TCP_PORT_ENABLED, + type=bool)) + + self.ui.group_osc_udp_port.setChecked(settings.value(CARLA_KEY_OSC_UDP_PORT_ENABLED, + CARLA_DEFAULT_OSC_UDP_PORT_ENABLED, + type=bool)) + + self.ui.sb_osc_tcp_port_number.setValue(settings.value(CARLA_KEY_OSC_TCP_PORT_NUMBER, + CARLA_DEFAULT_OSC_TCP_PORT_NUMBER, + type=int)) + + self.ui.sb_osc_udp_port_number.setValue(settings.value(CARLA_KEY_OSC_UDP_PORT_NUMBER, + CARLA_DEFAULT_OSC_UDP_PORT_NUMBER, + type=int)) + + if settings.value(CARLA_KEY_OSC_TCP_PORT_RANDOM, CARLA_DEFAULT_OSC_TCP_PORT_RANDOM, type=bool): + self.ui.rb_osc_tcp_port_specific.setChecked(False) + self.ui.rb_osc_tcp_port_random.setChecked(True) + else: + self.ui.rb_osc_tcp_port_random.setChecked(False) + self.ui.rb_osc_tcp_port_specific.setChecked(True) + + if settings.value(CARLA_KEY_OSC_UDP_PORT_RANDOM, CARLA_DEFAULT_OSC_UDP_PORT_RANDOM, type=bool): + self.ui.rb_osc_udp_port_specific.setChecked(False) + self.ui.rb_osc_udp_port_random.setChecked(True) + else: + self.ui.rb_osc_udp_port_random.setChecked(False) + self.ui.rb_osc_udp_port_specific.setChecked(True) + # ---------------------------------------------------------------------------------------------------- # Paths @@ -617,6 +656,17 @@ class CarlaSettingsW(QDialog): settings.setValue(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, self.host.showPluginBridges) settings.setValue(CARLA_KEY_EXPERIMENTAL_WINE_BRIDGES, self.host.showWineBridges) + # ---------------------------------------------------------------------------------------------------- + # OSC + + settings.setValue(CARLA_KEY_OSC_ENABLED, self.ui.ch_osc_enable.isChecked()) + settings.setValue(CARLA_KEY_OSC_TCP_PORT_ENABLED, self.ui.group_osc_tcp_port.isChecked()) + settings.setValue(CARLA_KEY_OSC_UDP_PORT_ENABLED, self.ui.group_osc_udp_port.isChecked()) + settings.setValue(CARLA_KEY_OSC_TCP_PORT_RANDOM, self.ui.rb_osc_tcp_port_random.isChecked()) + settings.setValue(CARLA_KEY_OSC_UDP_PORT_RANDOM, self.ui.rb_osc_udp_port_random.isChecked()) + settings.setValue(CARLA_KEY_OSC_TCP_PORT_NUMBER, self.ui.sb_osc_tcp_port_number.value()) + settings.setValue(CARLA_KEY_OSC_UDP_PORT_NUMBER, self.ui.sb_osc_udp_port_number.value()) + # ---------------------------------------------------------------------------------------------------- # Paths @@ -686,10 +736,12 @@ class CarlaSettingsW(QDialog): @pyqtSlot() def slot_resetSettings(self): + currentRow = self.ui.lw_page.currentRow() + # ---------------------------------------------------------------------------------------------------- # Main - if self.ui.lw_page.currentRow() == self.TAB_INDEX_MAIN: + if currentRow == self.TAB_INDEX_MAIN: self.ui.le_main_proj_folder.setText(CARLA_DEFAULT_MAIN_PROJECT_FOLDER) self.ui.ch_main_theme_pro.setChecked(CARLA_DEFAULT_MAIN_USE_PRO_THEME and self.ui.group_main_theme.isEnabled()) self.ui.cb_main_theme_color.setCurrentIndex(self.ui.cb_main_theme_color.findText(CARLA_DEFAULT_MAIN_PRO_THEME_COLOR)) @@ -700,7 +752,7 @@ class CarlaSettingsW(QDialog): # ---------------------------------------------------------------------------------------------------- # Canvas - elif self.ui.lw_page.currentRow() == self.TAB_INDEX_CANVAS: + elif currentRow == self.TAB_INDEX_CANVAS: self.ui.cb_canvas_theme.setCurrentIndex(self.ui.cb_canvas_theme.findText(CARLA_DEFAULT_CANVAS_THEME)) self.ui.cb_canvas_size.setCurrentIndex(self.ui.cb_canvas_size.findText(CARLA_DEFAULT_CANVAS_SIZE)) self.ui.cb_canvas_bezier_lines.setChecked(CARLA_DEFAULT_CANVAS_USE_BEZIER_LINES) @@ -712,7 +764,7 @@ class CarlaSettingsW(QDialog): # ---------------------------------------------------------------------------------------------------- # Engine - elif self.ui.lw_page.currentRow() == self.TAB_INDEX_ENGINE: + elif currentRow == self.TAB_INDEX_ENGINE: if not self.host.isPlugin: self.ui.cb_engine_audio_driver.setCurrentIndex(0) @@ -730,10 +782,34 @@ class CarlaSettingsW(QDialog): self.ui.sb_engine_ui_bridges_timeout.setValue(CARLA_DEFAULT_UI_BRIDGES_TIMEOUT) self.ui.ch_engine_manage_uis.setChecked(CARLA_DEFAULT_MANAGE_UIS) + # ---------------------------------------------------------------------------------------------------- + # OSC + + elif currentRow == self.TAB_INDEX_OSC: + self.ui.ch_osc_enable.setChecked(CARLA_DEFAULT_OSC_ENABLED) + self.ui.group_osc_tcp_port.setChecked(CARLA_DEFAULT_OSC_TCP_PORT_ENABLED) + self.ui.group_osc_udp_port.setChecked(CARLA_DEFAULT_OSC_UDP_PORT_ENABLED) + self.ui.sb_osc_tcp_port_number.setValue(CARLA_DEFAULT_OSC_TCP_PORT_NUMBER) + self.ui.sb_osc_udp_port_number.setValue(CARLA_DEFAULT_OSC_UDP_PORT_NUMBER) + + if CARLA_DEFAULT_OSC_TCP_PORT_RANDOM: + self.ui.rb_osc_tcp_port_specific.setChecked(False) + self.ui.rb_osc_tcp_port_random.setChecked(True) + else: + self.ui.rb_osc_tcp_port_random.setChecked(False) + self.ui.rb_osc_tcp_port_specific.setChecked(True) + + if CARLA_DEFAULT_OSC_UDP_PORT_RANDOM: + self.ui.rb_osc_udp_port_specific.setChecked(False) + self.ui.rb_osc_udp_port_random.setChecked(True) + else: + self.ui.rb_osc_udp_port_random.setChecked(False) + self.ui.rb_osc_udp_port_specific.setChecked(True) + # ---------------------------------------------------------------------------------------------------- # Paths - elif self.ui.lw_page.currentRow() == self.TAB_INDEX_PATHS: + elif currentRow == self.TAB_INDEX_PATHS: curIndex = self.ui.tw_paths.currentIndex() if curIndex == self.PATH_INDEX_LADSPA: @@ -802,7 +878,7 @@ class CarlaSettingsW(QDialog): # ---------------------------------------------------------------------------------------------------- # Wine - elif self.ui.lw_page.currentRow() == self.TAB_INDEX_WINE: + elif currentRow == self.TAB_INDEX_WINE: self.ui.le_wine_exec.setText(CARLA_DEFAULT_WINE_EXECUTABLE) self.ui.cb_wine_prefix_detect.setChecked(CARLA_DEFAULT_WINE_AUTO_PREFIX) self.ui.le_wine_prefix_fallback.setText(CARLA_DEFAULT_WINE_FALLBACK_PREFIX) @@ -813,7 +889,7 @@ class CarlaSettingsW(QDialog): # ---------------------------------------------------------------------------------------------------- # Experimental - elif self.ui.lw_page.currentRow() == self.TAB_INDEX_EXPERIMENTAL: + elif currentRow == self.TAB_INDEX_EXPERIMENTAL: self.resetExperimentalSettings() def resetExperimentalSettings(self): diff --git a/source/frontend/carla_shared.py b/source/frontend/carla_shared.py index 299f1b664..4af7903d0 100644 --- a/source/frontend/carla_shared.py +++ b/source/frontend/carla_shared.py @@ -212,6 +212,14 @@ CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP = "Engine/UIsAlwaysOnTop" # bool CARLA_KEY_ENGINE_MAX_PARAMETERS = "Engine/MaxParameters" # int CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT = "Engine/UiBridgesTimeout" # int +CARLA_KEY_OSC_ENABLED = "OSC/Enabled" +CARLA_KEY_OSC_TCP_PORT_ENABLED = "OSC/TCPEnabled" +CARLA_KEY_OSC_TCP_PORT_NUMBER = "OSC/TCPNumber" +CARLA_KEY_OSC_TCP_PORT_RANDOM = "OSC/TCPRandom" +CARLA_KEY_OSC_UDP_PORT_ENABLED = "OSC/UDPEnabled" +CARLA_KEY_OSC_UDP_PORT_NUMBER = "OSC/UDPNumber" +CARLA_KEY_OSC_UDP_PORT_RANDOM = "OSC/UDPRandom" + CARLA_KEY_PATHS_LADSPA = "Paths/LADSPA" CARLA_KEY_PATHS_DSSI = "Paths/DSSI" CARLA_KEY_PATHS_LV2 = "Paths/LV2" @@ -290,6 +298,15 @@ else: CARLA_DEFAULT_PROCESS_MODE = ENGINE_PROCESS_MODE_PATCHBAY CARLA_DEFAULT_TRANSPORT_MODE = ENGINE_TRANSPORT_MODE_INTERNAL +# OSC +CARLA_DEFAULT_OSC_ENABLED = not WINDOWS +CARLA_DEFAULT_OSC_TCP_PORT_ENABLED = True +CARLA_DEFAULT_OSC_TCP_PORT_NUMBER = 22752 +CARLA_DEFAULT_OSC_TCP_PORT_RANDOM = False +CARLA_DEFAULT_OSC_UDP_PORT_ENABLED = True +CARLA_DEFAULT_OSC_UDP_PORT_NUMBER = 22752 +CARLA_DEFAULT_OSC_UDP_PORT_RANDOM = False + # Wine CARLA_DEFAULT_WINE_EXECUTABLE = "wine" CARLA_DEFAULT_WINE_AUTO_PREFIX = True diff --git a/source/utils/CarlaBackendUtils.hpp b/source/utils/CarlaBackendUtils.hpp index 8be6393ce..290c5add5 100644 --- a/source/utils/CarlaBackendUtils.hpp +++ b/source/utils/CarlaBackendUtils.hpp @@ -1,6 +1,6 @@ /* * Carla Backend utils - * Copyright (C) 2011-2018 Filipe Coelho + * Copyright (C) 2011-2019 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -321,8 +321,8 @@ const char* EngineOption2Str(const EngineOption option) noexcept return "ENGINE_OPTION_AUDIO_TRIPLE_BUFFER"; case ENGINE_OPTION_AUDIO_DEVICE: return "ENGINE_OPTION_AUDIO_DEVICE"; - case ENGINE_OPTION_OSC_ENABLE: - return "ENGINE_OPTION_OSC_ENABLE"; + case ENGINE_OPTION_OSC_ENABLED: + return "ENGINE_OPTION_OSC_ENABLED"; case ENGINE_OPTION_OSC_PORT_UDP: return "ENGINE_OPTION_OSC_PORT_UDP"; case ENGINE_OPTION_OSC_PORT_TCP: