Browse Source

Add option to clear xrun after project load

Signed-off-by: falkTX <falktx@falktx.com>
tags/v2.1-rc1
falkTX 4 years ago
parent
commit
9de958461e
16 changed files with 545 additions and 67 deletions
  1. +7
    -0
      resources/ui/carla_settings.ui
  2. +28
    -23
      source/backend/CarlaBackend.h
  3. +1
    -0
      source/backend/CarlaEngine.hpp
  4. +27
    -14
      source/backend/CarlaStandalone.cpp
  5. +8
    -0
      source/backend/engine/CarlaEngine.cpp
  6. +1
    -0
      source/backend/engine/CarlaEngineData.cpp
  7. +27
    -23
      source/frontend/carla_backend.py
  8. +3
    -1
      source/frontend/carla_host.cpp
  9. +1
    -0
      source/frontend/carla_host.hpp
  10. +2
    -0
      source/frontend/carla_host.py
  11. +429
    -5
      source/frontend/carla_settings.cpp
  12. +1
    -1
      source/frontend/carla_settings.hpp
  13. +4
    -0
      source/frontend/carla_settings.py
  14. +2
    -0
      source/frontend/carla_shared.hpp
  15. +2
    -0
      source/frontend/carla_shared.py
  16. +2
    -0
      source/utils/CarlaBackendUtils.hpp

+ 7
- 0
resources/ui/carla_settings.ui View File

@@ -985,6 +985,13 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="3" column="0" colspan="4">
<widget class="QCheckBox" name="cb_engine_reset_xruns">
<property name="text">
<string>Reset Xrun counter after project load</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>


+ 28
- 23
source/backend/CarlaBackend.h View File

@@ -1260,46 +1260,51 @@ typedef enum {
*/ */
ENGINE_OPTION_MAX_PARAMETERS = 7, ENGINE_OPTION_MAX_PARAMETERS = 7,


/*!
* Reset Xrun counter after project load.
*/
ENGINE_OPTION_RESET_XRUNS = 8,

/*! /*!
* Timeout value for how much to wait for UI bridges to respond, in milliseconds. * Timeout value for how much to wait for UI bridges to respond, in milliseconds.
* Default is 4000 (4 seconds). * Default is 4000 (4 seconds).
*/ */
ENGINE_OPTION_UI_BRIDGES_TIMEOUT = 8,
ENGINE_OPTION_UI_BRIDGES_TIMEOUT = 9,


/*! /*!
* Audio buffer size. * Audio buffer size.
* Default is 512. * Default is 512.
*/ */
ENGINE_OPTION_AUDIO_BUFFER_SIZE = 9,
ENGINE_OPTION_AUDIO_BUFFER_SIZE = 10,


/*! /*!
* Audio sample rate. * Audio sample rate.
* Default is 44100. * Default is 44100.
*/ */
ENGINE_OPTION_AUDIO_SAMPLE_RATE = 10,
ENGINE_OPTION_AUDIO_SAMPLE_RATE = 11,


/*! /*!
* Wherever to use 3 audio periods instead of the default 2. * Wherever to use 3 audio periods instead of the default 2.
* Default is false. * Default is false.
*/ */
ENGINE_OPTION_AUDIO_TRIPLE_BUFFER = 11,
ENGINE_OPTION_AUDIO_TRIPLE_BUFFER = 12,


/*! /*!
* Audio driver. * Audio driver.
* Default depends on platform. * Default depends on platform.
*/ */
ENGINE_OPTION_AUDIO_DRIVER = 12,
ENGINE_OPTION_AUDIO_DRIVER = 13,


/*! /*!
* Audio device (within a driver). * Audio device (within a driver).
* Default unset. * Default unset.
*/ */
ENGINE_OPTION_AUDIO_DEVICE = 13,
ENGINE_OPTION_AUDIO_DEVICE = 14,


/*! /*!
* Wherever to enable OSC support in the engine. * Wherever to enable OSC support in the engine.
*/ */
ENGINE_OPTION_OSC_ENABLED = 14,
ENGINE_OPTION_OSC_ENABLED = 15,


/*! /*!
* The network TCP port to use for OSC. * The network TCP port to use for OSC.
@@ -1307,7 +1312,7 @@ typedef enum {
* A value of < 0 means to not enable the TCP port for OSC. * A value of < 0 means to not enable the TCP port for OSC.
* @note Valid ports begin at 1024 and end at 32767 (inclusive) * @note Valid ports begin at 1024 and end at 32767 (inclusive)
*/ */
ENGINE_OPTION_OSC_PORT_TCP = 15,
ENGINE_OPTION_OSC_PORT_TCP = 16,


/*! /*!
* The network UDP port to use for OSC. * The network UDP port to use for OSC.
@@ -1316,87 +1321,87 @@ typedef enum {
* @note Disabling this option prevents DSSI UIs from working! * @note Disabling this option prevents DSSI UIs from working!
* @note Valid ports begin at 1024 and end at 32767 (inclusive) * @note Valid ports begin at 1024 and end at 32767 (inclusive)
*/ */
ENGINE_OPTION_OSC_PORT_UDP = 16,
ENGINE_OPTION_OSC_PORT_UDP = 17,


/*! /*!
* Set path used for a specific file type. * Set path used for a specific file type.
* Uses value as the file format, valueStr as actual path. * Uses value as the file format, valueStr as actual path.
*/ */
ENGINE_OPTION_FILE_PATH = 17,
ENGINE_OPTION_FILE_PATH = 18,


/*! /*!
* Set path used for a specific plugin type. * Set path used for a specific plugin type.
* Uses value as the plugin format, valueStr as actual path. * Uses value as the plugin format, valueStr as actual path.
* @see PluginType * @see PluginType
*/ */
ENGINE_OPTION_PLUGIN_PATH = 18,
ENGINE_OPTION_PLUGIN_PATH = 19,


/*! /*!
* Set path to the binary files. * Set path to the binary files.
* Default unset. * Default unset.
* @note Must be set for plugin and UI bridges to work * @note Must be set for plugin and UI bridges to work
*/ */
ENGINE_OPTION_PATH_BINARIES = 19,
ENGINE_OPTION_PATH_BINARIES = 20,


/*! /*!
* Set path to the resource files. * Set path to the resource files.
* Default unset. * Default unset.
* @note Must be set for some internal plugins to work * @note Must be set for some internal plugins to work
*/ */
ENGINE_OPTION_PATH_RESOURCES = 20,
ENGINE_OPTION_PATH_RESOURCES = 21,


/*! /*!
* Prevent bad plugin and UI behaviour. * Prevent bad plugin and UI behaviour.
* @note: Linux only * @note: Linux only
*/ */
ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR = 21,
ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR = 22,


/*! /*!
* Set UI scaling used in frontend, so backend can do the same for plugin UIs. * Set UI scaling used in frontend, so backend can do the same for plugin UIs.
*/ */
ENGINE_OPTION_FRONTEND_UI_SCALE = 22,
ENGINE_OPTION_FRONTEND_UI_SCALE = 23,


/*! /*!
* 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 = 23,
ENGINE_OPTION_FRONTEND_WIN_ID = 24,


#if !defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) && !defined(CARLA_OS_WIN) #if !defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) && !defined(CARLA_OS_WIN)
/*! /*!
* Set path to wine executable. * Set path to wine executable.
*/ */
ENGINE_OPTION_WINE_EXECUTABLE = 24,
ENGINE_OPTION_WINE_EXECUTABLE = 25,


/*! /*!
* Enable automatic wineprefix detection. * Enable automatic wineprefix detection.
*/ */
ENGINE_OPTION_WINE_AUTO_PREFIX = 25,
ENGINE_OPTION_WINE_AUTO_PREFIX = 26,


/*! /*!
* Fallback wineprefix to use if automatic detection fails or is disabled, and WINEPREFIX is not set. * Fallback wineprefix to use if automatic detection fails or is disabled, and WINEPREFIX is not set.
*/ */
ENGINE_OPTION_WINE_FALLBACK_PREFIX = 26,
ENGINE_OPTION_WINE_FALLBACK_PREFIX = 27,


/*! /*!
* Enable realtime priority for Wine application and server threads. * Enable realtime priority for Wine application and server threads.
*/ */
ENGINE_OPTION_WINE_RT_PRIO_ENABLED = 27,
ENGINE_OPTION_WINE_RT_PRIO_ENABLED = 28,


/*! /*!
* Base realtime priority for Wine threads. * Base realtime priority for Wine threads.
*/ */
ENGINE_OPTION_WINE_BASE_RT_PRIO = 28,
ENGINE_OPTION_WINE_BASE_RT_PRIO = 29,


/*! /*!
* Wine server realtime priority. * Wine server realtime priority.
*/ */
ENGINE_OPTION_WINE_SERVER_RT_PRIO = 29,
ENGINE_OPTION_WINE_SERVER_RT_PRIO = 30,
#endif #endif


/*! /*!
* Capture console output into debug callbacks. * Capture console output into debug callbacks.
*/ */
ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT = 30
ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT = 31


} EngineOption; } EngineOption;




+ 1
- 0
source/backend/CarlaEngine.hpp View File

@@ -235,6 +235,7 @@ struct CARLA_API EngineOptions {
const char* transportExtra; const char* transportExtra;


bool forceStereo; bool forceStereo;
bool resetXruns;
bool preferPluginBridges; bool preferPluginBridges;
bool preferUiBridges; bool preferUiBridges;
bool uisAlwaysOnTop; bool uisAlwaysOnTop;


+ 27
- 14
source/backend/CarlaStandalone.cpp View File

@@ -189,21 +189,24 @@ static void carla_engine_init_common(CarlaEngine* const engine)


#ifdef BUILD_BRIDGE #ifdef BUILD_BRIDGE
/* /*
if (const char* const uisAlwaysOnTop = std::getenv("ENGINE_OPTION_FORCE_STEREO"))
engine->setOption(CB::ENGINE_OPTION_FORCE_STEREO, (std::strcmp(uisAlwaysOnTop, "true") == 0) ? 1 : 0, nullptr);
if (const char* const forceStereo = std::getenv("ENGINE_OPTION_FORCE_STEREO"))
engine->setOption(CB::ENGINE_OPTION_FORCE_STEREO, (std::strcmp(forceStereo, "true") == 0) ? 1 : 0, nullptr);


if (const char* const uisAlwaysOnTop = std::getenv("ENGINE_OPTION_PREFER_PLUGIN_BRIDGES"))
engine->setOption(CB::ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, (std::strcmp(uisAlwaysOnTop, "true") == 0) ? 1 : 0, nullptr);
if (const char* const preferPluginBridges = std::getenv("ENGINE_OPTION_PREFER_PLUGIN_BRIDGES"))
engine->setOption(CB::ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, (std::strcmp(preferPluginBridges, "true") == 0) ? 1 : 0, nullptr);


if (const char* const uisAlwaysOnTop = std::getenv("ENGINE_OPTION_PREFER_UI_BRIDGES"))
engine->setOption(CB::ENGINE_OPTION_PREFER_UI_BRIDGES, (std::strcmp(uisAlwaysOnTop, "true") == 0) ? 1 : 0, nullptr);
if (const char* const preferUiBridges = std::getenv("ENGINE_OPTION_PREFER_UI_BRIDGES"))
engine->setOption(CB::ENGINE_OPTION_PREFER_UI_BRIDGES, (std::strcmp(preferUiBridges, "true") == 0) ? 1 : 0, nullptr);
*/ */


if (const char* const uisAlwaysOnTop = std::getenv("ENGINE_OPTION_UIS_ALWAYS_ON_TOP")) if (const char* const uisAlwaysOnTop = std::getenv("ENGINE_OPTION_UIS_ALWAYS_ON_TOP"))
engine->setOption(CB::ENGINE_OPTION_UIS_ALWAYS_ON_TOP, (std::strcmp(uisAlwaysOnTop, "true") == 0) ? 1 : 0, nullptr); engine->setOption(CB::ENGINE_OPTION_UIS_ALWAYS_ON_TOP, (std::strcmp(uisAlwaysOnTop, "true") == 0) ? 1 : 0, nullptr);


if (const char* const maxParameters = std::getenv("ENGINE_OPTION_MAX_PARAMETERS")) if (const char* const maxParameters = std::getenv("ENGINE_OPTION_MAX_PARAMETERS"))
engine->setOption(CB::ENGINE_OPTION_MAX_PARAMETERS, std::atoi(maxParameters), nullptr);
engine->setOption(CB::ENGINE_OPTION_MAX_PARAMETERS, std::atoi(maxParameters), nullptr);

if (const char* const resetXruns = std::getenv("ENGINE_OPTION_RESET_XRUNS"))
engine->setOption(CB::ENGINE_OPTION_RESET_XRUNS, (std::strcmp(resetXruns, "true") == 0) ? 1 : 0, nullptr);


if (const char* const uiBridgesTimeout = std::getenv("ENGINE_OPTION_UI_BRIDGES_TIMEOUT")) if (const char* const uiBridgesTimeout = std::getenv("ENGINE_OPTION_UI_BRIDGES_TIMEOUT"))
engine->setOption(CB::ENGINE_OPTION_UI_BRIDGES_TIMEOUT, std::atoi(uiBridgesTimeout), nullptr); engine->setOption(CB::ENGINE_OPTION_UI_BRIDGES_TIMEOUT, std::atoi(uiBridgesTimeout), nullptr);
@@ -236,14 +239,14 @@ static void carla_engine_init_common(CarlaEngine* const engine)
engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_SFZ, pathSFZ); engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_SFZ, pathSFZ);


if (const char* const binaryDir = std::getenv("ENGINE_OPTION_PATH_BINARIES")) if (const char* const binaryDir = std::getenv("ENGINE_OPTION_PATH_BINARIES"))
engine->setOption(CB::ENGINE_OPTION_PATH_BINARIES, 0, binaryDir);
engine->setOption(CB::ENGINE_OPTION_PATH_BINARIES, 0, binaryDir);
else else
engine->setOption(CB::ENGINE_OPTION_PATH_BINARIES, 0, waterBinaryDir.getFullPathName().toRawUTF8());
engine->setOption(CB::ENGINE_OPTION_PATH_BINARIES, 0, waterBinaryDir.getFullPathName().toRawUTF8());


if (const char* const resourceDir = std::getenv("ENGINE_OPTION_PATH_RESOURCES")) if (const char* const resourceDir = std::getenv("ENGINE_OPTION_PATH_RESOURCES"))
engine->setOption(CB::ENGINE_OPTION_PATH_RESOURCES, 0, resourceDir);
engine->setOption(CB::ENGINE_OPTION_PATH_RESOURCES, 0, resourceDir);
else else
engine->setOption(CB::ENGINE_OPTION_PATH_RESOURCES, 0, waterBinaryDir.getChildFile("resources").getFullPathName().toRawUTF8());
engine->setOption(CB::ENGINE_OPTION_PATH_RESOURCES, 0, waterBinaryDir.getChildFile("resources").getFullPathName().toRawUTF8());


if (const char* const preventBadBehaviour = std::getenv("ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR")) if (const char* const preventBadBehaviour = std::getenv("ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR"))
engine->setOption(CB::ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR, (std::strcmp(preventBadBehaviour, "true") == 0) ? 1 : 0, nullptr); engine->setOption(CB::ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR, (std::strcmp(preventBadBehaviour, "true") == 0) ? 1 : 0, nullptr);
@@ -256,6 +259,7 @@ static void carla_engine_init_common(CarlaEngine* const engine)
engine->setOption(CB::ENGINE_OPTION_PREFER_UI_BRIDGES, gStandalone.engineOptions.preferUiBridges ? 1 : 0, nullptr); engine->setOption(CB::ENGINE_OPTION_PREFER_UI_BRIDGES, gStandalone.engineOptions.preferUiBridges ? 1 : 0, nullptr);
engine->setOption(CB::ENGINE_OPTION_UIS_ALWAYS_ON_TOP, gStandalone.engineOptions.uisAlwaysOnTop ? 1 : 0, nullptr); engine->setOption(CB::ENGINE_OPTION_UIS_ALWAYS_ON_TOP, gStandalone.engineOptions.uisAlwaysOnTop ? 1 : 0, nullptr);
engine->setOption(CB::ENGINE_OPTION_MAX_PARAMETERS, static_cast<int>(gStandalone.engineOptions.maxParameters), nullptr); engine->setOption(CB::ENGINE_OPTION_MAX_PARAMETERS, static_cast<int>(gStandalone.engineOptions.maxParameters), nullptr);
engine->setOption(CB::ENGINE_OPTION_RESET_XRUNS, gStandalone.engineOptions.resetXruns ? 1 : 0, nullptr);
engine->setOption(CB::ENGINE_OPTION_UI_BRIDGES_TIMEOUT, static_cast<int>(gStandalone.engineOptions.uiBridgesTimeout), nullptr); engine->setOption(CB::ENGINE_OPTION_UI_BRIDGES_TIMEOUT, static_cast<int>(gStandalone.engineOptions.uiBridgesTimeout), nullptr);
engine->setOption(CB::ENGINE_OPTION_AUDIO_BUFFER_SIZE, static_cast<int>(gStandalone.engineOptions.audioBufferSize), nullptr); engine->setOption(CB::ENGINE_OPTION_AUDIO_BUFFER_SIZE, static_cast<int>(gStandalone.engineOptions.audioBufferSize), nullptr);
engine->setOption(CB::ENGINE_OPTION_AUDIO_SAMPLE_RATE, static_cast<int>(gStandalone.engineOptions.audioSampleRate), nullptr); engine->setOption(CB::ENGINE_OPTION_AUDIO_SAMPLE_RATE, static_cast<int>(gStandalone.engineOptions.audioSampleRate), nullptr);
@@ -409,15 +413,19 @@ bool carla_engine_init(const char* driverName, const char* clientName)
} }


#ifdef BUILD_BRIDGE #ifdef BUILD_BRIDGE
bool carla_engine_init_bridge(const char audioBaseName[6+1], const char rtClientBaseName[6+1], const char nonRtClientBaseName[6+1],
const char nonRtServerBaseName[6+1], const char* clientName)
bool carla_engine_init_bridge(const char audioBaseName[6+1],
const char rtClientBaseName[6+1],
const char nonRtClientBaseName[6+1],
const char nonRtServerBaseName[6+1],
const char* const clientName)
{ {
CARLA_SAFE_ASSERT_RETURN(audioBaseName != nullptr && audioBaseName[0] != '\0', false); CARLA_SAFE_ASSERT_RETURN(audioBaseName != nullptr && audioBaseName[0] != '\0', false);
CARLA_SAFE_ASSERT_RETURN(rtClientBaseName != nullptr && rtClientBaseName[0] != '\0', false); CARLA_SAFE_ASSERT_RETURN(rtClientBaseName != nullptr && rtClientBaseName[0] != '\0', false);
CARLA_SAFE_ASSERT_RETURN(nonRtClientBaseName != nullptr && nonRtClientBaseName[0] != '\0', false); CARLA_SAFE_ASSERT_RETURN(nonRtClientBaseName != nullptr && nonRtClientBaseName[0] != '\0', false);
CARLA_SAFE_ASSERT_RETURN(nonRtServerBaseName != nullptr && nonRtServerBaseName[0] != '\0', false); CARLA_SAFE_ASSERT_RETURN(nonRtServerBaseName != nullptr && nonRtServerBaseName[0] != '\0', false);
CARLA_SAFE_ASSERT_RETURN(clientName != nullptr && clientName[0] != '\0', false); CARLA_SAFE_ASSERT_RETURN(clientName != nullptr && clientName[0] != '\0', false);
carla_debug("carla_engine_init_bridge(\"%s\", \"%s\", \"%s\", \"%s\", \"%s\")", audioBaseName, rtClientBaseName, nonRtClientBaseName, nonRtServerBaseName, clientName);
carla_debug("carla_engine_init_bridge(\"%s\", \"%s\", \"%s\", \"%s\", \"%s\")",
audioBaseName, rtClientBaseName, nonRtClientBaseName, nonRtServerBaseName, clientName);


CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(gStandalone.engine == nullptr, "Engine is already initialized", false); CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(gStandalone.engine == nullptr, "Engine is already initialized", false);


@@ -694,6 +702,11 @@ void carla_set_engine_option(EngineOption option, int value, const char* valueSt
gStandalone.engineOptions.maxParameters = static_cast<uint>(value); gStandalone.engineOptions.maxParameters = static_cast<uint>(value);
break; break;


case CB::ENGINE_OPTION_RESET_XRUNS:
CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,);
gStandalone.engineOptions.resetXruns = (value != 0);
break;

case CB::ENGINE_OPTION_UI_BRIDGES_TIMEOUT: case CB::ENGINE_OPTION_UI_BRIDGES_TIMEOUT:
CARLA_SAFE_ASSERT_RETURN(value >= 0,); CARLA_SAFE_ASSERT_RETURN(value >= 0,);
gStandalone.engineOptions.uiBridgesTimeout = static_cast<uint>(value); gStandalone.engineOptions.uiBridgesTimeout = static_cast<uint>(value);


+ 8
- 0
source/backend/engine/CarlaEngine.cpp View File

@@ -1704,6 +1704,11 @@ void CarlaEngine::setOption(const EngineOption option, const int value, const ch
pData->options.maxParameters = static_cast<uint>(value); pData->options.maxParameters = static_cast<uint>(value);
break; break;


case ENGINE_OPTION_RESET_XRUNS:
CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,);
pData->options.resetXruns = (value != 0);
break;

case ENGINE_OPTION_UI_BRIDGES_TIMEOUT: case ENGINE_OPTION_UI_BRIDGES_TIMEOUT:
CARLA_SAFE_ASSERT_RETURN(value >= 0,); CARLA_SAFE_ASSERT_RETURN(value >= 0,);
pData->options.uiBridgesTimeout = static_cast<uint>(value); pData->options.uiBridgesTimeout = static_cast<uint>(value);
@@ -2881,6 +2886,9 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc)
} }
#endif #endif


if (pData->options.resetXruns)
clearXruns();

callback(true, true, ENGINE_CALLBACK_PROJECT_LOAD_FINISHED, 0, 0, 0, 0, 0.0f, nullptr); callback(true, true, ENGINE_CALLBACK_PROJECT_LOAD_FINISHED, 0, 0, 0, 0, 0.0f, nullptr);
callback(true, true, ENGINE_CALLBACK_CANCELABLE_ACTION, 0, 0, 0, 0, 0.0f, "Loading project"); callback(true, true, ENGINE_CALLBACK_CANCELABLE_ACTION, 0, 0, 0, 0, 0.0f, "Loading project");
return true; return true;


+ 1
- 0
source/backend/engine/CarlaEngineData.cpp View File

@@ -184,6 +184,7 @@ EngineOptions::EngineOptions() noexcept
#endif #endif
transportExtra(nullptr), transportExtra(nullptr),
forceStereo(false), forceStereo(false),
resetXruns(false),
preferPluginBridges(false), preferPluginBridges(false),
#if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN) #if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)
preferUiBridges(false), preferUiBridges(false),


+ 27
- 23
source/frontend/carla_backend.py View File

@@ -893,95 +893,98 @@ ENGINE_OPTION_UIS_ALWAYS_ON_TOP = 6
# Default is MAX_DEFAULT_PARAMETERS. # Default is MAX_DEFAULT_PARAMETERS.
ENGINE_OPTION_MAX_PARAMETERS = 7 ENGINE_OPTION_MAX_PARAMETERS = 7


# Reset Xrun counter after project load.
ENGINE_OPTION_RESET_XRUNS = 8

# Timeout value for how much to wait for UI bridges to respond, in milliseconds. # Timeout value for how much to wait for UI bridges to respond, in milliseconds.
# Default is 4000 (4 seconds). # Default is 4000 (4 seconds).
ENGINE_OPTION_UI_BRIDGES_TIMEOUT = 8
ENGINE_OPTION_UI_BRIDGES_TIMEOUT = 9


# Audio buffer size. # Audio buffer size.
# Default is 512. # Default is 512.
ENGINE_OPTION_AUDIO_BUFFER_SIZE = 9
ENGINE_OPTION_AUDIO_BUFFER_SIZE = 10


# Audio sample rate. # Audio sample rate.
# Default is 44100. # Default is 44100.
ENGINE_OPTION_AUDIO_SAMPLE_RATE = 10
ENGINE_OPTION_AUDIO_SAMPLE_RATE = 11


# Wherever to use 3 audio periods instead of the default 2. # Wherever to use 3 audio periods instead of the default 2.
# Default is false. # Default is false.
ENGINE_OPTION_AUDIO_TRIPLE_BUFFER = 11
ENGINE_OPTION_AUDIO_TRIPLE_BUFFER = 12


# Audio driver. # Audio driver.
# Default dppends on platform. # Default dppends on platform.
ENGINE_OPTION_AUDIO_DRIVER = 12
ENGINE_OPTION_AUDIO_DRIVER = 13


# Audio device (within a driver). # Audio device (within a driver).
# Default unset. # Default unset.
ENGINE_OPTION_AUDIO_DEVICE = 13
ENGINE_OPTION_AUDIO_DEVICE = 14


# Wherever to enable OSC support in the engine. # Wherever to enable OSC support in the engine.
ENGINE_OPTION_OSC_ENABLED = 14
ENGINE_OPTION_OSC_ENABLED = 15


# The network TCP port to use for OSC. # The network TCP port to use for OSC.
# A value of 0 means use a random port. # A value of 0 means use a random port.
# A value of < 0 means to not enable the TCP port for OSC. # A value of < 0 means to not enable the TCP port for OSC.
# @note Valid ports begin at 1024 and end at 32767 (inclusive) # @note Valid ports begin at 1024 and end at 32767 (inclusive)
ENGINE_OPTION_OSC_PORT_TCP = 15
ENGINE_OPTION_OSC_PORT_TCP = 16


# The network UDP port to use for OSC. # The network UDP port to use for OSC.
# A value of 0 means use a random port. # A value of 0 means use a random port.
# A value of < 0 means to not enable the UDP port for OSC. # A value of < 0 means to not enable the UDP port for OSC.
# @note Disabling this option prevents DSSI UIs from working! # @note Disabling this option prevents DSSI UIs from working!
# @note Valid ports begin at 1024 and end at 32767 (inclusive) # @note Valid ports begin at 1024 and end at 32767 (inclusive)
ENGINE_OPTION_OSC_PORT_UDP = 16
ENGINE_OPTION_OSC_PORT_UDP = 17


# Set path used for a specific file type. # Set path used for a specific file type.
# Uses value as the file format, valueStr as actual path. # Uses value as the file format, valueStr as actual path.
ENGINE_OPTION_FILE_PATH = 17
ENGINE_OPTION_FILE_PATH = 18


# Set path used for a specific plugin type. # Set path used for a specific plugin type.
# Uses value as the plugin format, valueStr as actual path. # Uses value as the plugin format, valueStr as actual path.
# @see PluginType # @see PluginType
ENGINE_OPTION_PLUGIN_PATH = 18
ENGINE_OPTION_PLUGIN_PATH = 19


# Set path to the binary files. # Set path to the binary files.
# Default unset. # Default unset.
# @note Must be set for plugin and UI bridges to work # @note Must be set for plugin and UI bridges to work
ENGINE_OPTION_PATH_BINARIES = 19
ENGINE_OPTION_PATH_BINARIES = 20


# Set path to the resource files. # Set path to the resource files.
# Default unset. # Default unset.
# @note Must be set for some internal plugins to work # @note Must be set for some internal plugins to work
ENGINE_OPTION_PATH_RESOURCES = 20
ENGINE_OPTION_PATH_RESOURCES = 21


# Prevent bad plugin and UI behaviour. # Prevent bad plugin and UI behaviour.
# @note: Linux only # @note: Linux only
ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR = 21
ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR = 22


# Set UI scaling used in frontend, so backend can do the same for plugin UIs. # Set UI scaling used in frontend, so backend can do the same for plugin UIs.
ENGINE_OPTION_FRONTEND_UI_SCALE = 22
ENGINE_OPTION_FRONTEND_UI_SCALE = 23


# 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 = 23
ENGINE_OPTION_FRONTEND_WIN_ID = 24


# Set path to wine executable. # Set path to wine executable.
ENGINE_OPTION_WINE_EXECUTABLE = 24
ENGINE_OPTION_WINE_EXECUTABLE = 25


# Enable automatic wineprefix detection. # Enable automatic wineprefix detection.
ENGINE_OPTION_WINE_AUTO_PREFIX = 25
ENGINE_OPTION_WINE_AUTO_PREFIX = 26


# Fallback wineprefix to use if automatic detection fails or is disabled, and WINEPREFIX is not set. # Fallback wineprefix to use if automatic detection fails or is disabled, and WINEPREFIX is not set.
ENGINE_OPTION_WINE_FALLBACK_PREFIX = 26
ENGINE_OPTION_WINE_FALLBACK_PREFIX = 27


# Enable realtime priority for Wine application and server threads. # Enable realtime priority for Wine application and server threads.
ENGINE_OPTION_WINE_RT_PRIO_ENABLED = 27
ENGINE_OPTION_WINE_RT_PRIO_ENABLED = 28


# Base realtime priority for Wine threads. # Base realtime priority for Wine threads.
ENGINE_OPTION_WINE_BASE_RT_PRIO = 28
ENGINE_OPTION_WINE_BASE_RT_PRIO = 29


# Wine server realtime priority. # Wine server realtime priority.
ENGINE_OPTION_WINE_SERVER_RT_PRIO = 29
ENGINE_OPTION_WINE_SERVER_RT_PRIO = 30


# Capture console output into debug callbacks # Capture console output into debug callbacks
ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT = 30
ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT = 31


# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
# Engine Process Mode # Engine Process Mode
@@ -1498,6 +1501,7 @@ class CarlaHostMeta(object):
self.forceStereo = False self.forceStereo = False
self.manageUIs = False self.manageUIs = False
self.maxParameters = 0 self.maxParameters = 0
self.resetXruns = False
self.preferPluginBridges = False self.preferPluginBridges = False
self.preferUIBridges = False self.preferUIBridges = False
self.preventBadBehaviour = False self.preventBadBehaviour = False


+ 3
- 1
source/frontend/carla_host.cpp View File

@@ -99,7 +99,8 @@ CarlaHost::CarlaHost()
exportLV2(false), exportLV2(false),
forceStereo(false), forceStereo(false),
manageUIs(false), manageUIs(false),
maxParameters(false),
maxParameters(0),
resetXruns(false),
preferPluginBridges(false), preferPluginBridges(false),
preferUIBridges(false), preferUIBridges(false),
preventBadBehaviour(false), preventBadBehaviour(false),
@@ -2549,6 +2550,7 @@ void loadHostSettings(CarlaHost& host)
host.exportLV2 = settings.valueBool(CARLA_KEY_EXPERIMENTAL_EXPORT_LV2, CARLA_DEFAULT_EXPERIMENTAL_LV2_EXPORT); host.exportLV2 = settings.valueBool(CARLA_KEY_EXPERIMENTAL_EXPORT_LV2, CARLA_DEFAULT_EXPERIMENTAL_LV2_EXPORT);
host.manageUIs = settings.valueBool(CARLA_KEY_ENGINE_MANAGE_UIS, CARLA_DEFAULT_MANAGE_UIS); host.manageUIs = settings.valueBool(CARLA_KEY_ENGINE_MANAGE_UIS, CARLA_DEFAULT_MANAGE_UIS);
host.maxParameters = settings.valueUInt(CARLA_KEY_ENGINE_MAX_PARAMETERS, CARLA_DEFAULT_MAX_PARAMETERS); host.maxParameters = settings.valueUInt(CARLA_KEY_ENGINE_MAX_PARAMETERS, CARLA_DEFAULT_MAX_PARAMETERS);
host.resetXruns = settings.valueBool(CARLA_KEY_ENGINE_RESET_XRUNS, CARLA_DEFAULT_RESET_XRUNS);
host.forceStereo = settings.valueBool(CARLA_KEY_ENGINE_FORCE_STEREO, CARLA_DEFAULT_FORCE_STEREO); host.forceStereo = settings.valueBool(CARLA_KEY_ENGINE_FORCE_STEREO, CARLA_DEFAULT_FORCE_STEREO);
host.preferPluginBridges = settings.valueBool(CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, CARLA_DEFAULT_PREFER_PLUGIN_BRIDGES); host.preferPluginBridges = settings.valueBool(CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, CARLA_DEFAULT_PREFER_PLUGIN_BRIDGES);
host.preferUIBridges = settings.valueBool(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, CARLA_DEFAULT_PREFER_UI_BRIDGES); host.preferUIBridges = settings.valueBool(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, CARLA_DEFAULT_PREFER_UI_BRIDGES);


+ 1
- 0
source/frontend/carla_host.hpp View File

@@ -72,6 +72,7 @@ public:
bool forceStereo; bool forceStereo;
bool manageUIs; bool manageUIs;
uint maxParameters; uint maxParameters;
bool resetXruns;
bool preferPluginBridges; bool preferPluginBridges;
bool preferUIBridges; bool preferUIBridges;
bool preventBadBehaviour; bool preventBadBehaviour;


+ 2
- 0
source/frontend/carla_host.py View File

@@ -2955,6 +2955,7 @@ def loadHostSettings(host):
host.exportLV2 = settings.value(CARLA_KEY_EXPERIMENTAL_EXPORT_LV2, CARLA_DEFAULT_EXPERIMENTAL_LV2_EXPORT, bool) host.exportLV2 = settings.value(CARLA_KEY_EXPERIMENTAL_EXPORT_LV2, CARLA_DEFAULT_EXPERIMENTAL_LV2_EXPORT, bool)
host.manageUIs = settings.value(CARLA_KEY_ENGINE_MANAGE_UIS, CARLA_DEFAULT_MANAGE_UIS, bool) host.manageUIs = settings.value(CARLA_KEY_ENGINE_MANAGE_UIS, CARLA_DEFAULT_MANAGE_UIS, bool)
host.maxParameters = settings.value(CARLA_KEY_ENGINE_MAX_PARAMETERS, CARLA_DEFAULT_MAX_PARAMETERS, int) host.maxParameters = settings.value(CARLA_KEY_ENGINE_MAX_PARAMETERS, CARLA_DEFAULT_MAX_PARAMETERS, int)
host.resetXruns = settings.value(CARLA_KEY_ENGINE_RESET_XRUNS, CARLA_DEFAULT_RESET_XRUNS, bool)
host.forceStereo = settings.value(CARLA_KEY_ENGINE_FORCE_STEREO, CARLA_DEFAULT_FORCE_STEREO, bool) host.forceStereo = settings.value(CARLA_KEY_ENGINE_FORCE_STEREO, CARLA_DEFAULT_FORCE_STEREO, bool)
host.preferPluginBridges = settings.value(CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, CARLA_DEFAULT_PREFER_PLUGIN_BRIDGES, bool) host.preferPluginBridges = settings.value(CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, CARLA_DEFAULT_PREFER_PLUGIN_BRIDGES, bool)
host.preferUIBridges = settings.value(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, CARLA_DEFAULT_PREFER_UI_BRIDGES, bool) host.preferUIBridges = settings.value(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, CARLA_DEFAULT_PREFER_UI_BRIDGES, bool)
@@ -3008,6 +3009,7 @@ def setHostSettings(host):


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_MAX_PARAMETERS, host.maxParameters, "") host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, host.maxParameters, "")
host.set_engine_option(ENGINE_OPTION_RESET_XRUNS, host.resetXruns, "")
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, "")
host.set_engine_option(ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR, host.preventBadBehaviour, "") host.set_engine_option(ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR, host.preventBadBehaviour, "")


+ 429
- 5
source/frontend/carla_settings.cpp View File

@@ -435,9 +435,9 @@ enum PluginPathIndexes {


struct CarlaSettingsW::PrivateData { struct CarlaSettingsW::PrivateData {
Ui::CarlaSettingsW ui; Ui::CarlaSettingsW ui;
const CarlaHost& host;
CarlaHost& host;


PrivateData(CarlaSettingsW* const self, const CarlaHost& h)
PrivateData(CarlaSettingsW* const self, CarlaHost& h)
: ui(), : ui(),
host(h) host(h)
{ {
@@ -578,6 +578,7 @@ struct CarlaSettingsW::PrivateData {
ui.cb_engine_process_mode_other->setCurrentIndex(0); ui.cb_engine_process_mode_other->setCurrentIndex(0);


ui.sb_engine_max_params->setValue(static_cast<int>(host.maxParameters)); ui.sb_engine_max_params->setValue(static_cast<int>(host.maxParameters));
ui.cb_engine_reset_xruns->setChecked(host.resetXruns);
ui.ch_engine_manage_uis->setChecked(host.manageUIs); ui.ch_engine_manage_uis->setChecked(host.manageUIs);
ui.ch_engine_prefer_ui_bridges->setChecked(host.preferUIBridges); ui.ch_engine_prefer_ui_bridges->setChecked(host.preferUIBridges);
ui.sb_engine_ui_bridges_timeout->setValue(host.uiBridgesTimeout); ui.sb_engine_ui_bridges_timeout->setValue(host.uiBridgesTimeout);
@@ -746,6 +747,429 @@ struct CarlaSettingsW::PrivateData {
CARLA_DEFAULT_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR)); CARLA_DEFAULT_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR));
} }


void saveSettings()
{
{
QSafeSettings settings;

host.experimental = ui.ch_main_experimental->isChecked();

if (! host.experimental)
resetExperimentalSettings();

// --------------------------------------------------------------------------------------------------------
// Main

settings.setValue(CARLA_KEY_MAIN_PROJECT_FOLDER, ui.le_main_proj_folder->text());
settings.setValue(CARLA_KEY_MAIN_CONFIRM_EXIT, ui.ch_main_confirm_exit->isChecked());
settings.setValue(CARLA_KEY_MAIN_USE_PRO_THEME, ui.ch_main_theme_pro->isChecked());
settings.setValue(CARLA_KEY_MAIN_PRO_THEME_COLOR, ui.cb_main_theme_color->currentText());
settings.setValue(CARLA_KEY_MAIN_REFRESH_INTERVAL, ui.sb_main_refresh_interval->value());

// --------------------------------------------------------------------------------------------------------
// Canvas

settings.setValue(CARLA_KEY_CANVAS_THEME, ui.cb_canvas_theme->currentText());
settings.setValue(CARLA_KEY_CANVAS_SIZE, ui.cb_canvas_size->currentText());
settings.setValue(CARLA_KEY_CANVAS_USE_BEZIER_LINES, ui.cb_canvas_bezier_lines->isChecked());
settings.setValue(CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS, ui.cb_canvas_hide_groups->isChecked());
settings.setValue(CARLA_KEY_CANVAS_AUTO_SELECT_ITEMS, ui.cb_canvas_auto_select->isChecked());
settings.setValue(CARLA_KEY_CANVAS_EYE_CANDY, ui.cb_canvas_eyecandy->isChecked());
settings.setValue(CARLA_KEY_CANVAS_FANCY_EYE_CANDY, ui.cb_canvas_fancy_eyecandy->isChecked());
settings.setValue(CARLA_KEY_CANVAS_USE_OPENGL, ui.cb_canvas_use_opengl->isChecked());
settings.setValue(CARLA_KEY_CANVAS_HQ_ANTIALIASING, ui.cb_canvas_render_hq_aa->isChecked());
settings.setValue(CARLA_KEY_CANVAS_ANTIALIASING, ui.cb_canvas_render_aa->checkState()); // 0, 1, 2 match their enum variants
settings.setValue(CARLA_KEY_CANVAS_FULL_REPAINTS, ui.cb_canvas_full_repaints->isChecked());
settings.setValue(CARLA_KEY_CANVAS_INLINE_DISPLAYS, ui.cb_canvas_inline_displays->isChecked());
}

// ------------------------------------------------------------------------------------------------------------

QSafeSettings settings("falkTX", "Carla2");

// ------------------------------------------------------------------------------------------------------------
// Main

settings.setValue(CARLA_KEY_MAIN_EXPERIMENTAL, host.experimental);

// ------------------------------------------------------------------------------------------------------------
// Engine

const QCarlaString audioDriver = ui.cb_engine_audio_driver->currentText();

if (audioDriver.isNotEmpty() && host.audioDriverForced.isEmpty() && ! host.isPlugin)
settings.setValue(CARLA_KEY_ENGINE_AUDIO_DRIVER, audioDriver);

if (! host.processModeForced)
{
// engine sends callback if processMode really changes
if (audioDriver == "JACK")
host.nextProcessMode = static_cast<EngineProcessMode>(ui.cb_engine_process_mode_jack->currentIndex());
else
host.nextProcessMode = static_cast<EngineProcessMode>(ui.cb_engine_process_mode_other->currentIndex() + PROCESS_MODE_NON_JACK_PADDING);

settings.setValue(CARLA_KEY_ENGINE_PROCESS_MODE, host.nextProcessMode);
}

host.exportLV2 = ui.ch_exp_export_lv2->isChecked();
host.forceStereo = ui.ch_engine_force_stereo->isChecked();
host.resetXruns = ui.cb_engine_reset_xruns->isChecked();
host.maxParameters = static_cast<uint>(std::max(0, ui.sb_engine_max_params->value()));
host.manageUIs = ui.ch_engine_manage_uis->isChecked();
host.preferPluginBridges = ui.ch_engine_prefer_plugin_bridges->isChecked();
host.preferUIBridges = ui.ch_engine_prefer_ui_bridges->isChecked();
host.showLogs = ui.ch_main_show_logs->isChecked();
host.showPluginBridges = ui.cb_exp_plugin_bridges->isChecked();
host.showWineBridges = ui.ch_exp_wine_bridges->isChecked();
host.uiBridgesTimeout = ui.sb_engine_ui_bridges_timeout->value();
host.uisAlwaysOnTop = ui.ch_engine_uis_always_on_top->isChecked();

if (ui.ch_engine_force_stereo->isEnabled())
settings.setValue(CARLA_KEY_ENGINE_FORCE_STEREO, host.forceStereo);

settings.setValue(CARLA_KEY_MAIN_SHOW_LOGS, host.showLogs);
settings.setValue(CARLA_KEY_ENGINE_MAX_PARAMETERS, host.maxParameters);
settings.setValue(CARLA_KEY_ENGINE_RESET_XRUNS, host.resetXruns);
settings.setValue(CARLA_KEY_ENGINE_MANAGE_UIS, host.manageUIs);
settings.setValue(CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, host.preferPluginBridges);
settings.setValue(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, host.preferUIBridges);
settings.setValue(CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT, host.uiBridgesTimeout);
settings.setValue(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, host.uisAlwaysOnTop);
settings.setValue(CARLA_KEY_EXPERIMENTAL_EXPORT_LV2, host.exportLV2);
settings.setValue(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, host.showPluginBridges);
settings.setValue(CARLA_KEY_EXPERIMENTAL_WINE_BRIDGES, host.showWineBridges);

// ------------------------------------------------------------------------------------------------------------
// OSC

settings.setValue(CARLA_KEY_OSC_ENABLED, ui.ch_osc_enable->isChecked());
settings.setValue(CARLA_KEY_OSC_TCP_PORT_ENABLED, ui.group_osc_tcp_port->isChecked());
settings.setValue(CARLA_KEY_OSC_UDP_PORT_ENABLED, ui.group_osc_udp_port->isChecked());
settings.setValue(CARLA_KEY_OSC_TCP_PORT_RANDOM, ui.rb_osc_tcp_port_random->isChecked());
settings.setValue(CARLA_KEY_OSC_UDP_PORT_RANDOM, ui.rb_osc_udp_port_random->isChecked());
settings.setValue(CARLA_KEY_OSC_TCP_PORT_NUMBER, ui.sb_osc_tcp_port_number->value());
settings.setValue(CARLA_KEY_OSC_UDP_PORT_NUMBER, ui.sb_osc_udp_port_number->value());

// ------------------------------------------------------------------------------------------------------------
// File Paths

QStringList audioPaths;
QStringList midiPaths;

for (int i=0; i < ui.lw_files_audio->count(); ++i)
audioPaths.append(ui.lw_files_audio->item(i)->text());

for (int i=0; i < ui.lw_files_midi->count(); ++i)
midiPaths.append(ui.lw_files_midi->item(i)->text());

/* TODO
host.set_engine_option(ENGINE_OPTION_FILE_PATH, FILE_AUDIO, splitter.join(audioPaths));
host.set_engine_option(ENGINE_OPTION_FILE_PATH, FILE_MIDI, splitter.join(midiPaths));
*/

settings.setValue(CARLA_KEY_PATHS_AUDIO, audioPaths);
settings.setValue(CARLA_KEY_PATHS_MIDI, midiPaths);

// ------------------------------------------------------------------------------------------------------------
// Plugin Paths

QStringList ladspas;
QStringList dssis;
QStringList lv2s;
QStringList vst2s;
QStringList vst3s;
QStringList sf2s;
QStringList sfzs;

for (int i=0; i < ui.lw_ladspa->count(); ++i)
ladspas.append(ui.lw_ladspa->item(i)->text());

for (int i=0; i < ui.lw_dssi->count(); ++i)
dssis.append(ui.lw_dssi->item(i)->text());

for (int i=0; i < ui.lw_lv2->count(); ++i)
lv2s.append(ui.lw_lv2->item(i)->text());

for (int i=0; i < ui.lw_vst->count(); ++i)
vst2s.append(ui.lw_vst->item(i)->text());

for (int i=0; i < ui.lw_vst3->count(); ++i)
vst3s.append(ui.lw_vst3->item(i)->text());

for (int i=0; i < ui.lw_sf2->count(); ++i)
sf2s.append(ui.lw_sf2->item(i)->text());

for (int i=0; i < ui.lw_sfz->count(); ++i)
sfzs.append(ui.lw_sfz->item(i)->text());

/* TODO
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LADSPA, splitter.join(ladspas));
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_DSSI, splitter.join(dssis));
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LV2, splitter.join(lv2s));
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_VST2, splitter.join(vst2s));
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_VST3, splitter.join(vst3s));
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_SF2, splitter.join(sf2s));
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_SFZ, splitter.join(sfzs));
*/

settings.setValue(CARLA_KEY_PATHS_LADSPA, ladspas);
settings.setValue(CARLA_KEY_PATHS_DSSI, dssis);
settings.setValue(CARLA_KEY_PATHS_LV2, lv2s);
settings.setValue(CARLA_KEY_PATHS_VST2, vst2s);
settings.setValue(CARLA_KEY_PATHS_VST3, vst3s);
settings.setValue(CARLA_KEY_PATHS_SF2, sf2s);
settings.setValue(CARLA_KEY_PATHS_SFZ, sfzs);

// ------------------------------------------------------------------------------------------------------------
// Wine

settings.setValue(CARLA_KEY_WINE_EXECUTABLE, ui.le_wine_exec->text());
settings.setValue(CARLA_KEY_WINE_AUTO_PREFIX, ui.cb_wine_prefix_detect->isChecked());
settings.setValue(CARLA_KEY_WINE_FALLBACK_PREFIX, ui.le_wine_prefix_fallback->text());
settings.setValue(CARLA_KEY_WINE_RT_PRIO_ENABLED, ui.group_wine_realtime->isChecked());
settings.setValue(CARLA_KEY_WINE_BASE_RT_PRIO, ui.sb_wine_base_prio->value());
settings.setValue(CARLA_KEY_WINE_SERVER_RT_PRIO, ui.sb_wine_server_prio->value());

// ------------------------------------------------------------------------------------------------------------
// Experimental

settings.setValue(CARLA_KEY_EXPERIMENTAL_JACK_APPS, ui.ch_exp_jack_apps->isChecked());
settings.setValue(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, ui.ch_exp_load_lib_global->isChecked());
settings.setValue(CARLA_KEY_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, ui.ch_exp_prevent_bad_behaviour->isChecked());
}

void resetSettings()
{
switch (ui.lw_page->currentRow())
{
// ------------------------------------------------------------------------------------------------------------
// Main

case TAB_INDEX_MAIN:
ui.le_main_proj_folder->setText(CARLA_DEFAULT_MAIN_PROJECT_FOLDER);
ui.ch_main_theme_pro->setChecked(CARLA_DEFAULT_MAIN_USE_PRO_THEME && ui.group_main_theme->isEnabled());
ui.cb_main_theme_color->setCurrentIndex(ui.cb_main_theme_color->findText(CARLA_DEFAULT_MAIN_PRO_THEME_COLOR));
ui.sb_main_refresh_interval->setValue(CARLA_DEFAULT_MAIN_REFRESH_INTERVAL);
ui.ch_main_confirm_exit->setChecked(CARLA_DEFAULT_MAIN_CONFIRM_EXIT);
ui.ch_main_show_logs->setChecked(CARLA_DEFAULT_MAIN_SHOW_LOGS);
break;

// ------------------------------------------------------------------------------------------------------------
// Canvas

case TAB_INDEX_CANVAS:
ui.cb_canvas_theme->setCurrentIndex(ui.cb_canvas_theme->findText(CARLA_DEFAULT_CANVAS_THEME));
ui.cb_canvas_size->setCurrentIndex(ui.cb_canvas_size->findText(CARLA_DEFAULT_CANVAS_SIZE));
ui.cb_canvas_bezier_lines->setChecked(CARLA_DEFAULT_CANVAS_USE_BEZIER_LINES);
ui.cb_canvas_hide_groups->setChecked(CARLA_DEFAULT_CANVAS_AUTO_HIDE_GROUPS);
ui.cb_canvas_auto_select->setChecked(CARLA_DEFAULT_CANVAS_AUTO_SELECT_ITEMS);
ui.cb_canvas_eyecandy->setChecked(CARLA_DEFAULT_CANVAS_EYE_CANDY);
ui.cb_canvas_render_aa->setCheckState(Qt::PartiallyChecked); // CARLA_DEFAULT_CANVAS_ANTIALIASING
ui.cb_canvas_full_repaints->setChecked(CARLA_DEFAULT_CANVAS_FULL_REPAINTS);
break;

// ------------------------------------------------------------------------------------------------------------
// Engine

case TAB_INDEX_ENGINE:
if (! host.isPlugin)
ui.cb_engine_audio_driver->setCurrentIndex(0);

if (! host.processModeForced)
{
if (ui.cb_engine_audio_driver->currentText() == "JACK")
{
ui.cb_engine_process_mode_jack->setCurrentIndex(CARLA_DEFAULT_PROCESS_MODE);
ui.sw_engine_process_mode->setCurrentIndex(0); // show all modes
}
else
{
ui.cb_engine_process_mode_other->setCurrentIndex(CARLA_DEFAULT_PROCESS_MODE-PROCESS_MODE_NON_JACK_PADDING);
ui.sw_engine_process_mode->setCurrentIndex(1); // hide single+multi client modes
}
}

ui.sb_engine_max_params->setValue(CARLA_DEFAULT_MAX_PARAMETERS);
ui.cb_engine_reset_xruns->setChecked(CARLA_DEFAULT_RESET_XRUNS);
ui.ch_engine_uis_always_on_top->setChecked(CARLA_DEFAULT_UIS_ALWAYS_ON_TOP);
ui.ch_engine_prefer_ui_bridges->setChecked(CARLA_DEFAULT_PREFER_UI_BRIDGES);
ui.sb_engine_ui_bridges_timeout->setValue(CARLA_DEFAULT_UI_BRIDGES_TIMEOUT);
ui.ch_engine_manage_uis->setChecked(CARLA_DEFAULT_MANAGE_UIS);
break;

// ------------------------------------------------------------------------------------------------------------
// OSC

case TAB_INDEX_OSC:
ui.ch_osc_enable->setChecked(CARLA_DEFAULT_OSC_ENABLED);
ui.group_osc_tcp_port->setChecked(CARLA_DEFAULT_OSC_TCP_PORT_ENABLED);
ui.group_osc_udp_port->setChecked(CARLA_DEFAULT_OSC_UDP_PORT_ENABLED);
ui.sb_osc_tcp_port_number->setValue(CARLA_DEFAULT_OSC_TCP_PORT_NUMBER);
ui.sb_osc_udp_port_number->setValue(CARLA_DEFAULT_OSC_UDP_PORT_NUMBER);

if (CARLA_DEFAULT_OSC_TCP_PORT_RANDOM)
{
ui.rb_osc_tcp_port_specific->setChecked(false);
ui.rb_osc_tcp_port_random->setChecked(true);
}
else
{
ui.rb_osc_tcp_port_random->setChecked(false);
ui.rb_osc_tcp_port_specific->setChecked(true);
}

if (CARLA_DEFAULT_OSC_UDP_PORT_RANDOM)
{
ui.rb_osc_udp_port_specific->setChecked(false);
ui.rb_osc_udp_port_random->setChecked(true);
}
else
{
ui.rb_osc_udp_port_random->setChecked(false);
ui.rb_osc_udp_port_specific->setChecked(true);
}
break;

// ------------------------------------------------------------------------------------------------------------
// Plugin Paths

case TAB_INDEX_FILEPATHS:
switch (ui.tw_filepaths->currentIndex())
{
case FILEPATH_INDEX_AUDIO:
ui.lw_files_audio->clear();
break;
case FILEPATH_INDEX_MIDI:
ui.lw_files_midi->clear();
break;
}
break;

// ------------------------------------------------------------------------------------------------------------
// Plugin Paths

case TAB_INDEX_PLUGINPATHS:
{
QStringList paths;

switch (ui.tw_paths->currentIndex())
{
case PLUGINPATH_INDEX_LADSPA:
paths = CARLA_DEFAULT_LADSPA_PATH;
paths.sort();
ui.lw_ladspa->clear();

for (const auto& path : paths)
{
if (path.isEmpty())
continue;
ui.lw_ladspa->addItem(path);
}
break;

case PLUGINPATH_INDEX_DSSI:
paths = CARLA_DEFAULT_DSSI_PATH;
paths.sort();
ui.lw_dssi->clear();

for (const auto& path : paths)
{
if (path.isEmpty())
continue;
ui.lw_dssi->addItem(path);
}
break;

case PLUGINPATH_INDEX_LV2:
paths = CARLA_DEFAULT_LV2_PATH;
paths.sort();
ui.lw_lv2->clear();

for (const auto& path : paths)
{
if (path.isEmpty())
continue;
ui.lw_lv2->addItem(path);
}
break;

case PLUGINPATH_INDEX_VST2:
paths = CARLA_DEFAULT_VST2_PATH;
paths.sort();
ui.lw_vst->clear();

for (const auto& path : paths)
{
if (path.isEmpty())
continue;
ui.lw_vst->addItem(path);
}
break;

case PLUGINPATH_INDEX_VST3:
paths = CARLA_DEFAULT_VST3_PATH;
paths.sort();
ui.lw_vst3->clear();

for (const auto& path : paths)
{
if (path.isEmpty())
continue;
ui.lw_vst3->addItem(path);
}
break;

case PLUGINPATH_INDEX_SF2:
paths = CARLA_DEFAULT_SF2_PATH;
paths.sort();
ui.lw_sf2->clear();

for (const auto& path : paths)
{
if (path.isEmpty())
continue;
ui.lw_sf2->addItem(path);
}
break;

case PLUGINPATH_INDEX_SFZ:
paths = CARLA_DEFAULT_SFZ_PATH;
paths.sort();
ui.lw_sfz->clear();

for (const auto& path : paths)
{
if (path.isEmpty())
continue;
ui.lw_sfz->addItem(path);
}
break;
}
break;
}

// ------------------------------------------------------------------------------------------------------------
// Wine

case TAB_INDEX_WINE:
ui.le_wine_exec->setText(CARLA_DEFAULT_WINE_EXECUTABLE);
ui.cb_wine_prefix_detect->setChecked(CARLA_DEFAULT_WINE_AUTO_PREFIX);
ui.le_wine_prefix_fallback->setText(CARLA_DEFAULT_WINE_FALLBACK_PREFIX);
ui.group_wine_realtime->setChecked(CARLA_DEFAULT_WINE_RT_PRIO_ENABLED);
ui.sb_wine_base_prio->setValue(CARLA_DEFAULT_WINE_BASE_RT_PRIO);
ui.sb_wine_server_prio->setValue(CARLA_DEFAULT_WINE_SERVER_RT_PRIO);
break;

// ------------------------------------------------------------------------------------------------------------
// Experimental

case TAB_INDEX_EXPERIMENTAL:
resetExperimentalSettings();
break;
}

}

void resetExperimentalSettings() void resetExperimentalSettings()
{ {
// Forever experimental // Forever experimental
@@ -766,7 +1190,7 @@ struct CarlaSettingsW::PrivateData {
} }
}; };


CarlaSettingsW::CarlaSettingsW(QWidget* const parent, const CarlaHost& host, const bool hasCanvas, const bool hasCanvasGL)
CarlaSettingsW::CarlaSettingsW(QWidget* const parent, CarlaHost& host, const bool hasCanvas, const bool hasCanvasGL)
: QDialog(parent), : QDialog(parent),
self(new PrivateData(this, host)) self(new PrivateData(this, host))
{ {
@@ -929,12 +1353,12 @@ CarlaSettingsW::~CarlaSettingsW()


void CarlaSettingsW::slot_saveSettings() void CarlaSettingsW::slot_saveSettings()
{ {
// TODO
self->saveSettings();
} }


void CarlaSettingsW::slot_resetSettings() void CarlaSettingsW::slot_resetSettings()
{ {
// TODO
self->resetSettings();
} }


// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------


+ 1
- 1
source/frontend/carla_settings.hpp View File

@@ -93,7 +93,7 @@ class CarlaSettingsW : public QDialog
Q_OBJECT Q_OBJECT


public: public:
CarlaSettingsW(QWidget* parent, const CarlaHost& host, bool hasCanvas, bool hasCanvasGL);
CarlaSettingsW(QWidget* parent, CarlaHost& host, bool hasCanvas, bool hasCanvasGL);
~CarlaSettingsW() override; ~CarlaSettingsW() override;


private: private:


+ 4
- 0
source/frontend/carla_settings.py View File

@@ -574,6 +574,7 @@ class CarlaSettingsW(QDialog):
self.ui.cb_engine_process_mode_other.setCurrentIndex(0) self.ui.cb_engine_process_mode_other.setCurrentIndex(0)


self.ui.sb_engine_max_params.setValue(self.host.maxParameters) self.ui.sb_engine_max_params.setValue(self.host.maxParameters)
self.ui.cb_engine_reset_xruns.setChecked(self.host.resetXruns)
self.ui.ch_engine_manage_uis.setChecked(self.host.manageUIs) self.ui.ch_engine_manage_uis.setChecked(self.host.manageUIs)
self.ui.ch_engine_prefer_ui_bridges.setChecked(self.host.preferUIBridges) self.ui.ch_engine_prefer_ui_bridges.setChecked(self.host.preferUIBridges)
self.ui.sb_engine_ui_bridges_timeout.setValue(self.host.uiBridgesTimeout) self.ui.sb_engine_ui_bridges_timeout.setValue(self.host.uiBridgesTimeout)
@@ -794,6 +795,7 @@ class CarlaSettingsW(QDialog):


self.host.exportLV2 = self.ui.ch_exp_export_lv2.isChecked() self.host.exportLV2 = self.ui.ch_exp_export_lv2.isChecked()
self.host.forceStereo = self.ui.ch_engine_force_stereo.isChecked() self.host.forceStereo = self.ui.ch_engine_force_stereo.isChecked()
self.host.resetXruns = self.ui.cb_engine_reset_xruns.isChecked()
self.host.maxParameters = self.ui.sb_engine_max_params.value() self.host.maxParameters = self.ui.sb_engine_max_params.value()
self.host.manageUIs = self.ui.ch_engine_manage_uis.isChecked() self.host.manageUIs = self.ui.ch_engine_manage_uis.isChecked()
self.host.preferPluginBridges = self.ui.ch_engine_prefer_plugin_bridges.isChecked() self.host.preferPluginBridges = self.ui.ch_engine_prefer_plugin_bridges.isChecked()
@@ -809,6 +811,7 @@ class CarlaSettingsW(QDialog):


settings.setValue(CARLA_KEY_MAIN_SHOW_LOGS, self.host.showLogs) 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_MAX_PARAMETERS, self.host.maxParameters)
settings.setValue(CARLA_KEY_ENGINE_RESET_XRUNS, self.host.resetXruns)
settings.setValue(CARLA_KEY_ENGINE_MANAGE_UIS, self.host.manageUIs) 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_PLUGIN_BRIDGES, self.host.preferPluginBridges)
settings.setValue(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, self.host.preferUIBridges) settings.setValue(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, self.host.preferUIBridges)
@@ -958,6 +961,7 @@ class CarlaSettingsW(QDialog):
self.ui.sw_engine_process_mode.setCurrentIndex(1) # hide single+multi client modes self.ui.sw_engine_process_mode.setCurrentIndex(1) # hide single+multi client modes


self.ui.sb_engine_max_params.setValue(CARLA_DEFAULT_MAX_PARAMETERS) self.ui.sb_engine_max_params.setValue(CARLA_DEFAULT_MAX_PARAMETERS)
self.ui.cb_engine_reset_xruns.setChecked(CARLA_DEFAULT_RESET_XRUNS)
self.ui.ch_engine_uis_always_on_top.setChecked(CARLA_DEFAULT_UIS_ALWAYS_ON_TOP) self.ui.ch_engine_uis_always_on_top.setChecked(CARLA_DEFAULT_UIS_ALWAYS_ON_TOP)
self.ui.ch_engine_prefer_ui_bridges.setChecked(CARLA_DEFAULT_PREFER_UI_BRIDGES) self.ui.ch_engine_prefer_ui_bridges.setChecked(CARLA_DEFAULT_PREFER_UI_BRIDGES)
self.ui.sb_engine_ui_bridges_timeout.setValue(CARLA_DEFAULT_UI_BRIDGES_TIMEOUT) self.ui.sb_engine_ui_bridges_timeout.setValue(CARLA_DEFAULT_UI_BRIDGES_TIMEOUT)


+ 2
- 0
source/frontend/carla_shared.hpp View File

@@ -151,6 +151,7 @@ static const char* const* const MIDI_CC_LIST = {
#define CARLA_KEY_ENGINE_MANAGE_UIS "Engine/ManageUIs" /* bool */ #define CARLA_KEY_ENGINE_MANAGE_UIS "Engine/ManageUIs" /* bool */
#define CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP "Engine/UIsAlwaysOnTop" /* bool */ #define CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP "Engine/UIsAlwaysOnTop" /* bool */
#define CARLA_KEY_ENGINE_MAX_PARAMETERS "Engine/MaxParameters" /* int */ #define CARLA_KEY_ENGINE_MAX_PARAMETERS "Engine/MaxParameters" /* int */
#define CARLA_KEY_ENGINE_RESET_XRUNS "Engine/ResetXruns" /* bool */
#define CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT "Engine/UiBridgesTimeout" /* int */ #define CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT "Engine/UiBridgesTimeout" /* int */


#define CARLA_KEY_OSC_ENABLED "OSC/Enabled" #define CARLA_KEY_OSC_ENABLED "OSC/Enabled"
@@ -228,6 +229,7 @@ static const char* const* const MIDI_CC_LIST = {
#define CARLA_DEFAULT_MANAGE_UIS true #define CARLA_DEFAULT_MANAGE_UIS true
#define CARLA_DEFAULT_UIS_ALWAYS_ON_TOP false #define CARLA_DEFAULT_UIS_ALWAYS_ON_TOP false
#define CARLA_DEFAULT_MAX_PARAMETERS MAX_DEFAULT_PARAMETERS #define CARLA_DEFAULT_MAX_PARAMETERS MAX_DEFAULT_PARAMETERS
#define CARLA_DEFAULT_RESET_XRUNS false
#define CARLA_DEFAULT_UI_BRIDGES_TIMEOUT 4000 #define CARLA_DEFAULT_UI_BRIDGES_TIMEOUT 4000


#define CARLA_DEFAULT_AUDIO_BUFFER_SIZE 512 #define CARLA_DEFAULT_AUDIO_BUFFER_SIZE 512


+ 2
- 0
source/frontend/carla_shared.py View File

@@ -212,6 +212,7 @@ CARLA_KEY_ENGINE_PREFER_UI_BRIDGES = "Engine/PreferUiBridges" # bool
CARLA_KEY_ENGINE_MANAGE_UIS = "Engine/ManageUIs" # bool CARLA_KEY_ENGINE_MANAGE_UIS = "Engine/ManageUIs" # bool
CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP = "Engine/UIsAlwaysOnTop" # bool CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP = "Engine/UIsAlwaysOnTop" # bool
CARLA_KEY_ENGINE_MAX_PARAMETERS = "Engine/MaxParameters" # int CARLA_KEY_ENGINE_MAX_PARAMETERS = "Engine/MaxParameters" # int
CARLA_KEY_ENGINE_RESET_XRUNS = "Engine/ResetXruns" # bool
CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT = "Engine/UiBridgesTimeout" # int CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT = "Engine/UiBridgesTimeout" # int


CARLA_KEY_OSC_ENABLED = "OSC/Enabled" CARLA_KEY_OSC_ENABLED = "OSC/Enabled"
@@ -285,6 +286,7 @@ CARLA_DEFAULT_PREFER_UI_BRIDGES = True
CARLA_DEFAULT_MANAGE_UIS = True CARLA_DEFAULT_MANAGE_UIS = True
CARLA_DEFAULT_UIS_ALWAYS_ON_TOP = False CARLA_DEFAULT_UIS_ALWAYS_ON_TOP = False
CARLA_DEFAULT_MAX_PARAMETERS = MAX_DEFAULT_PARAMETERS CARLA_DEFAULT_MAX_PARAMETERS = MAX_DEFAULT_PARAMETERS
CARLA_DEFAULT_RESET_XRUNS = False
CARLA_DEFAULT_UI_BRIDGES_TIMEOUT = 4000 CARLA_DEFAULT_UI_BRIDGES_TIMEOUT = 4000


CARLA_DEFAULT_AUDIO_BUFFER_SIZE = 512 CARLA_DEFAULT_AUDIO_BUFFER_SIZE = 512


+ 2
- 0
source/utils/CarlaBackendUtils.hpp View File

@@ -342,6 +342,8 @@ const char* EngineOption2Str(const EngineOption option) noexcept
return "ENGINE_OPTION_UIS_ALWAYS_ON_TOP"; return "ENGINE_OPTION_UIS_ALWAYS_ON_TOP";
case ENGINE_OPTION_MAX_PARAMETERS: case ENGINE_OPTION_MAX_PARAMETERS:
return "ENGINE_OPTION_MAX_PARAMETERS"; return "ENGINE_OPTION_MAX_PARAMETERS";
case ENGINE_OPTION_RESET_XRUNS:
return "ENGINE_OPTION_RESET_XRUNS";
case ENGINE_OPTION_UI_BRIDGES_TIMEOUT: case ENGINE_OPTION_UI_BRIDGES_TIMEOUT:
return "ENGINE_OPTION_UI_BRIDGES_TIMEOUT"; return "ENGINE_OPTION_UI_BRIDGES_TIMEOUT";
case ENGINE_OPTION_AUDIO_BUFFER_SIZE: case ENGINE_OPTION_AUDIO_BUFFER_SIZE:


Loading…
Cancel
Save