@@ -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 &JACK Application</string> | |||||
<string>Add &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>&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 &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> | ||||
@@ -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> | ||||
@@ -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); | ||||
@@ -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. | ||||
*/ | */ | ||||
@@ -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) | ||||
@@ -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; | ||||
@@ -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), | ||||
@@ -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; | ||||
@@ -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 |
@@ -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"]) | ||||
@@ -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 | ||||
@@ -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 | ||||