Browse Source

Save/cache audio driver in engine settings; Fixes to dialog

tags/v2.1-rc1
falkTX 5 years ago
parent
commit
5fbae267ce
12 changed files with 328 additions and 174 deletions
  1. +196
    -121
      resources/ui/carla_settings_driver.ui
  2. +23
    -17
      source/backend/CarlaBackend.h
  3. +1
    -0
      source/backend/CarlaEngine.hpp
  4. +2
    -0
      source/backend/CarlaHost.h
  5. +35
    -7
      source/backend/CarlaStandalone.cpp
  6. +10
    -0
      source/backend/engine/CarlaEngine.cpp
  7. +7
    -0
      source/backend/engine/CarlaEngineData.cpp
  8. +1
    -0
      source/backend/engine/CarlaEngineJack.cpp
  9. +21
    -17
      source/frontend/carla_backend.py
  10. +8
    -5
      source/frontend/carla_host.py
  11. +22
    -7
      source/frontend/carla_settings.py
  12. +2
    -0
      source/utils/CarlaBackendUtils.hpp

+ 196
- 121
resources/ui/carla_settings_driver.ui View File

@@ -6,109 +6,210 @@
<rect>
<x>0</x>
<y>0</y>
<width>403</width>
<width>350</width>
<height>264</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>350</width>
<height>0</height>
</size>
</property>
<property name="windowTitle">
<string>Driver Settings</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_device">
<property name="text">
<string>Device:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QComboBox" name="cb_samplerate"/>
</item>
<item row="3" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>1</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="2">
<widget class="QComboBox" name="cb_buffersize"/>
</item>
<item row="3" column="1" colspan="3">
<widget class="QCheckBox" name="cb_triple_buffer">
<property name="text">
<string>Triple buffer</string>
</property>
</widget>
</item>
<item row="4" column="0">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>1</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0" colspan="2">
<widget class="QLabel" name="label_samplerate">
<property name="text">
<string>Sample rate:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="1">
<widget class="QComboBox" name="cb_samplerate"/>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="cb_device"/>
</item>
<item row="2" column="2">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_device">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Device:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_buffersize">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Buffer size:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="cb_buffersize"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_samplerate">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Sample rate:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="label_buffersize">
<property name="text">
<string>Buffer size:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<item>
<layout class="QHBoxLayout" name="layout_triple_buffer">
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="cb_triple_buffer">
<property name="text">
<string>Triple buffer</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="4" column="4">
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>1</height>
</size>
</property>
</spacer>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="b_panel">
<property name="minimumSize">
<size>
<width>32</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Show Driver Control Panel</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="5" column="0" colspan="5">
<layout class="QHBoxLayout" name="horizontalLayout_13">
<item>
<layout class="QHBoxLayout" name="layout_restart">
<item>
<spacer name="horizontalSpacer_20">
<spacer name="spacer_1">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@@ -150,7 +251,7 @@
</widget>
</item>
<item>
<spacer name="horizontalSpacer_21">
<spacer name="spacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@@ -164,7 +265,7 @@
</item>
</layout>
</item>
<item row="7" column="0" colspan="5">
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@@ -174,32 +275,6 @@
</property>
</widget>
</item>
<item row="4" column="1" colspan="3">
<widget class="QPushButton" name="b_panel">
<property name="text">
<string>Show Driver Control Panel</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QComboBox" name="cb_device"/>
</item>
<item row="1" column="3">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>1</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources>


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

@@ -1199,16 +1199,22 @@ typedef enum {
*/
ENGINE_OPTION_AUDIO_TRIPLE_BUFFER = 11,

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

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

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

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

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

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

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

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

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

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

/*!
* Set frontend winId, used to define as parent window for plugin UIs.
*/
ENGINE_OPTION_FRONTEND_WIN_ID = 21,
ENGINE_OPTION_FRONTEND_WIN_ID = 22,

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

/*!
* Enable automatic wineprefix detection.
*/
ENGINE_OPTION_WINE_AUTO_PREFIX = 23,
ENGINE_OPTION_WINE_AUTO_PREFIX = 24,

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

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

/*!
* Base realtime priority for Wine threads.
*/
ENGINE_OPTION_WINE_BASE_RT_PRIO = 26,
ENGINE_OPTION_WINE_BASE_RT_PRIO = 27,

/*!
* Wine server realtime priority.
*/
ENGINE_OPTION_WINE_SERVER_RT_PRIO = 27,
ENGINE_OPTION_WINE_SERVER_RT_PRIO = 28,
#endif

/*!
* Capture console output into debug callbacks.
*/
ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT = 28
ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT = 29

} EngineOption;



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

@@ -240,6 +240,7 @@ struct CARLA_API EngineOptions {
uint audioBufferSize;
uint audioSampleRate;
bool audioTripleBuffer;
const char* audioDriver;
const char* audioDevice;

#ifndef BUILD_BRIDGE


+ 2
- 0
source/backend/CarlaHost.h View File

@@ -422,6 +422,7 @@ CARLA_EXPORT bool carla_is_engine_running();
*/
CARLA_EXPORT const CarlaRuntimeEngineInfo* carla_get_runtime_engine_info();

#ifndef BUILD_BRIDGE
/*!
* Get information about the currently running engine driver device.
*/
@@ -439,6 +440,7 @@ CARLA_EXPORT bool carla_set_engine_buffer_size_and_sample_rate(uint bufferSize,
* @see ENGINE_DRIVER_DEVICE_HAS_CONTROL_PANEL
*/
CARLA_EXPORT bool carla_show_engine_device_control_panel();
#endif

/*!
* Clear the xrun count on the engine, so that the next time carla_get_runtime_engine_info() is called, it returns 0.


+ 35
- 7
source/backend/CarlaStandalone.cpp View File

@@ -255,6 +255,9 @@ static void carla_engine_init_common(CarlaEngine* const engine)
engine->setOption(CB::ENGINE_OPTION_AUDIO_SAMPLE_RATE, static_cast<int>(gStandalone.engineOptions.audioSampleRate), nullptr);
engine->setOption(CB::ENGINE_OPTION_AUDIO_TRIPLE_BUFFER, gStandalone.engineOptions.audioTripleBuffer ? 1 : 0, nullptr);

if (gStandalone.engineOptions.audioDriver != nullptr)
engine->setOption(CB::ENGINE_OPTION_AUDIO_DRIVER, 0, gStandalone.engineOptions.audioDriver);

if (gStandalone.engineOptions.audioDevice != nullptr)
engine->setOption(CB::ENGINE_OPTION_AUDIO_DEVICE, 0, gStandalone.engineOptions.audioDevice);

@@ -498,6 +501,7 @@ const CarlaRuntimeEngineInfo* carla_get_runtime_engine_info()
return &retInfo;
}

#ifndef BUILD_BRIDGE
const CarlaRuntimeEngineDriverDeviceInfo* carla_get_runtime_engine_driver_device_info()
{
static CarlaRuntimeEngineDriverDeviceInfo retInfo;
@@ -510,8 +514,27 @@ const CarlaRuntimeEngineDriverDeviceInfo* carla_get_runtime_engine_driver_device
retInfo.sampleRate = 0.0;
retInfo.sampleRates = nullptr;

CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &retInfo);
const char* const audioDriver = gStandalone.engine->getCurrentDriverName();
const char* audioDriver;
const char* audioDevice;

if (CarlaEngine* const engine = gStandalone.engine)
{
audioDriver = engine->getCurrentDriverName();
audioDevice = engine->getOptions().audioDevice;

retInfo.bufferSize = engine->getBufferSize();
retInfo.sampleRate = engine->getSampleRate();
}
else
{
audioDriver = gStandalone.engineOptions.audioDriver;
audioDevice = gStandalone.engineOptions.audioDevice;

retInfo.bufferSize = gStandalone.engineOptions.audioBufferSize;
retInfo.sampleRate = gStandalone.engineOptions.audioSampleRate;
}
CARLA_SAFE_ASSERT_RETURN(audioDriver != nullptr, &retInfo);
CARLA_SAFE_ASSERT_RETURN(audioDevice != nullptr, &retInfo);

uint index = 0;
uint count = CarlaEngine::getDriverCount();
@@ -525,17 +548,12 @@ const CarlaRuntimeEngineDriverDeviceInfo* carla_get_runtime_engine_driver_device
}
CARLA_SAFE_ASSERT_RETURN(index != count, &retInfo);

const EngineOptions& options(gStandalone.engine->getOptions());
const char* const audioDevice = options.audioDevice;

const EngineDriverDeviceInfo* const devInfo = CarlaEngine::getDriverDeviceInfo(index, audioDevice);
CARLA_SAFE_ASSERT_RETURN(devInfo != nullptr, &retInfo);

retInfo.name = audioDevice;
retInfo.hints = devInfo->hints;
retInfo.bufferSize = gStandalone.engine->getBufferSize();
retInfo.bufferSizes = devInfo->bufferSizes;
retInfo.sampleRate = gStandalone.engine->getSampleRate();
retInfo.sampleRates = devInfo->sampleRates;

return &retInfo;
@@ -556,6 +574,7 @@ bool carla_show_engine_device_control_panel()

return gStandalone.engine->showDeviceControlPanel();
}
#endif

void carla_clear_engine_xruns()
{
@@ -676,6 +695,15 @@ void carla_set_engine_option(EngineOption option, int value, const char* valueSt
gStandalone.engineOptions.audioTripleBuffer = (value != 0);
break;

case CB::ENGINE_OPTION_AUDIO_DRIVER:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr,);

if (gStandalone.engineOptions.audioDriver != nullptr)
delete[] gStandalone.engineOptions.audioDriver;

gStandalone.engineOptions.audioDriver = carla_strdup_safe(valueStr);
break;

case CB::ENGINE_OPTION_AUDIO_DEVICE:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr,);



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

@@ -1604,6 +1604,7 @@ void CarlaEngine::setOption(const EngineOption option, const int value, const ch
{
case ENGINE_OPTION_PROCESS_MODE:
case ENGINE_OPTION_AUDIO_TRIPLE_BUFFER:
case ENGINE_OPTION_AUDIO_DRIVER:
case ENGINE_OPTION_AUDIO_DEVICE:
return carla_stderr("CarlaEngine::setOption(%i:%s, %i, \"%s\") - Cannot set this option while engine is running!",
option, EngineOption2Str(option), value, valueStr);
@@ -1696,6 +1697,15 @@ void CarlaEngine::setOption(const EngineOption option, const int value, const ch
pData->options.audioTripleBuffer = (value != 0);
break;

case ENGINE_OPTION_AUDIO_DRIVER:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr,);

if (pData->options.audioDriver != nullptr)
delete[] pData->options.audioDriver;

pData->options.audioDriver = carla_strdup_safe(valueStr);
break;

case ENGINE_OPTION_AUDIO_DEVICE:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr,);



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

@@ -197,6 +197,7 @@ EngineOptions::EngineOptions() noexcept
audioBufferSize(512),
audioSampleRate(44100),
audioTripleBuffer(false),
audioDriver(nullptr),
audioDevice(nullptr),
#ifndef BUILD_BRIDGE
# ifdef CARLA_OS_WIN
@@ -226,6 +227,12 @@ EngineOptions::EngineOptions() noexcept

EngineOptions::~EngineOptions() noexcept
{
if (audioDriver != nullptr)
{
delete[] audioDriver;
audioDriver = nullptr;
}

if (audioDevice != nullptr)
{
delete[] audioDevice;


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

@@ -3000,6 +3000,7 @@ int jack_initialize(jack_client_t* const client, const char* const load_init)
CarlaEngineJack* const engine = new CarlaEngineJack();

engine->setOption(ENGINE_OPTION_FORCE_STEREO, 1, nullptr);
engine->setOption(ENGINE_OPTION_AUDIO_DRIVER, 0, "JACK");
engine->setOption(ENGINE_OPTION_AUDIO_DEVICE, 0, "Auto-Connect ON");
engine->setOption(ENGINE_OPTION_OSC_ENABLED, 1, nullptr);
engine->setOption(ENGINE_OPTION_OSC_PORT_TCP, 22752, nullptr);


+ 21
- 17
source/frontend/carla_backend.py View File

@@ -861,71 +861,75 @@ ENGINE_OPTION_AUDIO_SAMPLE_RATE = 10
# Default is false.
ENGINE_OPTION_AUDIO_TRIPLE_BUFFER = 11

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

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

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

# 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 and end at 32767 (inclusive)
ENGINE_OPTION_OSC_PORT_TCP = 14
ENGINE_OPTION_OSC_PORT_TCP = 15

# 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 and end at 32767 (inclusive)
ENGINE_OPTION_OSC_PORT_UDP = 15
ENGINE_OPTION_OSC_PORT_UDP = 16

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

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

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

# Prevent bad plugin and UI behaviour.
# @note: Linux only
ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR = 19
ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR = 20

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

# Set frontend winId, used to define as parent window for plugin UIs.
ENGINE_OPTION_FRONTEND_WIN_ID = 21
ENGINE_OPTION_FRONTEND_WIN_ID = 22

# Set path to wine executable.
ENGINE_OPTION_WINE_EXECUTABLE = 22
ENGINE_OPTION_WINE_EXECUTABLE = 23

# Enable automatic wineprefix detection.
ENGINE_OPTION_WINE_AUTO_PREFIX = 23
ENGINE_OPTION_WINE_AUTO_PREFIX = 24

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

# Enable realtime priority for Wine application and server threads.
ENGINE_OPTION_WINE_RT_PRIO_ENABLED = 25
ENGINE_OPTION_WINE_RT_PRIO_ENABLED = 26

# Base realtime priority for Wine threads.
ENGINE_OPTION_WINE_BASE_RT_PRIO = 26
ENGINE_OPTION_WINE_BASE_RT_PRIO = 27

# Wine server realtime priority.
ENGINE_OPTION_WINE_SERVER_RT_PRIO = 27
ENGINE_OPTION_WINE_SERVER_RT_PRIO = 28

# Capture console output into debug callbacks
ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT = 28
ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT = 29

# ------------------------------------------------------------------------------------------------------------
# Engine Process Mode


+ 8
- 5
source/frontend/carla_host.py View File

@@ -876,12 +876,14 @@ class HostWindow(QMainWindow):
if not dialog.exec_():
return

if not self.host.is_engine_running():
QMessageBox.warning(self, self.tr("Warning"), self.tr("Engine was stopped while configuring settings, all changes have been ignored"))
return
audioDevice, bufferSize, sampleRate = dialog.getValues()

bufferSize, sampleRate = dialog.getValues()
self.host.set_engine_buffer_size_and_sample_rate(bufferSize, sampleRate)
if self.host.is_engine_running():
self.host.set_engine_buffer_size_and_sample_rate(bufferSize, sampleRate)
else:
self.host.set_engine_option(ENGINE_OPTION_AUDIO_DEVICE, 0, audioDevice)
self.host.set_engine_option(ENGINE_OPTION_AUDIO_BUFFER_SIZE, bufferSize, "")
self.host.set_engine_option(ENGINE_OPTION_AUDIO_SAMPLE_RATE, sampleRate, "")

@pyqtSlot()
def slot_engineStopTryAgain(self):
@@ -3198,6 +3200,7 @@ def setEngineSettings(host):

# Only setup audio things if engine is not running
if not host.is_engine_running():
host.set_engine_option(ENGINE_OPTION_AUDIO_DRIVER, 0, audioDriver)
host.set_engine_option(ENGINE_OPTION_AUDIO_DEVICE, 0, audioDevice)

if not audioDriver.startswith("JACK"):


+ 22
- 7
source/frontend/carla_settings.py View File

@@ -219,7 +219,6 @@ class RuntimeDriverSettingsW(QDialog):
# ----------------------------------------------------------------------------------------------------
# Set-up GUI

self.ui.cb_device.setEnabled(False)
self.ui.cb_device.clear()
self.ui.cb_buffersize.clear()
self.ui.cb_samplerate.clear()
@@ -227,15 +226,30 @@ class RuntimeDriverSettingsW(QDialog):
self.ui.ico_restart.hide()
self.ui.label_restart.hide()

self.ui.layout_triple_buffer.takeAt(2)
self.ui.layout_triple_buffer.takeAt(1)
self.ui.layout_triple_buffer.takeAt(0)
self.ui.verticalLayout.removeItem(self.ui.layout_triple_buffer)

self.ui.layout_restart.takeAt(3)
self.ui.layout_restart.takeAt(2)
self.ui.layout_restart.takeAt(1)
self.ui.layout_restart.takeAt(0)
self.ui.verticalLayout.removeItem(self.ui.layout_restart)

self.adjustSize()
self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint)
#self.setFixedSize(self.size())

# ----------------------------------------------------------------------------------------------------
# Load runtime settings

self.ui.cb_device.addItem(driverDeviceInfo['name'])
self.ui.cb_device.setCurrentIndex(0)
if host.is_engine_running():
self.ui.cb_device.addItem(driverDeviceInfo['name'])
self.ui.cb_device.setCurrentIndex(0)
self.ui.cb_device.setEnabled(False)
else:
self.ui.cb_device.addItem(driverDeviceInfo['name'])
self.ui.cb_device.setCurrentIndex(0)

if len(driverDeviceInfo['bufferSizes']) > 0:
for bsize in driverDeviceInfo['bufferSizes']:
@@ -278,15 +292,16 @@ class RuntimeDriverSettingsW(QDialog):
# --------------------------------------------------------------------------------------------------------

def getValues(self):
bufferSize = self.ui.cb_buffersize.currentText()
sampleRate = self.ui.cb_samplerate.currentText()
audioDevice = self.ui.cb_buffersize.currentText()
bufferSize = self.ui.cb_buffersize.currentText()
sampleRate = self.ui.cb_samplerate.currentText()

if bufferSize == DriverSettingsW.AUTOMATIC_OPTION:
bufferSize = "0"
if sampleRate == DriverSettingsW.AUTOMATIC_OPTION:
sampleRate = "0"

return (int(bufferSize), int(sampleRate))
return (audioDevice, int(bufferSize), int(sampleRate))

# --------------------------------------------------------------------------------------------------------



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

@@ -327,6 +327,8 @@ const char* EngineOption2Str(const EngineOption option) noexcept
return "ENGINE_OPTION_AUDIO_SAMPLE_RATE";
case ENGINE_OPTION_AUDIO_TRIPLE_BUFFER:
return "ENGINE_OPTION_AUDIO_TRIPLE_BUFFER";
case ENGINE_OPTION_AUDIO_DRIVER:
return "ENGINE_OPTION_AUDIO_DRIVER";
case ENGINE_OPTION_AUDIO_DEVICE:
return "ENGINE_OPTION_AUDIO_DEVICE";
case ENGINE_OPTION_OSC_ENABLED:


Loading…
Cancel
Save