@@ -34,17 +34,88 @@ try: | |||
except: | |||
haveDBus = False | |||
havePulseAudio = os.path.exists("/usr/bin/pulseaudio") | |||
# --------------------------------------------------------------------- | |||
def get_architecture(): | |||
# FIXME - more checks | |||
if sys.int_info[1] == 4: | |||
return "64-bit" | |||
return "32-bit" | |||
DEFAULT_LADSPA_PATH = [ | |||
os.path.join(HOME, ".ladspa"), | |||
os.path.join("/", "usr", "lib", "ladspa"), | |||
os.path.join("/", "usr", "local", "lib", "ladspa") | |||
] | |||
DEFAULT_DSSI_PATH = [ | |||
os.path.join(HOME, ".dssi"), | |||
os.path.join("/", "usr", "lib", "dssi"), | |||
os.path.join("/", "usr", "local", "lib", "dssi") | |||
] | |||
DEFAULT_LV2_PATH = [ | |||
os.path.join(HOME, ".lv2"), | |||
os.path.join("/", "usr", "lib", "lv2"), | |||
os.path.join("/", "usr", "local", "lib", "lv2") | |||
] | |||
DEFAULT_VST_PATH = [ | |||
os.path.join(HOME, ".vst"), | |||
os.path.join("/", "usr", "lib", "vst"), | |||
os.path.join("/", "usr", "local", "lib", "vst") | |||
] | |||
DESKTOP_X_IMAGE = [ | |||
"eog.desktop", | |||
"kde4/digikam.desktop", | |||
"kde4/gwenview.desktop" | |||
] | |||
DESKTOP_X_MUSIC = [ | |||
"audacious.desktop", | |||
"clementine.desktop", | |||
"smplayer.desktop", | |||
"vlc.desktop", | |||
"kde4/amarok.desktop" | |||
] | |||
DESKTOP_X_VIDEO = [ | |||
"smplayer.desktop", | |||
"vlc.desktop" | |||
] | |||
DESKTOP_X_TEXT = [ | |||
"gedit.desktop", | |||
"kde4/kate.desktop", | |||
"kde4/kwrite.desktop" | |||
] | |||
DESKTOP_X_BROWSER = [ | |||
"chrome.desktop", | |||
"firefox.desktop", | |||
"kde4/konqbrowser.desktop" | |||
] | |||
XDG_APPLICATIONS_PATH = [ | |||
"/usr/share/applications", | |||
"/usr/local/share/applications" | |||
] | |||
WINEASIO_PREFIX = "HKEY_CURRENT_USER\Software\Wine\WineASIO" | |||
# Global Settings | |||
GlobalSettings = QSettings("Cadence", "GlobalSettings") | |||
def get_linux_distro(): | |||
distro = "" | |||
# --------------------------------------------------------------------- | |||
def get_architecture(): | |||
if LINUX: | |||
return os.uname()[4] | |||
elif WINDOWS: | |||
if sys.platform == "win32": | |||
return "32-bit" | |||
if sys.platform == "win64": | |||
return "64-bit" | |||
return "Unknown" | |||
def get_linux_information(): | |||
if os.path.exists("/etc/lsb-release"): | |||
distro = getoutput(". /etc/lsb-release && echo $DISTRIB_DESCRIPTION") | |||
elif os.path.exists("/etc/arch-release"): | |||
@@ -52,10 +123,13 @@ def get_linux_distro(): | |||
else: | |||
distro = os.uname()[0] | |||
return distro | |||
kernel = os.uname()[2] | |||
def get_linux_kernel(): | |||
return os.uname()[2] | |||
return (distro, kernel) | |||
def get_mac_information(): | |||
# TODO | |||
return ("Mac OS", "Unknown") | |||
def get_windows_information(): | |||
major = sys.getwindowsversion()[0] | |||
@@ -100,25 +174,6 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
# TODO | |||
self.b_jack_restart.setEnabled(False) | |||
# ------------------------------------------------------------- | |||
# System Information | |||
if WINDOWS: | |||
info = get_windows_information() | |||
self.label_info_os.setText(info[0]) | |||
self.label_info_version.setText(info[1]) | |||
elif MACOS: | |||
self.label_info_os.setText("Mac OS") | |||
self.label_info_version.setText("Unknown") | |||
elif LINUX: | |||
self.label_info_os.setText(get_linux_distro()) | |||
self.label_info_version.setText(get_linux_kernel()) | |||
else: | |||
self.label_info_os.setText("Unknown") | |||
self.label_info_version.setText("Unknown") | |||
self.label_info_arch.setText(get_architecture()) | |||
# ------------------------------------------------------------- | |||
# Set-up icons | |||
@@ -132,6 +187,85 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
#self.act_pulse_start.setIcon(getIcon("media-playback-start")) | |||
#self.act_pulse_stop.setIcon(getIcon("media-playback-stop")) | |||
# ------------------------------------------------------------- | |||
# Set-up GUI (System Information) | |||
if LINUX: | |||
info = get_linux_information() | |||
elif MACOS: | |||
info = get_mac_information() | |||
elif WINDOWS: | |||
info = get_windows_information() | |||
else: | |||
info = ("Unknown", "Unknown") | |||
self.label_info_os.setText(info[0]) | |||
self.label_info_version.setText(info[1]) | |||
self.label_info_arch.setText(get_architecture()) | |||
# ------------------------------------------------------------- | |||
# Set-up GUI (Tweaks) | |||
self.settings_changed_types = [] | |||
self.frame_tweaks_settings.setVisible(False) | |||
for i in range(self.tw_tweaks.rowCount()): | |||
self.tw_tweaks.item(0, i).setTextAlignment(Qt.AlignCenter) | |||
self.tw_tweaks.setCurrentCell(0, 0) | |||
# Audio Plugins PATH | |||
self.b_tweak_plugins_change.setEnabled(False) | |||
self.b_tweak_plugins_remove.setEnabled(False) | |||
for iPath in DEFAULT_LADSPA_PATH: | |||
self.list_LADSPA.addItem(iPath) | |||
for iPath in DEFAULT_DSSI_PATH: | |||
self.list_DSSI.addItem(iPath) | |||
for iPath in DEFAULT_LV2_PATH: | |||
self.list_LV2.addItem(iPath) | |||
for iPath in DEFAULT_VST_PATH: | |||
self.list_VST.addItem(iPath) | |||
EXTRA_LADSPA_DIRS = GlobalSettings.value("AudioPlugins/EXTRA_LADSPA_PATH", "", type=str) | |||
EXTRA_DSSI_DIRS = GlobalSettings.value("AudioPlugins/EXTRA_DSSI_PATH", "", type=str) | |||
EXTRA_LV2_DIRS = GlobalSettings.value("AudioPlugins/EXTRA_LV2_PATH", "", type=str) | |||
EXTRA_VST_DIRS = GlobalSettings.value("AudioPlugins/EXTRA_VST_PATH", "", type=str) | |||
for iPath in EXTRA_LADSPA_DIRS.split(":"): | |||
if os.path.exists(iPath): | |||
self.list_LADSPA.addItem(iPath) | |||
for iPath in EXTRA_DSSI_DIRS.split(":"): | |||
if os.path.exists(iPath): | |||
self.list_DSSI.addItem(iPath) | |||
for iPath in EXTRA_LV2_DIRS.split(":"): | |||
if os.path.exists(iPath): | |||
self.list_LV2.addItem(iPath) | |||
for iPath in EXTRA_VST_DIRS.split(":"): | |||
if os.path.exists(iPath): | |||
self.list_VST.addItem(iPath) | |||
self.list_LADSPA.sortItems(Qt.AscendingOrder) | |||
self.list_DSSI.sortItems(Qt.AscendingOrder) | |||
self.list_LV2.sortItems(Qt.AscendingOrder) | |||
self.list_VST.sortItems(Qt.AscendingOrder) | |||
self.list_LADSPA.setCurrentRow(0) | |||
self.list_DSSI.setCurrentRow(0) | |||
self.list_LV2.setCurrentRow(0) | |||
self.list_VST.setCurrentRow(0) | |||
# Default Applications | |||
# WineASIO | |||
# ------------------------------------------------------------- | |||
# Set-up systray | |||
@@ -162,6 +296,20 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.connect(self.pic_render, SIGNAL("clicked()"), lambda tool="cadence_render": self.func_start_tool(tool)) | |||
self.connect(self.pic_xycontroller, SIGNAL("clicked()"), lambda tool="cadence_xycontroller": self.func_start_tool(tool)) | |||
self.connect(self.b_tweaks_apply_now, SIGNAL("clicked()"), SLOT("slot_tweaksApply()")) | |||
self.connect(self.b_tweak_plugins_add, SIGNAL("clicked()"), SLOT("slot_tweakPluginAdd()")) | |||
self.connect(self.b_tweak_plugins_change, SIGNAL("clicked()"), SLOT("slot_tweakPluginChange()")) | |||
self.connect(self.b_tweak_plugins_remove, SIGNAL("clicked()"), SLOT("slot_tweakPluginRemove()")) | |||
self.connect(self.b_tweak_plugins_reset, SIGNAL("clicked()"), SLOT("slot_tweakPluginReset()")) | |||
self.connect(self.tb_tweak_plugins, SIGNAL("currentChanged(int)"), SLOT("slot_tweakPluginTypeChanged(int)")) | |||
self.connect(self.list_LADSPA, SIGNAL("currentRowChanged(int)"), SLOT("slot_tweakPluginsLadspaRowChanged(int)")) | |||
self.connect(self.list_DSSI, SIGNAL("currentRowChanged(int)"), SLOT("slot_tweakPluginsDssiRowChanged(int)")) | |||
self.connect(self.list_LV2, SIGNAL("currentRowChanged(int)"), SLOT("slot_tweakPluginsLv2RowChanged(int)")) | |||
self.connect(self.list_VST, SIGNAL("currentRowChanged(int)"), SLOT("slot_tweakPluginsVstRowChanged(int)")) | |||
# ------------------------------------------------------------- | |||
self.m_last_dsp_load = None | |||
self.m_last_xruns = None | |||
self.m_last_buffer_size = None | |||
@@ -276,6 +424,11 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
def func_start_tool(self, tool): | |||
os.system("%s &" % tool) | |||
def func_settings_changed(self, stype): | |||
if stype not in self.settings_changed_types: | |||
self.settings_changed_types.append(stype) | |||
self.frame_tweaks_settings.setVisible(True) | |||
@pyqtSlot() | |||
def slot_JackServerStart(self): | |||
try: | |||
@@ -296,7 +449,9 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
@pyqtSlot() | |||
def slot_JackServerConfigure(self): | |||
jacksettings.JackSettingsW(self).exec_() | |||
jacksettingsW = jacksettings.JackSettingsW(self) | |||
jacksettingsW.exec_() | |||
del jacksettingsW | |||
@pyqtSlot() | |||
def slot_JackClearXruns(self): | |||
@@ -311,6 +466,169 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
def slot_handleCrash_jack(self): | |||
self.DBusReconnect() | |||
@pyqtSlot() | |||
def slot_tweaksApply(self): | |||
if "plugins" in self.settings_changed_types: | |||
EXTRA_LADSPA_DIRS = [] | |||
EXTRA_DSSI_DIRS = [] | |||
EXTRA_LV2_DIRS = [] | |||
EXTRA_VST_DIRS = [] | |||
for i in range(self.list_LADSPA.count()): | |||
iPath = self.list_LADSPA.item(i).text() | |||
if iPath not in DEFAULT_LADSPA_PATH and iPath not in EXTRA_LADSPA_DIRS: | |||
EXTRA_LADSPA_DIRS.append(iPath) | |||
for i in range(self.list_DSSI.count()): | |||
iPath = self.list_DSSI.item(i).text() | |||
if iPath not in DEFAULT_DSSI_PATH and iPath not in EXTRA_DSSI_DIRS: | |||
EXTRA_DSSI_DIRS.append(iPath) | |||
for i in range(self.list_LV2.count()): | |||
iPath = self.list_LV2.item(i).text() | |||
if iPath not in DEFAULT_LV2_PATH and iPath not in EXTRA_LV2_DIRS: | |||
EXTRA_LV2_DIRS.append(iPath) | |||
for i in range(self.list_VST.count()): | |||
iPath = self.list_VST.item(i).text() | |||
if iPath not in DEFAULT_VST_PATH and iPath not in EXTRA_VST_DIRS: | |||
EXTRA_VST_DIRS.append(iPath) | |||
GlobalSettings.setValue("AudioPlugins/EXTRA_LADSPA_PATH", ":".join(EXTRA_LADSPA_DIRS)) | |||
GlobalSettings.setValue("AudioPlugins/EXTRA_DSSI_PATH", ":".join(EXTRA_DSSI_DIRS)) | |||
GlobalSettings.setValue("AudioPlugins/EXTRA_LV2_PATH", ":".join(EXTRA_LV2_DIRS)) | |||
GlobalSettings.setValue("AudioPlugins/EXTRA_VST_PATH", ":".join(EXTRA_VST_DIRS)) | |||
self.settings_changed_types = [] | |||
self.frame_tweaks_settings.setVisible(False) | |||
@pyqtSlot() | |||
def slot_tweakPluginAdd(self): | |||
newPath = QFileDialog.getExistingDirectory(self, self.tr("Add Path"), "", QFileDialog.ShowDirsOnly) | |||
if not newPath: | |||
return | |||
if self.tb_tweak_plugins.currentIndex() == 0: | |||
self.list_LADSPA.addItem(newPath) | |||
elif self.tb_tweak_plugins.currentIndex() == 1: | |||
self.list_DSSI.addItem(newPath) | |||
elif self.tb_tweak_plugins.currentIndex() == 2: | |||
self.list_LV2.addItem(newPath) | |||
elif self.tb_tweak_plugins.currentIndex() == 3: | |||
self.list_VST.addItem(newPath) | |||
self.func_settings_changed("plugins") | |||
@pyqtSlot() | |||
def slot_tweakPluginChange(self): | |||
if self.tb_tweak_plugins.currentIndex() == 0: | |||
curPath = self.list_LADSPA.item(self.list_LADSPA.currentRow()).text() | |||
elif self.tb_tweak_plugins.currentIndex() == 1: | |||
curPath = self.list_DSSI.item(self.list_DSSI.currentRow()).text() | |||
elif self.tb_tweak_plugins.currentIndex() == 2: | |||
curPath = self.list_LV2.item(self.list_LV2.currentRow()).text() | |||
elif self.tb_tweak_plugins.currentIndex() == 3: | |||
curPath = self.list_VST.item(self.list_VST.currentRow()).text() | |||
else: | |||
curPath = "" | |||
newPath = QFileDialog.getExistingDirectory(self, self.tr("Change Path"), curPath, QFileDialog.ShowDirsOnly) | |||
if not newPath: | |||
return | |||
if self.tb_tweak_plugins.currentIndex() == 0: | |||
self.list_LADSPA.item(self.list_LADSPA.currentRow()).setText(newPath) | |||
elif self.tb_tweak_plugins.currentIndex() == 1: | |||
self.list_DSSI.item(self.list_DSSI.currentRow()).setText(newPath) | |||
elif self.tb_tweak_plugins.currentIndex() == 2: | |||
self.list_LV2.item(self.list_LV2.currentRow()).setText(newPath) | |||
elif self.tb_tweak_plugins.currentIndex() == 3: | |||
self.list_VST.item(self.list_VST.currentRow()).setText(newPath) | |||
self.func_settings_changed("plugins") | |||
@pyqtSlot() | |||
def slot_tweakPluginRemove(self): | |||
if self.tb_tweak_plugins.currentIndex() == 0: | |||
self.list_LADSPA.takeItem(self.list_LADSPA.currentRow()) | |||
elif self.tb_tweak_plugins.currentIndex() == 1: | |||
self.list_DSSI.takeItem(self.list_DSSI.currentRow()) | |||
elif self.tb_tweak_plugins.currentIndex() == 2: | |||
self.list_LV2.takeItem(self.list_LV2.currentRow()) | |||
elif self.tb_tweak_plugins.currentIndex() == 3: | |||
self.list_VST.takeItem(self.list_VST.currentRow()) | |||
self.func_settings_changed("plugins") | |||
@pyqtSlot() | |||
def slot_tweakPluginReset(self): | |||
if self.tb_tweak_plugins.currentIndex() == 0: | |||
self.list_LADSPA.clear() | |||
for iPath in DEFAULT_LADSPA_PATH: | |||
self.list_LADSPA.addItem(iPath) | |||
elif self.tb_tweak_plugins.currentIndex() == 1: | |||
self.list_DSSI.clear() | |||
for iPath in DEFAULT_DSSI_PATH: | |||
self.list_DSSI.addItem(iPath) | |||
elif self.tb_tweak_plugins.currentIndex() == 2: | |||
self.list_LV2.clear() | |||
for iPath in DEFAULT_LV2_PATH: | |||
self.list_LV2.addItem(iPath) | |||
elif self.tb_tweak_plugins.currentIndex() == 3: | |||
self.list_VST.clear() | |||
for iPath in DEFAULT_VST_PATH: | |||
self.list_VST.addItem(iPath) | |||
self.func_settings_changed("plugins") | |||
@pyqtSlot(int) | |||
def slot_tweakPluginTypeChanged(self, index): | |||
if index == 0: | |||
self.list_LADSPA.setCurrentRow(-1) | |||
self.list_LADSPA.setCurrentRow(0) | |||
elif index == 1: | |||
self.list_DSSI.setCurrentRow(-1) | |||
self.list_DSSI.setCurrentRow(0) | |||
elif index == 2: | |||
self.list_LV2.setCurrentRow(-1) | |||
self.list_LV2.setCurrentRow(0) | |||
elif index == 3: | |||
self.list_VST.setCurrentRow(-1) | |||
self.list_VST.setCurrentRow(0) | |||
@pyqtSlot(int) | |||
def slot_tweakPluginsLadspaRowChanged(self, index): | |||
nonRemovable = (index >= 0 and self.list_LADSPA.item(index).text() not in DEFAULT_LADSPA_PATH) | |||
self.b_tweak_plugins_change.setEnabled(nonRemovable) | |||
self.b_tweak_plugins_remove.setEnabled(nonRemovable) | |||
@pyqtSlot(int) | |||
def slot_tweakPluginsDssiRowChanged(self, index): | |||
nonRemovable = (index >= 0 and self.list_DSSI.item(index).text() not in DEFAULT_DSSI_PATH) | |||
self.b_tweak_plugins_change.setEnabled(nonRemovable) | |||
self.b_tweak_plugins_remove.setEnabled(nonRemovable) | |||
@pyqtSlot(int) | |||
def slot_tweakPluginsLv2RowChanged(self, index): | |||
nonRemovable = (index >= 0 and self.list_LV2.item(index).text() not in DEFAULT_LV2_PATH) | |||
self.b_tweak_plugins_change.setEnabled(nonRemovable) | |||
self.b_tweak_plugins_remove.setEnabled(nonRemovable) | |||
@pyqtSlot(int) | |||
def slot_tweakPluginsVstRowChanged(self, index): | |||
nonRemovable = (index >= 0 and self.list_VST.item(index).text() not in DEFAULT_VST_PATH) | |||
self.b_tweak_plugins_change.setEnabled(nonRemovable) | |||
self.b_tweak_plugins_remove.setEnabled(nonRemovable) | |||
def saveSettings(self): | |||
self.settings.setValue("Geometry", self.saveGeometry()) | |||
@@ -79,7 +79,7 @@ public: | |||
m_type = PLUGIN_LADSPA; | |||
handle = nullptr; | |||
handle = h2 = nullptr; | |||
descriptor = nullptr; | |||
rdf_descriptor = nullptr; | |||
@@ -90,11 +90,24 @@ public: | |||
{ | |||
qDebug("LadspaPlugin::~LadspaPlugin()"); | |||
if (handle && descriptor && descriptor->deactivate && m_activeBefore) | |||
descriptor->deactivate(handle); | |||
if (descriptor) | |||
{ | |||
if (descriptor->deactivate && m_activeBefore) | |||
{ | |||
if (handle) | |||
descriptor->deactivate(handle); | |||
if (h2) | |||
descriptor->deactivate(h2); | |||
} | |||
if (handle && descriptor && descriptor->cleanup) | |||
descriptor->cleanup(handle); | |||
if (descriptor->cleanup) | |||
{ | |||
if (handle) | |||
descriptor->cleanup(handle); | |||
if (h2) | |||
descriptor->cleanup(h2); | |||
} | |||
} | |||
if (rdf_descriptor) | |||
ladspa_rdf_free(rdf_descriptor); | |||
@@ -341,7 +354,7 @@ public: | |||
const unsigned long PortCount = descriptor->PortCount; | |||
for (unsigned long i=0; i<PortCount; i++) | |||
for (unsigned long i=0; i < PortCount; i++) | |||
{ | |||
const LADSPA_PortDescriptor PortType = descriptor->PortDescriptors[i]; | |||
if (LADSPA_IS_PORT_AUDIO(PortType)) | |||
@@ -355,6 +368,9 @@ public: | |||
params += 1; | |||
} | |||
if (carla_options.process_mode == PROCESS_MODE_CONTINUOUS_RACK && (ains == 1 || aouts == 1) && ! h2) | |||
h2 = descriptor->instantiate(descriptor, get_sample_rate()); | |||
if (ains > 0) | |||
{ | |||
ain.ports = new CarlaEngineAudioPort*[ains]; | |||
@@ -599,12 +615,14 @@ public: | |||
param_buffers[j] = def; | |||
descriptor->connect_port(handle, i, ¶m_buffers[j]); | |||
if (h2) descriptor->connect_port(h2, i, ¶m_buffers[j]); | |||
} | |||
else | |||
{ | |||
// Not Audio or Control | |||
qCritical("ERROR - Got a broken Port (neither Audio or Control)"); | |||
descriptor->connect_port(handle, i, nullptr); | |||
if (h2) descriptor->connect_port(h2, i, nullptr); | |||
} | |||
} | |||
@@ -651,7 +669,7 @@ public: | |||
if (aouts > 0) | |||
m_hints |= PLUGIN_CAN_VOLUME; | |||
if (aouts >= 2 && aouts%2 == 0) | |||
if (carla_options.process_mode == PROCESS_MODE_CONTINUOUS_RACK || (aouts >= 2 && aouts%2 == 0)) | |||
m_hints |= PLUGIN_CAN_BALANCE; | |||
x_client->activate(); | |||
@@ -676,7 +694,9 @@ public: | |||
if (ain.count > 0) | |||
{ | |||
if (ain.count == 1) | |||
uint32_t count = h2 ? 2 : ain.count; | |||
if (count == 1) | |||
{ | |||
for (k=0; k < frames; k++) | |||
{ | |||
@@ -684,7 +704,7 @@ public: | |||
ains_peak_tmp[0] = abs(inBuffer[0][k]); | |||
} | |||
} | |||
else if (ain.count >= 1) | |||
else if (count > 1) | |||
{ | |||
for (k=0; k < frames; k++) | |||
{ | |||
@@ -810,10 +830,16 @@ public: | |||
if (cinEvent->channel == cin_channel) | |||
{ | |||
if (descriptor->deactivate) | |||
{ | |||
descriptor->deactivate(handle); | |||
if (h2) descriptor->deactivate(h2); | |||
} | |||
if (descriptor->activate) | |||
{ | |||
descriptor->activate(handle); | |||
if (h2) descriptor->activate(h2); | |||
} | |||
} | |||
break; | |||
@@ -848,24 +874,36 @@ public: | |||
if (! m_activeBefore) | |||
{ | |||
if (descriptor->activate) | |||
{ | |||
descriptor->activate(handle); | |||
if (h2) descriptor->activate(h2); | |||
} | |||
} | |||
for (i=0; i < ain.count; i++) | |||
{ | |||
descriptor->connect_port(handle, ain.rindexes[i], inBuffer[i]); | |||
if (h2 && i == 0) descriptor->connect_port(h2, ain.rindexes[i], inBuffer[1]); | |||
} | |||
for (i=0; i < aout.count; i++) | |||
{ | |||
descriptor->connect_port(handle, aout.rindexes[i], outBuffer[i]); | |||
if (h2 && i == 0) descriptor->connect_port(h2, aout.rindexes[i], outBuffer[1]); | |||
} | |||
if (descriptor->run) | |||
descriptor->run(handle, frames); | |||
descriptor->run(handle, frames); | |||
if (h2) descriptor->run(h2, frames); | |||
} | |||
else | |||
{ | |||
if (m_activeBefore) | |||
{ | |||
if (descriptor->deactivate) | |||
{ | |||
descriptor->deactivate(handle); | |||
if (h2) descriptor->deactivate(h2); | |||
} | |||
} | |||
} | |||
@@ -883,7 +921,9 @@ public: | |||
double bal_rangeL, bal_rangeR; | |||
float oldBufLeft[do_balance ? frames : 0]; | |||
for (i=0; i < aout.count; i++) | |||
uint32_t count = h2 ? 2 : aout.count; | |||
for (i=0; i < count; i++) | |||
{ | |||
// Dry/Wet and Volume | |||
if (do_drywet || do_volume) | |||
@@ -892,7 +932,7 @@ public: | |||
{ | |||
if (do_drywet) | |||
{ | |||
if (aout.count == 1) | |||
if (aout.count == 1 && ! h2) | |||
outBuffer[i][k] = (outBuffer[i][k]*x_drywet)+(inBuffer[0][k]*(1.0-x_drywet)); | |||
else | |||
outBuffer[i][k] = (outBuffer[i][k]*x_drywet)+(inBuffer[i][k]*(1.0-x_drywet)); | |||
@@ -1081,7 +1121,7 @@ public: | |||
} | |||
private: | |||
LADSPA_Handle handle; | |||
LADSPA_Handle handle, h2; | |||
const LADSPA_Descriptor* descriptor; | |||
const LADSPA_RDF_Descriptor* rdf_descriptor; | |||
@@ -1113,13 +1153,16 @@ short add_plugin_ladspa(const char* const filename, const char* const name, cons | |||
#ifndef BUILD_BRIDGE | |||
if (carla_options.process_mode == PROCESS_MODE_CONTINUOUS_RACK) | |||
{ | |||
if (/* inputs */ ((plugin->audioInCount() != 0 && plugin->audioInCount() != 2)) || /* outputs */ ((plugin->audioOutCount() != 0 && plugin->audioOutCount() != 2))) | |||
uint32_t ins = plugin->audioInCount(); | |||
uint32_t outs = plugin->audioOutCount(); | |||
if (ins > 2 || outs > 2 || (ins != outs && ins != 0 && outs != 0)) | |||
{ | |||
set_last_error("Carla Rack Mode can only work with Stereo plugins, sorry!"); | |||
set_last_error("Carla Rack Mode can only work with Mono or Stereo plugins, sorry!"); | |||
qWarning("data: %i %i | %i %i %i", ins > 2, outs > 2, ins != outs, ins != 0, outs != 0); | |||
delete plugin; | |||
return -1; | |||
} | |||
} | |||
#endif | |||
@@ -67,6 +67,7 @@ void toolkit_loop() | |||
} | |||
else | |||
{ | |||
// TODO - window->setCentralWidget(widget); or other simpler method | |||
window = new QDialog(); | |||
window->resize(10, 10); | |||
window->setLayout(new QVBoxLayout(window)); | |||
@@ -1230,7 +1230,7 @@ int main(int argc, char* argv[]) | |||
} | |||
} | |||
bool doInit = QString(filename).endsWith("dssi-vst.so", Qt::CaseInsensitive); | |||
bool doInit = ! QString(filename).endsWith("dssi-vst.so", Qt::CaseInsensitive); | |||
switch (type) | |||
{ | |||
@@ -1169,8 +1169,8 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW): | |||
# About Carla Dialog | |||
class CarlaAboutW(QDialog, ui_carla_about.Ui_CarlaAboutW): | |||
def __init__(self, parent=None): | |||
super(CarlaAboutW, self).__init__(parent) | |||
def __init__(self, parent): | |||
QDialog.__init__(self, parent) | |||
self.setupUi(self) | |||
self.l_about.setText(self.tr("" | |||
@@ -2031,10 +2031,10 @@ class PluginWidget(QFrame, ui_carla_plugin.Ui_PluginWidget): | |||
self.peaks_in = int(audio_count['ins']) | |||
self.peaks_out = int(audio_count['outs']) | |||
if self.peaks_in > 2: | |||
if self.peaks_in > 2 or PROCESS_MODE == PROCESS_MODE_CONTINUOUS_RACK: | |||
self.peaks_in = 2 | |||
if self.peaks_out > 2: | |||
if self.peaks_out > 2 or PROCESS_MODE == PROCESS_MODE_CONTINUOUS_RACK: | |||
self.peaks_out = 2 | |||
self.peak_in.setChannels(self.peaks_in) | |||
@@ -3048,7 +3048,7 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): | |||
pwidget.peak_in.setRefreshRate(self.m_savedSettings["Main/RefreshInterval"]) | |||
pwidget.peak_out.setRefreshRate(self.m_savedSettings["Main/RefreshInterval"]) | |||
if (activate): | |||
if activate: | |||
pwidget.set_active(True, True, True) | |||
return new_plugin_id | |||
@@ -3515,20 +3515,18 @@ if __name__ == '__main__': | |||
gui = CarlaMainW() | |||
# Init backend | |||
process_mode = gui.settings.value("Engine/ProcessMode", PROCESS_MODE_MULTIPLE_CLIENTS, type=int) | |||
PROCESS_MODE = gui.settings.value("Engine/ProcessMode", PROCESS_MODE_MULTIPLE_CLIENTS, type=int) | |||
MAX_PARAMETERS = gui.settings.value("Engine/MaxParameters", MAX_PARAMETERS, type=int) | |||
prefer_ui_bridges = gui.settings.value("Engine/PreferUIBridges", True, type=bool) | |||
proccess_hq = gui.settings.value("Engine/ProcessHQ", False, type=bool) | |||
osc_gui_timeout = gui.settings.value("Engine/OscGuiTimeout", 40, type=int) | |||
use_dssi_chunks = gui.settings.value("Engine/UseDSSIChunks", False, type=bool) | |||
if os.getenv("LADISH_APP_NAME") and process_mode == PROCESS_MODE_MULTIPLE_CLIENTS: | |||
if os.getenv("LADISH_APP_NAME") and PROCESS_MODE == PROCESS_MODE_MULTIPLE_CLIENTS: | |||
print("LADISH detected but using multiple clients (not allowed), forcing single client now") | |||
process_mode = PROCESS_MODE_SINGLE_CLIENT | |||
#process_mode = PROCESS_MODE_CONTINUOUS_RACK | |||
PROCESS_MODE = PROCESS_MODE_SINGLE_CLIENT | |||
CarlaHost.set_option(OPTION_PROCESS_MODE, process_mode, "") | |||
CarlaHost.set_option(OPTION_PROCESS_MODE, PROCESS_MODE, "") | |||
CarlaHost.set_option(OPTION_MAX_PARAMETERS, MAX_PARAMETERS, "") | |||
CarlaHost.set_option(OPTION_PROCESS_HQ, proccess_hq, "") | |||
CarlaHost.set_option(OPTION_PREFER_UI_BRIDGES, prefer_ui_bridges, "") | |||
@@ -678,6 +678,8 @@ PROCESS_MODE_SINGLE_CLIENT = 0 | |||
PROCESS_MODE_MULTIPLE_CLIENTS = 1 | |||
PROCESS_MODE_CONTINUOUS_RACK = 2 | |||
PROCESS_MODE = PROCESS_MODE_MULTIPLE_CLIENTS | |||
class ParameterData(Structure): | |||
_fields_ = [ | |||
("type", c_enum), | |||
@@ -352,28 +352,27 @@ def setXruns(self_, xruns): | |||
# ------------------------------------------------------------- | |||
# External Dialogs | |||
global jacksettingsW, logsW | |||
jacksettingsW = logsW = None | |||
global logsW | |||
logsW = None | |||
@pyqtSlot() | |||
#@pyqtSlot() | |||
def slot_showJackSettings(self_): | |||
global jacksettingsW | |||
if not jacksettingsW: | |||
jacksettingsW = jacksettings.JackSettingsW(self_) | |||
jacksettingsW = jacksettings.JackSettingsW(self_) | |||
jacksettingsW.exec_() | |||
del jacksettingsW | |||
# Force update of gui widgets | |||
if not jack.client: | |||
self_.jackStopped() | |||
@pyqtSlot() | |||
#@pyqtSlot() | |||
def slot_showLogs(self_): | |||
global logsW | |||
if not logsW: | |||
logsW = logs.LogsW(self_) | |||
logsW.show() | |||
@pyqtSlot() | |||
#@pyqtSlot() | |||
def slot_showRender(self_): | |||
renderW = render.RenderW(self_) | |||
renderW.exec_() | |||
@@ -16,10 +16,6 @@ | |||
# | |||
# For a full copy of the GNU General Public License see the COPYING file | |||
# TESTING - remove if python3 | |||
from sip import setapi | |||
setapi("QString", 2) | |||
# Imports (Global) | |||
from os import getenv | |||
from PyQt4.QtCore import SIGNAL | |||
@@ -6,7 +6,7 @@ | |||
<rect> | |||
<x>0</x> | |||
<y>0</y> | |||
<width>778</width> | |||
<width>732</width> | |||
<height>527</height> | |||
</rect> | |||
</property> | |||
@@ -18,7 +18,7 @@ | |||
<item> | |||
<widget class="QTabWidget" name="tabWidget"> | |||
<property name="currentIndex"> | |||
<number>0</number> | |||
<number>2</number> | |||
</property> | |||
<widget class="QWidget" name="tab_system"> | |||
<attribute name="title"> | |||
@@ -795,7 +795,7 @@ | |||
<attribute name="title"> | |||
<string>Tweaks</string> | |||
</attribute> | |||
<layout class="QVBoxLayout" name="verticalLayout"> | |||
<layout class="QVBoxLayout" name="verticalLayout_15"> | |||
<item> | |||
<widget class="QLabel" name="label_tweaks"> | |||
<property name="font"> | |||
@@ -866,7 +866,7 @@ | |||
</spacer> | |||
</item> | |||
<item> | |||
<widget class="QPushButton" name="pushButton"> | |||
<widget class="QPushButton" name="b_tweaks_apply_now"> | |||
<property name="text"> | |||
<string>Apply Now</string> | |||
</property> | |||
@@ -889,7 +889,7 @@ | |||
</widget> | |||
</item> | |||
<item> | |||
<widget class="QSplitter" name="splitter_tweaks"> | |||
<widget class="QSplitter" name="splitter"> | |||
<property name="sizePolicy"> | |||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> | |||
<horstretch>0</horstretch> | |||
@@ -906,6 +906,74 @@ | |||
<verstretch>0</verstretch> | |||
</sizepolicy> | |||
</property> | |||
<property name="maximumSize"> | |||
<size> | |||
<width>200</width> | |||
<height>16777215</height> | |||
</size> | |||
</property> | |||
<attribute name="horizontalHeaderVisible"> | |||
<bool>false</bool> | |||
</attribute> | |||
<attribute name="horizontalHeaderStretchLastSection"> | |||
<bool>true</bool> | |||
</attribute> | |||
<attribute name="verticalHeaderVisible"> | |||
<bool>false</bool> | |||
</attribute> | |||
<row> | |||
<property name="text"> | |||
<string>audio-plugins</string> | |||
</property> | |||
</row> | |||
<row> | |||
<property name="text"> | |||
<string>default-apps</string> | |||
</property> | |||
</row> | |||
<row> | |||
<property name="text"> | |||
<string>wineasio</string> | |||
</property> | |||
</row> | |||
<column> | |||
<property name="text"> | |||
<string>name</string> | |||
</property> | |||
</column> | |||
<item row="0" column="0"> | |||
<property name="text"> | |||
<string>Audio Plugins PATH</string> | |||
</property> | |||
<property name="textAlignment"> | |||
<set>AlignHCenter|AlignVCenter|AlignCenter</set> | |||
</property> | |||
<property name="flags"> | |||
<set>ItemIsSelectable|ItemIsEnabled</set> | |||
</property> | |||
</item> | |||
<item row="1" column="0"> | |||
<property name="text"> | |||
<string>Default Applications</string> | |||
</property> | |||
<property name="textAlignment"> | |||
<set>AlignHCenter|AlignVCenter|AlignCenter</set> | |||
</property> | |||
<property name="flags"> | |||
<set>ItemIsSelectable|ItemIsEnabled</set> | |||
</property> | |||
</item> | |||
<item row="2" column="0"> | |||
<property name="text"> | |||
<string>WineASIO</string> | |||
</property> | |||
<property name="textAlignment"> | |||
<set>AlignHCenter|AlignVCenter|AlignCenter</set> | |||
</property> | |||
<property name="flags"> | |||
<set>ItemIsSelectable|ItemIsEnabled</set> | |||
</property> | |||
</item> | |||
</widget> | |||
<widget class="QStackedWidget" name="sw_tweaks"> | |||
<property name="sizePolicy"> | |||
@@ -915,12 +983,374 @@ | |||
</sizepolicy> | |||
</property> | |||
<property name="currentIndex"> | |||
<number>-1</number> | |||
<number>0</number> | |||
</property> | |||
<widget class="QWidget" name="page"> | |||
<layout class="QGridLayout" name="gridLayout_6"> | |||
<property name="margin"> | |||
<number>0</number> | |||
</property> | |||
<item row="3" column="1"> | |||
<widget class="QPushButton" name="b_tweak_plugins_remove"> | |||
<property name="text"> | |||
<string>Remove</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="4" column="1"> | |||
<spacer name="verticalSpacer_5"> | |||
<property name="orientation"> | |||
<enum>Qt::Vertical</enum> | |||
</property> | |||
<property name="sizeType"> | |||
<enum>QSizePolicy::Fixed</enum> | |||
</property> | |||
<property name="sizeHint" stdset="0"> | |||
<size> | |||
<width>20</width> | |||
<height>0</height> | |||
</size> | |||
</property> | |||
</spacer> | |||
</item> | |||
<item row="7" column="1"> | |||
<spacer name="verticalSpacer_6"> | |||
<property name="orientation"> | |||
<enum>Qt::Vertical</enum> | |||
</property> | |||
<property name="sizeHint" stdset="0"> | |||
<size> | |||
<width>20</width> | |||
<height>220</height> | |||
</size> | |||
</property> | |||
</spacer> | |||
</item> | |||
<item row="1" column="1"> | |||
<widget class="QPushButton" name="b_tweak_plugins_add"> | |||
<property name="text"> | |||
<string>Add...</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="0" column="0" rowspan="8"> | |||
<widget class="QToolBox" name="tb_tweak_plugins"> | |||
<property name="currentIndex"> | |||
<number>0</number> | |||
</property> | |||
<widget class="QWidget" name="page_ladspa"> | |||
<property name="geometry"> | |||
<rect> | |||
<x>0</x> | |||
<y>0</y> | |||
<width>412</width> | |||
<height>276</height> | |||
</rect> | |||
</property> | |||
<attribute name="label"> | |||
<string>LADSPA</string> | |||
</attribute> | |||
<layout class="QVBoxLayout" name="verticalLayout"> | |||
<item> | |||
<widget class="QListWidget" name="list_LADSPA"/> | |||
</item> | |||
</layout> | |||
</widget> | |||
<widget class="QWidget" name="page_dssi"> | |||
<property name="geometry"> | |||
<rect> | |||
<x>0</x> | |||
<y>0</y> | |||
<width>94</width> | |||
<height>76</height> | |||
</rect> | |||
</property> | |||
<attribute name="label"> | |||
<string>DSSI</string> | |||
</attribute> | |||
<layout class="QVBoxLayout" name="verticalLayout_11"> | |||
<item> | |||
<widget class="QListWidget" name="list_DSSI"/> | |||
</item> | |||
</layout> | |||
</widget> | |||
<widget class="QWidget" name="page_lv2"> | |||
<property name="geometry"> | |||
<rect> | |||
<x>0</x> | |||
<y>0</y> | |||
<width>94</width> | |||
<height>76</height> | |||
</rect> | |||
</property> | |||
<attribute name="label"> | |||
<string>LV2</string> | |||
</attribute> | |||
<layout class="QVBoxLayout" name="verticalLayout_13"> | |||
<item> | |||
<widget class="QListWidget" name="list_LV2"/> | |||
</item> | |||
</layout> | |||
</widget> | |||
<widget class="QWidget" name="page_vst"> | |||
<property name="geometry"> | |||
<rect> | |||
<x>0</x> | |||
<y>0</y> | |||
<width>94</width> | |||
<height>76</height> | |||
</rect> | |||
</property> | |||
<attribute name="label"> | |||
<string>VST</string> | |||
</attribute> | |||
<layout class="QVBoxLayout" name="verticalLayout_14"> | |||
<item> | |||
<widget class="QListWidget" name="list_VST"/> | |||
</item> | |||
</layout> | |||
</widget> | |||
</widget> | |||
</item> | |||
<item row="0" column="1"> | |||
<spacer name="verticalSpacer_7"> | |||
<property name="orientation"> | |||
<enum>Qt::Vertical</enum> | |||
</property> | |||
<property name="sizeType"> | |||
<enum>QSizePolicy::Fixed</enum> | |||
</property> | |||
<property name="sizeHint" stdset="0"> | |||
<size> | |||
<width>20</width> | |||
<height>20</height> | |||
</size> | |||
</property> | |||
</spacer> | |||
</item> | |||
<item row="6" column="1"> | |||
<widget class="QPushButton" name="b_tweak_plugins_reset"> | |||
<property name="text"> | |||
<string>Reset</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="2" column="1"> | |||
<widget class="QPushButton" name="b_tweak_plugins_change"> | |||
<property name="text"> | |||
<string>Change...</string> | |||
</property> | |||
</widget> | |||
</item> | |||
</layout> | |||
</widget> | |||
<widget class="QWidget" name="page_2"> | |||
<layout class="QGridLayout" name="gridLayout_7"> | |||
<property name="verticalSpacing"> | |||
<number>20</number> | |||
</property> | |||
<property name="margin"> | |||
<number>0</number> | |||
</property> | |||
<item row="1" column="0"> | |||
<widget class="QCheckBox" name="checkBox_2"> | |||
<property name="text"> | |||
<string>Image Viewer</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="3" column="1"> | |||
<widget class="QComboBox" name="comboBox_3"> | |||
<property name="sizePolicy"> | |||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> | |||
<horstretch>0</horstretch> | |||
<verstretch>0</verstretch> | |||
</sizepolicy> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="4" column="0"> | |||
<widget class="QCheckBox" name="checkBox_5"> | |||
<property name="text"> | |||
<string>Text Editor</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="4" column="1"> | |||
<widget class="QComboBox" name="comboBox_4"> | |||
<property name="sizePolicy"> | |||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> | |||
<horstretch>0</horstretch> | |||
<verstretch>0</verstretch> | |||
</sizepolicy> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="3" column="0"> | |||
<widget class="QCheckBox" name="checkBox_4"> | |||
<property name="text"> | |||
<string>Video Player</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="5" column="1"> | |||
<widget class="QComboBox" name="comboBox_5"> | |||
<property name="sizePolicy"> | |||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> | |||
<horstretch>0</horstretch> | |||
<verstretch>0</verstretch> | |||
</sizepolicy> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="2" column="0"> | |||
<widget class="QCheckBox" name="checkBox_3"> | |||
<property name="text"> | |||
<string>Music Player</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="2" column="1"> | |||
<widget class="QComboBox" name="comboBox_2"> | |||
<property name="sizePolicy"> | |||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> | |||
<horstretch>0</horstretch> | |||
<verstretch>0</verstretch> | |||
</sizepolicy> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="5" column="0"> | |||
<widget class="QCheckBox" name="checkBox_6"> | |||
<property name="text"> | |||
<string>Web Browser</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="6" column="1"> | |||
<spacer name="verticalSpacer_8"> | |||
<property name="orientation"> | |||
<enum>Qt::Vertical</enum> | |||
</property> | |||
<property name="sizeHint" stdset="0"> | |||
<size> | |||
<width>20</width> | |||
<height>114</height> | |||
</size> | |||
</property> | |||
</spacer> | |||
</item> | |||
<item row="1" column="1"> | |||
<widget class="QComboBox" name="comboBox"> | |||
<property name="sizePolicy"> | |||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> | |||
<horstretch>0</horstretch> | |||
<verstretch>0</verstretch> | |||
</sizepolicy> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="0" column="1"> | |||
<spacer name="verticalSpacer_9"> | |||
<property name="orientation"> | |||
<enum>Qt::Vertical</enum> | |||
</property> | |||
<property name="sizeType"> | |||
<enum>QSizePolicy::Fixed</enum> | |||
</property> | |||
<property name="sizeHint" stdset="0"> | |||
<size> | |||
<width>20</width> | |||
<height>20</height> | |||
</size> | |||
</property> | |||
</spacer> | |||
</item> | |||
<item row="0" column="2" rowspan="7"> | |||
<widget class="QFrame" name="frame"> | |||
<property name="minimumSize"> | |||
<size> | |||
<width>156</width> | |||
<height>0</height> | |||
</size> | |||
</property> | |||
<property name="maximumSize"> | |||
<size> | |||
<width>156</width> | |||
<height>16777215</height> | |||
</size> | |||
</property> | |||
<property name="frameShape"> | |||
<enum>QFrame::StyledPanel</enum> | |||
</property> | |||
<property name="frameShadow"> | |||
<enum>QFrame::Raised</enum> | |||
</property> | |||
<layout class="QVBoxLayout" name="verticalLayout_16"> | |||
<item> | |||
<widget class="QLabel" name="label"> | |||
<property name="text"> | |||
<string>ICO</string> | |||
</property> | |||
<property name="alignment"> | |||
<set>Qt::AlignCenter</set> | |||
</property> | |||
</widget> | |||
</item> | |||
<item> | |||
<widget class="QLabel" name="label_3"> | |||
<property name="text"> | |||
<string>AppName</string> | |||
</property> | |||
<property name="alignment"> | |||
<set>Qt::AlignCenter</set> | |||
</property> | |||
</widget> | |||
</item> | |||
<item> | |||
<widget class="Line" name="line_3"> | |||
<property name="orientation"> | |||
<enum>Qt::Horizontal</enum> | |||
</property> | |||
</widget> | |||
</item> | |||
<item> | |||
<widget class="QLabel" name="label_4"> | |||
<property name="text"> | |||
<string>Desc</string> | |||
</property> | |||
<property name="alignment"> | |||
<set>Qt::AlignCenter</set> | |||
</property> | |||
</widget> | |||
</item> | |||
<item> | |||
<spacer name="verticalSpacer_10"> | |||
<property name="orientation"> | |||
<enum>Qt::Vertical</enum> | |||
</property> | |||
<property name="sizeHint" stdset="0"> | |||
<size> | |||
<width>20</width> | |||
<height>287</height> | |||
</size> | |||
</property> | |||
</spacer> | |||
</item> | |||
</layout> | |||
</widget> | |||
</item> | |||
</layout> | |||
</widget> | |||
<widget class="QWidget" name="page_3"/> | |||
</widget> | |||
</widget> | |||
</item> | |||
</layout> | |||
<zorder>splitter</zorder> | |||
<zorder>label_tweaks</zorder> | |||
<zorder>line_tweaks</zorder> | |||
<zorder>frame_tweaks_settings</zorder> | |||
</widget> | |||
</widget> | |||
</item> | |||
@@ -931,7 +1361,7 @@ | |||
<rect> | |||
<x>0</x> | |||
<y>0</y> | |||
<width>778</width> | |||
<width>732</width> | |||
<height>20</height> | |||
</rect> | |||
</property> | |||
@@ -1031,5 +1461,21 @@ | |||
</hint> | |||
</hints> | |||
</connection> | |||
<connection> | |||
<sender>tw_tweaks</sender> | |||
<signal>currentCellChanged(int,int,int,int)</signal> | |||
<receiver>sw_tweaks</receiver> | |||
<slot>setCurrentIndex(int)</slot> | |||
<hints> | |||
<hint type="sourcelabel"> | |||
<x>121</x> | |||
<y>359</y> | |||
</hint> | |||
<hint type="destinationlabel"> | |||
<x>707</x> | |||
<y>136</y> | |||
</hint> | |||
</hints> | |||
</connection> | |||
</connections> | |||
</ui> |