@@ -85,6 +85,9 @@ | |||
<file>scalable/pb_generic.svg</file> | |||
<file>scalable/pb_hardware.svg</file> | |||
<file>scalable/pb_plugin.svg</file> | |||
<file>scalable/pb_file.svg</file> | |||
<file>scalable/pb_configure.svg</file> | |||
<file>scalable/pb_audacious.svg</file> | |||
<file>scalable/pb_clementine.svg</file> | |||
<file>scalable/pb_distrho.svg</file> | |||
@@ -0,0 +1,18 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | |||
<!-- Creator: CorelDRAW --> | |||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="4.7412mm" height="4.7625mm" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" | |||
viewBox="0 0 0.0991055 0.0995508" | |||
xmlns:xlink="http://www.w3.org/1999/xlink"> | |||
<defs> | |||
<style type="text/css"> | |||
<![CDATA[ | |||
.fil0 {fill:gray} | |||
]]> | |||
</style> | |||
</defs> | |||
<g id="Layer_x0020_1"> | |||
<metadata id="CorelCorpID_0Corel-Layer"/> | |||
<path class="fil0" d="M0.0977447 0.0757067c-0.0106585,-0.00798914 -0.02486,-0.0189361 -0.0399833,-0.0321008 -0.00695026,-0.00743939 0.00104515,-0.0133361 -0.00182484,-0.0262626 -0.00100126,-0.00450252 -0.00442936,-0.00907819 -0.00780729,-0.0109177 -0.00443145,-0.00242057 -0.0182254,-0.00644441 -0.0245381,-0.00642351 -0.00101798,0.000865386 -0.00278429,0.00283236 -0.00424541,0.0044837 0.000804767,0.00100753 0.0138462,0.00998121 0.0149708,0.0108591 0.00342392,0.00266305 0.00458404,0.00266514 0.00325042,0.00841557 -0.00150293,0.00647785 -0.00513379,0.0116514 -0.0107902,0.0150962 -0.00781356,0.00475335 -0.00604307,0.00373119 -0.0168562,-0.00415762l-0.00683321 -0.00486623c-0.000792226,0.00173077 -0.00188545,0.00346154 -0.00308738,0.00628137 0.00317517,0.005347 0.0142496,0.0206522 0.0191744,0.0224122 0.00926423,0.00331522 0.0178219,-0.00363086 0.0228909,0.00143813 0.0106292,0.0103909 0.0192705,0.0178031 0.0350962,0.0379829 0.00676841,0.00814174 0.0273934,-0.0171363 0.0205832,-0.0222408z"/> | |||
</g> | |||
</svg> |
@@ -0,0 +1,18 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | |||
<!-- Creator: CorelDRAW --> | |||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="3.6601mm" height="4.4602mm" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" | |||
viewBox="0 0 0.0724159 0.0882461" | |||
xmlns:xlink="http://www.w3.org/1999/xlink"> | |||
<defs> | |||
<style type="text/css"> | |||
<![CDATA[ | |||
.fil0 {fill:gray} | |||
]]> | |||
</style> | |||
</defs> | |||
<g id="Layer_x0020_1"> | |||
<metadata id="CorelCorpID_0Corel-Layer"/> | |||
<polygon class="fil0" points="-0,0 0.0496332,0 0.0724159,0.0218013 0.0724159,0.0882461 -0,0.0882461 "/> | |||
</g> | |||
</svg> |
@@ -0,0 +1,18 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | |||
<!-- Creator: CorelDRAW --> | |||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="4.585mm" height="4.4467mm" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" | |||
viewBox="0 0 0.26727 0.259208" | |||
xmlns:xlink="http://www.w3.org/1999/xlink"> | |||
<defs> | |||
<style type="text/css"> | |||
<![CDATA[ | |||
.fil0 {fill:gray} | |||
]]> | |||
</style> | |||
</defs> | |||
<g id="Layer_x0020_1"> | |||
<metadata id="CorelCorpID_0Corel-Layer"/> | |||
<path class="fil0" d="M0.26727 0.111367l-0.0358964 -0.0096532 -0.0102011 -0.0227223c0.00591083,-0.00853398 0.0156923,-0.023212 0.0193589,-0.0299039l-0.0265521 -0.0250365c-0.0103294,0.00638883 -0.0220869,0.0143457 -0.0334772,0.0218713 -0.00839408,-0.00483826 -0.0130691,-0.00723407 -0.019866,-0.0116759 -0.00298456,-0.0130108 -0.00383563,-0.0171263 -0.00787528,-0.0342059 -0.0127485,-5.2463e-005 -0.0255029,-5.2463e-005 -0.0382514,0 -0.00404548,0.0170796 -0.00489655,0.0211951 -0.00788111,0.0342059 -0.00679105,0.00444187 -0.0114719,0.00683768 -0.0198602,0.0116759 -0.0113961,-0.00752553 -0.0231537,-0.0154824 -0.0334772,-0.0218713l-0.0265521 0.0250365c0.00366658,0.00669195 0.0134422,0.0213699 0.0193589,0.0299039l-0.010207 0.0227223 -0.0358905 0.0096532 0 0.0364735 0.0358905 0.0096532 0.010207 0.0227223c-0.00591666,0.00853398 -0.0156923,0.023212 -0.0193589,0.0299039l0.0265521 0.0250365c0.0103236,-0.00638883 0.0220811,-0.0143399 0.0334772,-0.0218713 0.00838825,0.00483826 0.0130691,0.00723407 0.0198602,0.0116759 0.00298456,0.0130108 0.00383563,0.0171263 0.00788111,0.0342059 0.0127485,5.2463e-005 0.0255029,5.2463e-005 0.0382514,0 0.00403965,-0.0170796 0.00489072,-0.0211951 0.00787528,-0.0342059 0.00679688,-0.00444187 0.0114719,-0.00683768 0.019866,-0.0116759 0.0113903,0.00753136 0.0231479,0.0154824 0.0334772,0.0218713l0.0265521 -0.0250365c-0.00366658,-0.00669195 -0.013448,-0.0213699 -0.0193589,-0.0299039l0.0102011 -0.0227223 0.0358964 -0.0096532 0 -0.0364735zm-0.133635 -0.0312505c0.0273332,0 0.0494843,0.0221511 0.0494843,0.0494843 0,0.0273332 -0.0221511,0.0494843 -0.0494843,0.0494843 -0.0273332,0 -0.0494843,-0.0221511 -0.0494843,-0.0494843 0,-0.0273332 0.0221511,-0.0494843 0.0494843,-0.0494843z"/> | |||
</g> | |||
</svg> |
@@ -203,6 +203,17 @@ enum InternalParametersIndex { | |||
PARAMETER_MAX = -9 //!< Max value, defined for convenience | |||
}; | |||
/*! | |||
* The icon of a patchbay client/group. | |||
*/ | |||
enum PatchbayIconType { | |||
PATCHBAY_ICON_APPLICATION = 0, //!< Generic application icon. | |||
PATCHBAY_ICON_HARDWARE = 1, //!< Hardware icon. | |||
PATCHBAY_ICON_PLUGIN = 2, //!< Plugin icon. | |||
PATCHBAY_ICON_DISTRHO = 3, //!< DISTRHO icon. | |||
PATCHBAY_ICON_FILE = 4 //!< File icon. | |||
}; | |||
/*! | |||
* Options used in the CarlaEngine::setOption() and set_option() calls.\n | |||
* All options except paths must be set before initiliazing or after closing the engine. | |||
@@ -530,6 +541,7 @@ enum CallbackType { | |||
* Canvas client added | |||
* | |||
* \param value1 Client Id | |||
* \param value2 Client Icon | |||
* \param valueStr Client name | |||
*/ | |||
CALLBACK_PATCHBAY_CLIENT_ADDED = 18, | |||
@@ -526,7 +526,7 @@ public: | |||
fOptions.processMode = PROCESS_MODE_MULTIPLE_CLIENTS; | |||
#else | |||
# ifndef CARLA_PROPER_CPP11_SUPPORT | |||
carla_zeroStruct<jack_port_t*>(fRackPorts, rackPortCount); | |||
carla_fill<jack_port_t*>(fRackPorts, rackPortCount, nullptr); | |||
# endif | |||
#endif | |||
@@ -545,6 +545,7 @@ public: | |||
fUsedGroupNames.clear(); | |||
fUsedPortNames.clear(); | |||
fUsedConnections.clear(); | |||
fPluginClientNames.clear(); | |||
#endif | |||
} | |||
@@ -587,6 +588,7 @@ public: | |||
fUsedGroupNames.clear(); | |||
fUsedPortNames.clear(); | |||
fUsedConnections.clear(); | |||
fPluginClientNames.clear(); | |||
fClient = jackbridge_client_open(clientName, JackNullOption, nullptr); | |||
@@ -693,6 +695,7 @@ public: | |||
fUsedGroupNames.clear(); | |||
fUsedPortNames.clear(); | |||
fUsedConnections.clear(); | |||
fPluginClientNames.clear(); | |||
#endif | |||
return false; | |||
} | |||
@@ -746,6 +749,12 @@ public: | |||
# if 0 | |||
jackbridge_set_latency_callback(client, carla_jack_latency_callback_plugin, plugin); | |||
# endif | |||
CARLA_ASSERT(client != nullptr); | |||
if (client == nullptr) | |||
return nullptr; | |||
fPluginClientNames.append(QString(jackbridge_get_client_name(client))); | |||
} | |||
#endif | |||
@@ -851,8 +860,8 @@ public: | |||
return false; | |||
} | |||
const char* const portNameA = getFullPortName(portA).toUtf8().constData(); | |||
const char* const portNameB = getFullPortName(portB).toUtf8().constData(); | |||
const char* const portNameA(getFullPortName(portA).toUtf8().constData()); | |||
const char* const portNameB(getFullPortName(portB).toUtf8().constData()); | |||
if (! jackbridge_connect(fClient, portNameA, portNameB)) | |||
{ | |||
@@ -877,8 +886,8 @@ public: | |||
{ | |||
if (fUsedConnections[i].id == connectionId) | |||
{ | |||
const char* const portNameA = getFullPortName(fUsedConnections[i].portOut).toUtf8().constData(); | |||
const char* const portNameB = getFullPortName(fUsedConnections[i].portIn).toUtf8().constData(); | |||
const char* const portNameA(getFullPortName(fUsedConnections[i].portOut).toUtf8().constData()); | |||
const char* const portNameB(getFullPortName(fUsedConnections[i].portIn).toUtf8().constData()); | |||
if (! jackbridge_disconnect(fClient, portNameA, portNameB)) | |||
{ | |||
@@ -1274,7 +1283,15 @@ protected: | |||
groupNameToId.id = fLastGroupId; | |||
groupNameToId.name = name; | |||
callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, fLastGroupId, 0, 0.0f, name); | |||
PatchbayIconType groupIcon = PATCHBAY_ICON_APPLICATION; | |||
if (fPluginClientNames.contains(QString(name))) | |||
{ | |||
// TODO - identify distrho or file icon | |||
groupIcon = PATCHBAY_ICON_PLUGIN; | |||
} | |||
callback(CALLBACK_PATCHBAY_CLIENT_ADDED, groupIcon, fLastGroupId, 0, 0.0f, name); | |||
fUsedGroupNames.append(groupNameToId); | |||
fLastGroupId++; | |||
} | |||
@@ -1455,6 +1472,8 @@ private: | |||
QList<PortNameToId> fUsedPortNames; | |||
QList<ConnectionToId> fUsedConnections; | |||
QStringList fPluginClientNames; | |||
int getGroupId(QString groupName) | |||
{ | |||
for (int i=0, count=fUsedGroupNames.count(); i < count; ++i) | |||
@@ -1528,6 +1547,7 @@ private: | |||
QString fullName(ports[i]); | |||
QString groupName(fullName.split(":").at(0)); | |||
int groupId = -1; | |||
int jackPortFlags = jackbridge_port_flags(jackPort); | |||
//if (groupName == ourName) | |||
// continue; | |||
@@ -1547,10 +1567,20 @@ private: | |||
fUsedGroupNames.append(groupNameToId); | |||
parsedGroups.append(groupName); | |||
callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, 0, 0.0f, groupName.toUtf8().constData()); | |||
PatchbayIconType groupIcon = PATCHBAY_ICON_APPLICATION; | |||
if (fPluginClientNames.contains(groupName)) | |||
{ | |||
// TODO - identify distrho or file icon | |||
groupIcon = PATCHBAY_ICON_PLUGIN; | |||
} | |||
else if (jackPortFlags & JackPortIsPhysical) | |||
groupIcon = PATCHBAY_ICON_HARDWARE; | |||
callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, groupIcon, 0.0f, groupName.toUtf8().constData()); | |||
} | |||
bool portIsInput = (jackbridge_port_flags(jackPort) & JackPortIsInput); | |||
bool portIsInput = (jackPortFlags & JackPortIsInput); | |||
bool portIsAudio = (std::strcmp(jackbridge_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0); | |||
unsigned int portFlags = 0x0; | |||
@@ -875,7 +875,7 @@ class CarlaMainW(QMainWindow): | |||
self.connect(self, SIGNAL("ReloadParametersCallback(int)"), SLOT("slot_handleReloadParametersCallback(int)")) | |||
self.connect(self, SIGNAL("ReloadProgramsCallback(int)"), SLOT("slot_handleReloadProgramsCallback(int)")) | |||
self.connect(self, SIGNAL("ReloadAllCallback(int)"), SLOT("slot_handleReloadAllCallback(int)")) | |||
self.connect(self, SIGNAL("PatchbayClientAddedCallback(int, QString)"), SLOT("slot_handlePatchbayClientAddedCallback(int, QString)")) | |||
self.connect(self, SIGNAL("PatchbayClientAddedCallback(int, int, QString)"), SLOT("slot_handlePatchbayClientAddedCallback(int, int, QString)")) | |||
self.connect(self, SIGNAL("PatchbayClientRemovedCallback(int)"), SLOT("slot_handlePatchbayClientRemovedCallback(int)")) | |||
self.connect(self, SIGNAL("PatchbayClientRenamedCallback(int, QString)"), SLOT("slot_handlePatchbayClientRenamedCallback(int, QString)")) | |||
self.connect(self, SIGNAL("PatchbayPortAddedCallback(int, int, int, QString)"), SLOT("slot_handlePatchbayPortAddedCallback(int, int, int, QString)")) | |||
@@ -1901,9 +1901,22 @@ class CarlaMainW(QMainWindow): | |||
pwidget.ui.edit_dialog.reloadAll() | |||
@pyqtSlot(int, str) | |||
def slot_handlePatchbayClientAddedCallback(self, clientId, clientName): | |||
patchcanvas.addGroup(clientId, clientName) | |||
@pyqtSlot(int, int, str) | |||
def slot_handlePatchbayClientAddedCallback(self, clientId, clientIcon, clientName): | |||
pcSplit = patchcanvas.SPLIT_UNDEF | |||
pcIcon = patchcanvas.ICON_APPLICATION | |||
if clientIcon == PATCHBAY_ICON_HARDWARE: | |||
pcSplit = patchcanvas.SPLIT_YES | |||
pcIcon = patchcanvas.ICON_HARDWARE | |||
elif clientIcon == PATCHBAY_ICON_PLUGIN: | |||
pcIcon = patchcanvas.ICON_PLUGIN | |||
elif clientIcon == PATCHBAY_ICON_DISTRHO: | |||
pcIcon = patchcanvas.ICON_DISTRHO | |||
elif clientIcon == PATCHBAY_ICON_FILE: | |||
pcIcon = patchcanvas.ICON_FILE | |||
patchcanvas.addGroup(clientId, clientName, pcSplit, pcIcon) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||
@pyqtSlot(int) | |||
@@ -2258,7 +2271,7 @@ def engineCallback(ptr, action, pluginId, value1, value2, value3, valueStr): | |||
elif action == CALLBACK_RELOAD_ALL: | |||
Carla.gui.emit(SIGNAL("ReloadAllCallback(int)"), pluginId) | |||
elif action == CALLBACK_PATCHBAY_CLIENT_ADDED: | |||
Carla.gui.emit(SIGNAL("PatchbayClientAddedCallback(int, QString)"), value1, cString(valueStr)) | |||
Carla.gui.emit(SIGNAL("PatchbayClientAddedCallback(int, int, QString)"), value1, value2, cString(valueStr)) | |||
elif action == CALLBACK_PATCHBAY_CLIENT_REMOVED: | |||
Carla.gui.emit(SIGNAL("PatchbayClientRemovedCallback(int)"), value1) | |||
elif action == CALLBACK_PATCHBAY_CLIENT_RENAMED: | |||
@@ -187,6 +187,13 @@ PARAMETER_PANNING = -7 | |||
PARAMETER_CTRL_CHANNEL = -8 | |||
PARAMETER_MAX = -9 | |||
# Patchbay Icon Type | |||
PATCHBAY_ICON_APPLICATION = 0 | |||
PATCHBAY_ICON_HARDWARE = 1 | |||
PATCHBAY_ICON_PLUGIN = 2 | |||
PATCHBAY_ICON_DISTRHO = 3 | |||
PATCHBAY_ICON_FILE = 4 | |||
# Options Type | |||
OPTION_PROCESS_NAME = 0 | |||
OPTION_PROCESS_MODE = 1 | |||
@@ -58,7 +58,10 @@ ACTION_PORTS_DISCONNECT = 7 # conn_id, N, N | |||
# Icon | |||
ICON_HARDWARE = 0 | |||
ICON_APPLICATION = 1 | |||
ICON_LADISH_ROOM = 2 | |||
ICON_PLUGIN = 2 | |||
ICON_DISTRHO = 3 | |||
ICON_FILE = 4 | |||
ICON_LADISH_ROOM = 5 | |||
# Split Option | |||
SPLIT_UNDEF = 0 | |||
@@ -2518,6 +2521,9 @@ class CanvasIcon(QGraphicsSvgItem): | |||
elif "clementine" in name: | |||
icon_path = ":/scalable/pb_clementine.svg" | |||
self.p_size = QRectF(5, 4, 16, 16) | |||
elif "distrho" in name: | |||
icon_path = ":/scalable/pb_distrho.svg" | |||
self.p_size = QRectF(5, 4, 14, 14) | |||
elif "jamin" in name: | |||
icon_path = ":/scalable/pb_jamin.svg" | |||
self.p_size = QRectF(5, 3, 16, 16) | |||
@@ -2530,12 +2536,24 @@ class CanvasIcon(QGraphicsSvgItem): | |||
else: | |||
icon_path = ":/scalable/pb_generic.svg" | |||
self.p_size = QRectF(5, 3, 16, 16) | |||
self.p_size = QRectF(4, 3, 16, 16) | |||
elif icon == ICON_HARDWARE: | |||
icon_path = ":/scalable/pb_hardware.svg" | |||
self.p_size = QRectF(5, 2, 16, 16) | |||
elif icon == ICON_PLUGIN: | |||
icon_path = ":/scalable/pb_plugin.svg" | |||
self.p_size = QRectF(5, 4, 14, 14) | |||
elif icon == ICON_DISTRHO: | |||
icon_path = ":/scalable/pb_distrho.svg" | |||
self.p_size = QRectF(5, 4, 14, 14) | |||
elif icon == ICON_FILE: | |||
icon_path = ":/scalable/pb_file.svg" | |||
self.p_size = QRectF(5, 4, 12, 14) | |||
elif icon == ICON_LADISH_ROOM: | |||
# TODO - make a unique ladish-room icon | |||
icon_path = ":/scalable/pb_hardware.svg" | |||