Browse Source

Add configure driver option to engine menu, custom panel button

tags/v2.1-rc1
falkTX 5 years ago
parent
commit
e45601a25d
12 changed files with 509 additions and 110 deletions
  1. +26
    -39
      resources/ui/carla_host.ui
  2. +74
    -41
      resources/ui/carla_settings_driver.ui
  3. +12
    -6
      source/backend/CarlaEngine.hpp
  4. +57
    -0
      source/backend/CarlaHost.h
  5. +56
    -0
      source/backend/CarlaStandalone.cpp
  6. +37
    -5
      source/backend/engine/CarlaEngine.cpp
  7. +0
    -1
      source/backend/engine/CarlaEngineInternal.cpp
  8. +0
    -1
      source/backend/engine/CarlaEngineInternal.hpp
  9. +24
    -0
      source/backend/engine/CarlaEngineJuce.cpp
  10. +98
    -10
      source/frontend/carla_backend.py
  11. +14
    -7
      source/frontend/carla_host.py
  12. +111
    -0
      source/frontend/carla_settings.py

+ 26
- 39
resources/ui/carla_host.ui View File

@@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1057</width>
<width>1045</width>
<height>716</height> <height>716</height>
</rect> </rect>
</property> </property>
@@ -335,8 +335,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1057</width>
<height>20</height>
<width>1045</width>
<height>31</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menu_File"> <widget class="QMenu" name="menu_File">
@@ -358,6 +358,9 @@
</property> </property>
<addaction name="act_engine_start"/> <addaction name="act_engine_start"/>
<addaction name="act_engine_stop"/> <addaction name="act_engine_stop"/>
<addaction name="act_engine_panic"/>
<addaction name="separator"/>
<addaction name="act_engine_config"/>
</widget> </widget>
<widget class="QMenu" name="menu_Plugin"> <widget class="QMenu" name="menu_Plugin">
<property name="title"> <property name="title">
@@ -462,10 +465,10 @@
<addaction name="act_file_connect"/> <addaction name="act_file_connect"/>
<addaction name="act_file_refresh"/> <addaction name="act_file_refresh"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="act_plugin_add2"/>
<addaction name="act_add_jack"/>
<addaction name="act_plugin_add"/>
<addaction name="act_plugin_add_jack"/>
<addaction name="act_plugin_remove_all"/> <addaction name="act_plugin_remove_all"/>
<addaction name="act_plugins_panic"/>
<addaction name="act_engine_panic"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="act_settings_configure"/> <addaction name="act_settings_configure"/>
</widget> </widget>
@@ -1051,21 +1054,6 @@
<string>Ctrl+A</string> <string>Ctrl+A</string>
</property> </property>
</action> </action>
<action name="act_plugin_add2">
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/16x16/list-add.svgz</normaloff>:/16x16/list-add.svgz</iconset>
</property>
<property name="text">
<string>Add Plugin...</string>
</property>
<property name="iconText">
<string>Add Plugin...</string>
</property>
<property name="toolTip">
<string>Add Plugin...</string>
</property>
</action>
<action name="act_plugin_remove_all"> <action name="act_plugin_remove_all">
<property name="icon"> <property name="icon">
<iconset resource="../resources.qrc"> <iconset resource="../resources.qrc">
@@ -1110,15 +1098,6 @@
<string>Center Balance</string> <string>Center Balance</string>
</property> </property>
</action> </action>
<action name="act_plugins_panic">
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/16x16/dialog-warning.svgz</normaloff>:/16x16/dialog-warning.svgz</iconset>
</property>
<property name="text">
<string>Panic</string>
</property>
</action>
<action name="act_transport_play"> <action name="act_transport_play">
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>
@@ -1380,28 +1359,36 @@
<string>Perform secret 5</string> <string>Perform secret 5</string>
</property> </property>
</action> </action>
<action name="act_add_jack">
<action name="act_plugin_add_jack">
<property name="icon"> <property name="icon">
<iconset resource="../resources.qrc"> <iconset resource="../resources.qrc">
<normaloff>:/16x16/list-add.svgz</normaloff>:/16x16/list-add.svgz</iconset> <normaloff>:/16x16/list-add.svgz</normaloff>:/16x16/list-add.svgz</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Add &amp;JACK Application</string>
<string>Add &amp;JACK Application...</string>
</property> </property>
<property name="iconText">
<string>Add JACK Application...</string>
</action>
<action name="act_engine_config">
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/16x16/configure.svgz</normaloff>:/16x16/configure.svgz</iconset>
</property> </property>
<property name="toolTip">
<string>Add JACK Application...</string>
<property name="text">
<string>&amp;Configure driver...</string>
</property> </property>
</action> </action>
<action name="act_plugin_add_jack">
<action name="act_engine_panic">
<property name="icon"> <property name="icon">
<iconset resource="../resources.qrc"> <iconset resource="../resources.qrc">
<normaloff>:/16x16/list-add.svgz</normaloff>:/16x16/list-add.svgz</iconset>
<normaloff>:/16x16/dialog-warning.svgz</normaloff>:/16x16/dialog-warning.svgz</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Add &amp;JACK Application...</string>
<string>Panic</string>
</property>
</action>
<action name="act_engine_panel">
<property name="text">
<string>Open custom driver panel...</string>
</property> </property>
</action> </action>
</widget> </widget>


+ 74
- 41
resources/ui/carla_settings_driver.ui View File

@@ -6,15 +6,15 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>320</width>
<height>205</height>
<width>403</width>
<height>264</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Driver Settings</string> <string>Driver Settings</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_device"> <widget class="QLabel" name="label_device">
<property name="text"> <property name="text">
<string>Device:</string> <string>Device:</string>
@@ -24,11 +24,11 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1">
<widget class="QComboBox" name="cb_device"/>
<item row="2" column="2">
<widget class="QComboBox" name="cb_samplerate"/>
</item> </item>
<item row="0" column="2">
<spacer name="horizontalSpacer">
<item row="3" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
@@ -37,72 +37,72 @@
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width>
<width>1</width>
<height>1</height> <height>1</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="2" column="1">
<widget class="QComboBox" name="cb_samplerate"/>
<item row="1" column="2">
<widget class="QComboBox" name="cb_buffersize"/>
</item> </item>
<item row="6" column="0" colspan="3">
<widget class="QDialogButtonBox" name="buttonBox">
<item row="0" column="2">
<widget class="QComboBox" name="cb_device"/>
</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"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>1</height>
</size>
</property> </property>
</widget>
</spacer>
</item> </item>
<item row="1" column="0">
<widget class="QLabel" name="label_buffersize">
<item row="2" column="0" colspan="2">
<widget class="QLabel" name="label_samplerate">
<property name="text"> <property name="text">
<string>Buffer size:</string>
<string>Sample rate:</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1">
<widget class="QComboBox" name="cb_buffersize"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_samplerate">
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="label_buffersize">
<property name="text"> <property name="text">
<string>Sample rate:</string>
<string>Buffer size:</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0">
<spacer name="horizontalSpacer_2">
<item row="4" column="4">
<spacer name="horizontalSpacer_6">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>1</width>
<height>1</height>
<width>40</width>
<height>20</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="3" column="1" colspan="2">
<widget class="QCheckBox" name="cb_triple_buffer">
<property name="text">
<string>Triple buffer</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="3">
<item row="5" column="0" colspan="5">
<layout class="QHBoxLayout" name="horizontalLayout_13"> <layout class="QHBoxLayout" name="horizontalLayout_13">
<item> <item>
<spacer name="horizontalSpacer_20"> <spacer name="horizontalSpacer_20">
@@ -118,7 +118,7 @@
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_22">
<widget class="QLabel" name="ico_restart">
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>22</width> <width>22</width>
@@ -140,7 +140,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_23">
<widget class="QLabel" name="label_restart">
<property name="text"> <property name="text">
<string>Restart the engine to load the new settings</string> <string>Restart the engine to load the new settings</string>
</property> </property>
@@ -161,6 +161,39 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="7" column="0" colspan="5">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="0" column="3" colspan="2">
<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>
<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>
</layout> </layout>
</widget> </widget>
<resources> <resources>


+ 12
- 6
source/backend/CarlaEngine.hpp View File

@@ -732,6 +732,12 @@ public:
*/ */
static const EngineDriverDeviceInfo* getDriverDeviceInfo(const uint index, const char* const driverName); static const EngineDriverDeviceInfo* getDriverDeviceInfo(const uint index, const char* const driverName);


/*!
* Show a device custom control panel.
* @see ENGINE_DRIVER_DEVICE_HAS_CONTROL_PANEL
*/
static bool showDriverDeviceControlPanel(const uint index, const char* const deviceName);

/*! /*!
* Create a new engine, using driver @a driverName. * Create a new engine, using driver @a driverName.
* Returned value must be deleted when no longer needed. * Returned value must be deleted when no longer needed.
@@ -831,6 +837,11 @@ public:
*/ */
virtual void clearXruns() const noexcept; virtual void clearXruns() const noexcept;


/*!
* Show the custom control panel for the current engine device.
*/
virtual bool showDeviceControlPanel() const noexcept;

// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Plugin management // Plugin management


@@ -949,12 +960,6 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Information (base) // Information (base)


/*!
* Get the current engine driver hints.
* @see EngineDriverHints
*/
uint getHints() const noexcept;

/*! /*!
* Get the current buffer size. * Get the current buffer size.
*/ */
@@ -1290,6 +1295,7 @@ public:
static const char* getJuceApiName(const uint index); static const char* getJuceApiName(const uint index);
static const char* const* getJuceApiDeviceNames(const uint index); static const char* const* getJuceApiDeviceNames(const uint index);
static const EngineDriverDeviceInfo* getJuceDeviceInfo(const uint index, const char* const deviceName); static const EngineDriverDeviceInfo* getJuceDeviceInfo(const uint index, const char* const deviceName);
static bool showJuceDeviceControlPanel(const uint index, const char* const deviceName);
# else # else
// RtAudio // RtAudio
static CarlaEngine* newRtAudio(const AudioApi api); static CarlaEngine* newRtAudio(const AudioApi api);


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

@@ -290,6 +290,45 @@ typedef struct _CarlaRuntimeEngineInfo {


} CarlaRuntimeEngineInfo; } CarlaRuntimeEngineInfo;


/*!
* Runtime engine driver device information.
*/
typedef struct {
/*!
* Name of the driver device.
*/
const char* name;

/*!
* This driver device hints.
* @see EngineDriverHints
*/
uint hints;

/*!
* Current buffer size.
*/
uint bufferSize;

/*!
* Available buffer sizes.
* Terminated with 0.
*/
const uint32_t* bufferSizes;

/*!
* Current sample rate.
*/
double sampleRate;

/*!
* Available sample rates.
* Terminated with 0.0.
*/
const double* sampleRates;

} CarlaRuntimeEngineDriverDeviceInfo;

/*! /*!
* Image data for LV2 inline display API. * Image data for LV2 inline display API.
* raw image pixmap format is ARGB32, * raw image pixmap format is ARGB32,
@@ -328,6 +367,14 @@ CARLA_EXPORT const char* const* carla_get_engine_driver_device_names(uint index)
*/ */
CARLA_EXPORT const EngineDriverDeviceInfo* carla_get_engine_driver_device_info(uint index, const char* name); CARLA_EXPORT const EngineDriverDeviceInfo* carla_get_engine_driver_device_info(uint index, const char* name);


/*!
* Show a device custom control panel.
* @see ENGINE_DRIVER_DEVICE_HAS_CONTROL_PANEL
* @param index Driver index
* @param name Device name
*/
CARLA_EXPORT bool carla_show_engine_driver_device_control_panel(uint index, const char* name);

#ifdef __cplusplus #ifdef __cplusplus
/*! /*!
* Get the currently used engine, may be NULL. * Get the currently used engine, may be NULL.
@@ -375,6 +422,16 @@ CARLA_EXPORT bool carla_is_engine_running();
*/ */
CARLA_EXPORT const CarlaRuntimeEngineInfo* carla_get_runtime_engine_info(); CARLA_EXPORT const CarlaRuntimeEngineInfo* carla_get_runtime_engine_info();


/*!
* Get information about the currently running engine driver device.
*/
CARLA_EXPORT const CarlaRuntimeEngineDriverDeviceInfo* carla_get_runtime_engine_driver_device_info();

/*!
* Show the custom control panel for the current engine device.
*/
CARLA_EXPORT bool carla_show_engine_device_control_panel();

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


+ 56
- 0
source/backend/CarlaStandalone.cpp View File

@@ -163,6 +163,11 @@ const EngineDriverDeviceInfo* carla_get_engine_driver_device_info(uint index, co
return &retDevInfo; return &retDevInfo;
} }


bool carla_show_engine_driver_device_control_panel(uint index, const char* name)
{
return CarlaEngine::showDriverDeviceControlPanel(index, name);
}

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


CarlaEngine* carla_get_engine() CarlaEngine* carla_get_engine()
@@ -493,6 +498,57 @@ const CarlaRuntimeEngineInfo* carla_get_runtime_engine_info()
return &retInfo; return &retInfo;
} }


const CarlaRuntimeEngineDriverDeviceInfo* carla_get_runtime_engine_driver_device_info()
{
static CarlaRuntimeEngineDriverDeviceInfo retInfo;

// reset
retInfo.name = gNullCharPtr;
retInfo.hints = 0x0;
retInfo.bufferSize = 0;
retInfo.bufferSizes = nullptr;
retInfo.sampleRate = 0.0;
retInfo.sampleRates = nullptr;

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

uint index = 0;
uint count = CarlaEngine::getDriverCount();
for (; index<count; ++index)
{
const char* const testDriverName = CarlaEngine::getDriverName(index);
CARLA_SAFE_ASSERT_CONTINUE(testDriverName != nullptr);

if (std::strcmp(testDriverName, audioDriver) == 0)
break;
}
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;
}

bool carla_show_engine_device_control_panel()
{
CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, false);
carla_debug("carla_show_engine_device_control_panel()");

return gStandalone.engine->showDeviceControlPanel();
}

void carla_clear_engine_xruns() void carla_clear_engine_xruns()
{ {
if (gStandalone.engine != nullptr) if (gStandalone.engine != nullptr)


+ 37
- 5
source/backend/engine/CarlaEngine.cpp View File

@@ -193,6 +193,38 @@ const EngineDriverDeviceInfo* CarlaEngine::getDriverDeviceInfo(const uint index2
return nullptr; return nullptr;
} }


bool CarlaEngine::showDriverDeviceControlPanel(const uint index2, const char* const deviceName)
{
carla_debug("CarlaEngine::showDriverDeviceControlPanel(%i, \"%s\")", index2, deviceName);

uint index = index2;

if (jackbridge_is_ok() && index-- == 0)
{
return false;
}

#ifndef BUILD_BRIDGE
# ifdef USING_JUCE
if (const uint count = getJuceApiCount())
{
if (index < count)
return showJuceDeviceControlPanel(index, deviceName);
index -= count;
}
# else
if (const uint count = getRtAudioApiCount())
{
if (index < count)
return false;
}
# endif
#endif

carla_stderr("CarlaEngine::showDriverDeviceControlPanel(%i, \"%s\") - invalid index", index2, deviceName);
return false;
}

CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName) CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName)
{ {
CARLA_SAFE_ASSERT_RETURN(driverName != nullptr && driverName[0] != '\0', nullptr); CARLA_SAFE_ASSERT_RETURN(driverName != nullptr && driverName[0] != '\0', nullptr);
@@ -373,6 +405,11 @@ void CarlaEngine::clearXruns() const noexcept
#endif #endif
} }


bool CarlaEngine::showDeviceControlPanel() const noexcept
{
return false;
}

// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Plugin management // Plugin management


@@ -1203,11 +1240,6 @@ void CarlaEngine::clearCurrentProjectFilename() noexcept
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Information (base) // Information (base)


uint CarlaEngine::getHints() const noexcept
{
return pData->hints;
}

uint32_t CarlaEngine::getBufferSize() const noexcept uint32_t CarlaEngine::getBufferSize() const noexcept
{ {
return pData->bufferSize; return pData->bufferSize;


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

@@ -379,7 +379,6 @@ CarlaEngine::ProtectedData::ProtectedData(CarlaEngine* const engine) noexcept
loadingProject(false), loadingProject(false),
currentProjectFilename(), currentProjectFilename(),
#endif #endif
hints(0x0),
bufferSize(0), bufferSize(0),
sampleRate(0.0), sampleRate(0.0),
aboutToClose(false), aboutToClose(false),


+ 0
- 1
source/backend/engine/CarlaEngineInternal.hpp View File

@@ -231,7 +231,6 @@ struct CarlaEngine::ProtectedData {
CarlaString currentProjectFilename; CarlaString currentProjectFilename;
#endif #endif


uint hints;
uint32_t bufferSize; uint32_t bufferSize;
double sampleRate; double sampleRate;




+ 24
- 0
source/backend/engine/CarlaEngineJuce.cpp View File

@@ -352,6 +352,13 @@ public:
pData->xruns = xruns > 0 ? static_cast<uint32_t>(xruns) : 0; pData->xruns = xruns > 0 ? static_cast<uint32_t>(xruns) : 0;
} }


bool showDeviceControlPanel() const noexcept override
{
try {
return fDevice->showControlPanel();
} CARLA_SAFE_EXCEPTION_RETURN("showDeviceControlPanel", false);
}

// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Patchbay // Patchbay


@@ -1010,6 +1017,23 @@ const EngineDriverDeviceInfo* CarlaEngine::getJuceDeviceInfo(const uint uindex,
return &devInfo; return &devInfo;
} }


bool CarlaEngine::showJuceDeviceControlPanel(const uint uindex, const char* const deviceName)
{
const int index(static_cast<int>(uindex));

CARLA_SAFE_ASSERT_RETURN(index < gDeviceTypes.size(), false);

juce::AudioIODeviceType* const deviceType(gDeviceTypes[index]);
CARLA_SAFE_ASSERT_RETURN(deviceType != nullptr, false);

deviceType->scanForDevices();

ScopedPointer<juce::AudioIODevice> device(deviceType->createDevice(deviceName, deviceName));
CARLA_SAFE_ASSERT_RETURN(device != nullptr, false);

return device->showControlPanel();
}

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


CARLA_BACKEND_END_NAMESPACE CARLA_BACKEND_END_NAMESPACE

+ 98
- 10
source/frontend/carla_backend.py View File

@@ -1291,6 +1291,31 @@ class CarlaRuntimeEngineInfo(Structure):
("xruns", c_uint32) ("xruns", c_uint32)
] ]


# Runtime engine driver device information.
class CarlaRuntimeEngineDriverDeviceInfo(Structure):
_fields_ = [
# Name of the driver device.
("name", c_char_p),

# This driver device hints.
# @see EngineDriverHints
("hints", c_uint),

# Current buffer size.
("bufferSize", c_uint32),

# Available buffer sizes.
# Terminated with 0.
("bufferSizes", POINTER(c_uint32)),

# Current sample rate.
("sampleRate", c_double),

# Available sample rates.
# Terminated with 0.0.
("sampleRates", POINTER(c_double))
]

# Image data for LV2 inline display API. # Image data for LV2 inline display API.
# raw image pixmap format is ARGB32, # raw image pixmap format is ARGB32,
class CarlaInlineDisplayImageSurface(Structure): class CarlaInlineDisplayImageSurface(Structure):
@@ -1342,18 +1367,28 @@ PyCarlaScalePointInfo = {


# @see CarlaTransportInfo # @see CarlaTransportInfo
PyCarlaTransportInfo = { PyCarlaTransportInfo = {
"playing": False,
"frame": 0,
"bar": 0,
"beat": 0,
"tick": 0,
"bpm": 0.0
'playing': False,
'frame': 0,
'bar': 0,
'beat': 0,
'tick': 0,
'bpm': 0.0
} }


# @see CarlaRuntimeEngineInfo # @see CarlaRuntimeEngineInfo
PyCarlaRuntimeEngineInfo = { PyCarlaRuntimeEngineInfo = {
"load": 0.0,
"xruns": 0
'load': 0.0,
'xruns': 0
}

# @see CarlaRuntimeEngineDriverDeviceInfo
PyCarlaRuntimeEngineDriverDeviceInfo = {
'name': "",
'hints': 0x0,
'bufferSize': 0,
'bufferSizes': [],
'sampleRate': 0.0,
'sampleRates': []
} }


# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
@@ -1429,6 +1464,14 @@ class CarlaHostMeta(object):
def get_engine_driver_device_info(self, index, name): def get_engine_driver_device_info(self, index, name):
raise NotImplementedError raise NotImplementedError


# Show a device custom control panel.
# @see ENGINE_DRIVER_DEVICE_HAS_CONTROL_PANEL
# @param index Driver index
# @param name Device name
@abstractmethod
def show_engine_driver_device_control_panel(self, index, name):
raise NotImplementedError

# Initialize the engine. # Initialize the engine.
# Make sure to call carla_engine_idle() at regular intervals afterwards. # Make sure to call carla_engine_idle() at regular intervals afterwards.
# @param driverName Driver to use # @param driverName Driver to use
@@ -1460,6 +1503,15 @@ class CarlaHostMeta(object):
def get_runtime_engine_info(self): def get_runtime_engine_info(self):
raise NotImplementedError raise NotImplementedError


# Get information about the currently running engine driver device.
@abstractmethod
def get_runtime_engine_driver_device_info(self):
raise NotImplementedError

# Show the custom control panel for the current engine device.
def show_engine_device_control_panel(self):
raise NotImplementedError

# Clear the xrun count on the engine, so that the next time carla_get_runtime_engine_info() is called, it returns 0. # Clear the xrun count on the engine, so that the next time carla_get_runtime_engine_info() is called, it returns 0.
@abstractmethod @abstractmethod
def clear_engine_xruns(self): def clear_engine_xruns(self):
@@ -2083,6 +2135,9 @@ class CarlaHostNull(CarlaHostMeta):
def get_engine_driver_device_info(self, index, name): def get_engine_driver_device_info(self, index, name):
return PyEngineDriverDeviceInfo return PyEngineDriverDeviceInfo


def show_engine_driver_device_control_panel(self, index, name):
return False

def engine_init(self, driverName, clientName): def engine_init(self, driverName, clientName):
self.fEngineRunning = True self.fEngineRunning = True
if self.fEngineCallback is not None: if self.fEngineCallback is not None:
@@ -2110,6 +2165,12 @@ class CarlaHostNull(CarlaHostMeta):
def get_runtime_engine_info(self): def get_runtime_engine_info(self):
return PyCarlaRuntimeEngineInfo return PyCarlaRuntimeEngineInfo


def get_runtime_engine_driver_device_info(self):
return PyCarlaRuntimeEngineDriverDeviceInfo

def show_engine_device_control_panel(self):
return False

def clear_engine_xruns(self): def clear_engine_xruns(self):
return return


@@ -2395,6 +2456,9 @@ class CarlaHostDLL(CarlaHostMeta):
self.lib.carla_get_engine_driver_device_info.argtypes = [c_uint, c_char_p] self.lib.carla_get_engine_driver_device_info.argtypes = [c_uint, c_char_p]
self.lib.carla_get_engine_driver_device_info.restype = POINTER(EngineDriverDeviceInfo) self.lib.carla_get_engine_driver_device_info.restype = POINTER(EngineDriverDeviceInfo)


self.lib.carla_show_engine_driver_device_control_panel.argtypes = [c_uint, c_char_p]
self.lib.carla_show_engine_driver_device_control_panel.restype = c_bool

self.lib.carla_engine_init.argtypes = [c_char_p, c_char_p] self.lib.carla_engine_init.argtypes = [c_char_p, c_char_p]
self.lib.carla_engine_init.restype = c_bool self.lib.carla_engine_init.restype = c_bool


@@ -2410,6 +2474,12 @@ class CarlaHostDLL(CarlaHostMeta):
self.lib.carla_get_runtime_engine_info.argtypes = None self.lib.carla_get_runtime_engine_info.argtypes = None
self.lib.carla_get_runtime_engine_info.restype = POINTER(CarlaRuntimeEngineInfo) self.lib.carla_get_runtime_engine_info.restype = POINTER(CarlaRuntimeEngineInfo)


self.lib.carla_get_runtime_engine_driver_device_info.argtypes = None
self.lib.carla_get_runtime_engine_driver_device_info.restype = POINTER(CarlaRuntimeEngineDriverDeviceInfo)

self.lib.carla_show_engine_device_control_panel.argtypes = None
self.lib.carla_show_engine_device_control_panel.restype = c_bool

self.lib.carla_clear_engine_xruns.argtypes = None self.lib.carla_clear_engine_xruns.argtypes = None
self.lib.carla_clear_engine_xruns.restype = None self.lib.carla_clear_engine_xruns.restype = None


@@ -2685,6 +2755,9 @@ class CarlaHostDLL(CarlaHostMeta):
def get_engine_driver_device_info(self, index, name): def get_engine_driver_device_info(self, index, name):
return structToDict(self.lib.carla_get_engine_driver_device_info(index, name.encode("utf-8")).contents) return structToDict(self.lib.carla_get_engine_driver_device_info(index, name.encode("utf-8")).contents)


def show_engine_driver_device_control_panel(self, index, name):
return bool(self.lib.carla_show_engine_driver_device_control_panel(index, name.encode("utf-8")))

def engine_init(self, driverName, clientName): def engine_init(self, driverName, clientName):
return bool(self.lib.carla_engine_init(driverName.encode("utf-8"), clientName.encode("utf-8"))) return bool(self.lib.carla_engine_init(driverName.encode("utf-8"), clientName.encode("utf-8")))


@@ -2700,11 +2773,17 @@ class CarlaHostDLL(CarlaHostMeta):
def get_runtime_engine_info(self): def get_runtime_engine_info(self):
return structToDict(self.lib.carla_get_runtime_engine_info().contents) return structToDict(self.lib.carla_get_runtime_engine_info().contents)


def get_runtime_engine_driver_device_info(self):
return structToDict(self.lib.carla_get_runtime_engine_driver_device_info().contents)

def show_engine_device_control_panel(self):
return bool(self.lib.carla_show_engine_device_control_panel())

def clear_engine_xruns(self): def clear_engine_xruns(self):
return self.lib.carla_clear_engine_xruns()
self.lib.carla_clear_engine_xruns()


def cancel_engine_action(self): def cancel_engine_action(self):
return self.lib.carla_cancel_engine_action()
self.lib.carla_cancel_engine_action()


def set_engine_about_to_close(self): def set_engine_about_to_close(self):
return bool(self.lib.carla_set_engine_about_to_close()) return bool(self.lib.carla_set_engine_about_to_close())
@@ -3078,9 +3157,18 @@ class CarlaHostPlugin(CarlaHostMeta):
def get_engine_driver_device_info(self, index, name): def get_engine_driver_device_info(self, index, name):
return PyEngineDriverDeviceInfo return PyEngineDriverDeviceInfo


def show_engine_driver_device_control_panel(self, index, name):
return False

def get_runtime_engine_info(self): def get_runtime_engine_info(self):
return self.fRuntimeEngineInfo return self.fRuntimeEngineInfo


def get_runtime_engine_driver_device_info(self):
return PyCarlaRuntimeEngineDriverDeviceInfo

def show_engine_device_control_panel(self):
return False

def clear_engine_xruns(self): def clear_engine_xruns(self):
self.sendMsg(["clear_engine_xruns"]) self.sendMsg(["clear_engine_xruns"])




+ 14
- 7
source/frontend/carla_host.py View File

@@ -423,13 +423,12 @@ class HostWindow(QMainWindow):


self.ui.act_engine_start.triggered.connect(self.slot_engineStart) self.ui.act_engine_start.triggered.connect(self.slot_engineStart)
self.ui.act_engine_stop.triggered.connect(self.slot_engineStop) self.ui.act_engine_stop.triggered.connect(self.slot_engineStop)
self.ui.act_engine_panic.triggered.connect(self.slot_pluginsDisable)
self.ui.act_engine_config.triggered.connect(self.slot_engineConfig)


self.ui.act_plugin_add.triggered.connect(self.slot_pluginAdd) self.ui.act_plugin_add.triggered.connect(self.slot_pluginAdd)
self.ui.act_plugin_add2.triggered.connect(self.slot_pluginAdd)
self.ui.act_plugin_remove_all.triggered.connect(self.slot_confirmRemoveAll)

self.ui.act_add_jack.triggered.connect(self.slot_jackAppAdd)
self.ui.act_plugin_add_jack.triggered.connect(self.slot_jackAppAdd) self.ui.act_plugin_add_jack.triggered.connect(self.slot_jackAppAdd)
self.ui.act_plugin_remove_all.triggered.connect(self.slot_confirmRemoveAll)


self.ui.act_plugins_enable.triggered.connect(self.slot_pluginsEnable) self.ui.act_plugins_enable.triggered.connect(self.slot_pluginsEnable)
self.ui.act_plugins_disable.triggered.connect(self.slot_pluginsDisable) self.ui.act_plugins_disable.triggered.connect(self.slot_pluginsDisable)
@@ -440,7 +439,6 @@ class HostWindow(QMainWindow):
self.ui.act_plugins_center.triggered.connect(self.slot_pluginsCenter) self.ui.act_plugins_center.triggered.connect(self.slot_pluginsCenter)
self.ui.act_plugins_compact.triggered.connect(self.slot_pluginsCompact) self.ui.act_plugins_compact.triggered.connect(self.slot_pluginsCompact)
self.ui.act_plugins_expand.triggered.connect(self.slot_pluginsExpand) self.ui.act_plugins_expand.triggered.connect(self.slot_pluginsExpand)
self.ui.act_plugins_panic.triggered.connect(self.slot_pluginsDisable)


self.ui.act_settings_show_toolbar.toggled.connect(self.slot_showToolbar) self.ui.act_settings_show_toolbar.toggled.connect(self.slot_showToolbar)
self.ui.act_settings_show_meters.toggled.connect(self.slot_showCanvasMeters) self.ui.act_settings_show_meters.toggled.connect(self.slot_showCanvasMeters)
@@ -868,6 +866,17 @@ class HostWindow(QMainWindow):


return self.slot_engineStopTryAgain() return self.slot_engineStopTryAgain()


@pyqtSlot()
def slot_engineConfig(self):
dialog = RuntimeDriverSettingsW(self.fParentOrSelf, self.host)

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

@pyqtSlot() @pyqtSlot()
def slot_engineStopTryAgain(self): def slot_engineStopTryAgain(self):
if self.host.is_engine_running() and not self.host.set_engine_about_to_close(): if self.host.is_engine_running() and not self.host.set_engine_about_to_close():
@@ -1746,10 +1755,8 @@ class HostWindow(QMainWindow):


if self.host.experimental: if self.host.experimental:
visible = settings2.value(CARLA_KEY_EXPERIMENTAL_JACK_APPS, CARLA_DEFAULT_EXPERIMENTAL_JACK_APPS, type=bool) visible = settings2.value(CARLA_KEY_EXPERIMENTAL_JACK_APPS, CARLA_DEFAULT_EXPERIMENTAL_JACK_APPS, type=bool)
self.ui.act_add_jack.setVisible(visible)
self.ui.act_plugin_add_jack.setVisible(visible) self.ui.act_plugin_add_jack.setVisible(visible)
else: else:
self.ui.act_add_jack.setVisible(False)
self.ui.act_plugin_add_jack.setVisible(False) self.ui.act_plugin_add_jack.setVisible(False)


self.fMiniCanvasUpdateTimeout = 1000 if self.fSavedSettings[CARLA_KEY_CANVAS_FANCY_EYE_CANDY] else 0 self.fMiniCanvasUpdateTimeout = 1000 if self.fSavedSettings[CARLA_KEY_CANVAS_FANCY_EYE_CANDY] else 0


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

@@ -82,6 +82,7 @@ class DriverSettingsW(QDialog):
# Set-up connections # Set-up connections


self.accepted.connect(self.slot_saveSettings) self.accepted.connect(self.slot_saveSettings)
self.ui.b_panel.clicked.connect(self.slot_showDevicePanel)
self.ui.cb_device.currentIndexChanged.connect(self.slot_updateDeviceInfo) self.ui.cb_device.currentIndexChanged.connect(self.slot_updateDeviceInfo)


# ---------------------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------
@@ -139,6 +140,10 @@ class DriverSettingsW(QDialog):


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


@pyqtSlot()
def slot_showDevicePanel(self):
self.host.show_engine_driver_device_control_panel(self.fDriverIndex, self.ui.cb_device.currentText())

@pyqtSlot() @pyqtSlot()
def slot_updateDeviceInfo(self): def slot_updateDeviceInfo(self):
deviceName = self.ui.cb_device.currentText() deviceName = self.ui.cb_device.currentText()
@@ -159,6 +164,11 @@ class DriverSettingsW(QDialog):
else: else:
self.ui.cb_triple_buffer.setEnabled(False) self.ui.cb_triple_buffer.setEnabled(False)


if driverDeviceHints & ENGINE_DRIVER_DEVICE_HAS_CONTROL_PANEL:
self.ui.b_panel.setEnabled(True)
else:
self.ui.b_panel.setEnabled(False)

if len(self.fBufferSizes) > 0: if len(self.fBufferSizes) > 0:
for bsize in self.fBufferSizes: for bsize in self.fBufferSizes:
sbsize = str(bsize) sbsize = str(bsize)
@@ -189,6 +199,107 @@ class DriverSettingsW(QDialog):
QDialog.done(self, r) QDialog.done(self, r)
self.close() self.close()


# ------------------------------------------------------------------------------------------------------------
# Runtime Driver Settings

class RuntimeDriverSettingsW(QDialog):
def __init__(self, parent, host):
QDialog.__init__(self, parent)
self.host = host
self.ui = ui_carla_settings_driver.Ui_DriverSettingsW()
self.ui.setupUi(self)

if False:
# kdevelop likes this :)
host = CarlaHostNull()
self.host = host

driverDeviceInfo = host.get_runtime_engine_driver_device_info()

# ----------------------------------------------------------------------------------------------------
# Set-up GUI

self.ui.cb_device.setEnabled(False)
self.ui.cb_device.clear()
self.ui.cb_buffersize.clear()
self.ui.cb_samplerate.clear()
self.ui.cb_triple_buffer.hide()
self.ui.ico_restart.hide()
self.ui.label_restart.hide()

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 len(driverDeviceInfo['bufferSizes']) > 0:
for bsize in driverDeviceInfo['bufferSizes']:
sbsize = str(bsize)
self.ui.cb_buffersize.addItem(sbsize)

if driverDeviceInfo['bufferSize'] == bsize:
self.ui.cb_buffersize.setCurrentIndex(self.ui.cb_buffersize.count()-1)

else:
self.ui.cb_buffersize.addItem(DriverSettingsW.AUTOMATIC_OPTION)
self.ui.cb_buffersize.setCurrentIndex(0)

if (driverDeviceInfo['hints'] & ENGINE_DRIVER_DEVICE_VARIABLE_BUFFER_SIZE) == 0x0:
self.ui.cb_buffersize.setEnabled(False)

if len(driverDeviceInfo['sampleRates']) > 0:
for srate in driverDeviceInfo['sampleRates']:
ssrate = str(int(srate))
self.ui.cb_samplerate.addItem(ssrate)

if driverDeviceInfo['sampleRate'] == srate:
self.ui.cb_samplerate.setCurrentIndex(self.ui.cb_samplerate.count()-1)

else:
self.ui.cb_samplerate.addItem(DriverSettingsW.AUTOMATIC_OPTION)
self.ui.cb_samplerate.setCurrentIndex(0)

if (driverDeviceInfo['hints'] & ENGINE_DRIVER_DEVICE_VARIABLE_SAMPLE_RATE) == 0x0:
self.ui.cb_samplerate.setEnabled(False)

if (driverDeviceInfo['hints'] & ENGINE_DRIVER_DEVICE_HAS_CONTROL_PANEL) == 0x0:
self.ui.b_panel.setEnabled(False)

# ----------------------------------------------------------------------------------------------------
# Set-up connections

self.ui.b_panel.clicked.connect(self.slot_showDevicePanel)

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

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

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

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

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

@pyqtSlot()
def slot_showDevicePanel(self):
self.host.show_engine_device_control_panel()

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

def done(self, r):
QDialog.done(self, r)
self.close()

# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
# Settings Dialog # Settings Dialog




Loading…
Cancel
Save