Browse Source

Final tweaks for internal/external patchbay usage and projects

Signed-off-by: falkTX <falktx@falktx.com>
tags/v2.2.0-RC1
falkTX 5 years ago
parent
commit
a6aaccc6eb
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
2 changed files with 89 additions and 37 deletions
  1. +51
    -8
      source/backend/engine/CarlaEngine.cpp
  2. +38
    -29
      source/backend/engine/CarlaEngineJack.cpp

+ 51
- 8
source/backend/engine/CarlaEngine.cpp View File

@@ -2544,8 +2544,11 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw


callback(true, false, ENGINE_CALLBACK_IDLE, 0, 0, 0, 0, 0.0f, nullptr); callback(true, false, ENGINE_CALLBACK_IDLE, 0, 0, 0, 0, 0.0f, nullptr);


const bool isPatchbay = pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY;
const bool isPlugin = getType() == kEngineTypePlugin;
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH
const bool isMultiClient = pData->options.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS;
const bool isPatchbay = pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY;
#endif
const bool isPlugin = getType() == kEngineTypePlugin;


// load engine settings first of all // load engine settings first of all
if (XmlElement* const elem = isPreset ? nullptr : xmlElement->getChildByName("EngineSettings")) if (XmlElement* const elem = isPreset ? nullptr : xmlElement->getChildByName("EngineSettings"))
@@ -2713,7 +2716,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw


CARLA_SAFE_ASSERT_CONTINUE(stateSave.type != nullptr); CARLA_SAFE_ASSERT_CONTINUE(stateSave.type != nullptr);


#ifndef BUILD_BRIDGE
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH
// compatibility code to load projects with GIG files // compatibility code to load projects with GIG files
// FIXME Remove on 2.1 release // FIXME Remove on 2.1 release
if (std::strcmp(stateSave.type, "GIG") == 0) if (std::strcmp(stateSave.type, "GIG") == 0)
@@ -2948,8 +2951,12 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
bool loadingAsExternal; bool loadingAsExternal;
std::map<water::String, water::String> mapGroupNamesInternal, mapGroupNamesExternal; std::map<water::String, water::String> mapGroupNamesInternal, mapGroupNamesExternal;


bool hasInternalPositions = false;

if (XmlElement* const elemPatchbay = xmlElement->getChildByName("Patchbay")) if (XmlElement* const elemPatchbay = xmlElement->getChildByName("Patchbay"))
{ {
hasInternalPositions = true;

if (XmlElement* const elemPositions = elemPatchbay->getChildByName("Positions")) if (XmlElement* const elemPositions = elemPatchbay->getChildByName("Positions"))
{ {
String name; String name;
@@ -2976,13 +2983,15 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
ppos.pluginId = patchElem->getIntAttribute("pluginId", -1); ppos.pluginId = patchElem->getIntAttribute("pluginId", -1);
ppos.dealloc = false; ppos.dealloc = false;


if (name.isNotEmpty() && restorePatchbayGroupPosition(false, ppos))
loadingAsExternal = ppos.pluginId >= 0 && isMultiClient;

if (name.isNotEmpty() && restorePatchbayGroupPosition(loadingAsExternal, ppos))
{ {
if (name != ppos.name) if (name != ppos.name)
{ {
carla_stdout("Converted client name '%s' to '%s' for this session", carla_stdout("Converted client name '%s' to '%s' for this session",
name.toRawUTF8(), ppos.name); name.toRawUTF8(), ppos.name);
if (ppos.pluginId >= 0 && pData->options.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS)
if (loadingAsExternal)
mapGroupNamesExternal[name] = ppos.name; mapGroupNamesExternal[name] = ppos.name;
else else
mapGroupNamesInternal[name] = ppos.name; mapGroupNamesInternal[name] = ppos.name;
@@ -3032,7 +3041,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
ppos.pluginId = patchElem->getIntAttribute("pluginId", -1); ppos.pluginId = patchElem->getIntAttribute("pluginId", -1);
ppos.dealloc = false; ppos.dealloc = false;


loadingAsExternal = ppos.pluginId < 0 || !isPatchbay;
loadingAsExternal = ppos.pluginId < 0 || hasInternalPositions || !isPatchbay;


if (name.isNotEmpty() && restorePatchbayGroupPosition(loadingAsExternal, ppos)) if (name.isNotEmpty() && restorePatchbayGroupPosition(loadingAsExternal, ppos))
{ {
@@ -3099,6 +3108,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
{ {
std::map<water::String, water::String>& map(mapGroupNamesInternal); std::map<water::String, water::String>& map(mapGroupNamesInternal);
std::map<water::String, water::String>::iterator it; std::map<water::String, water::String>::iterator it;

if ((it = map.find(sourcePort.upToFirstOccurrenceOf(":", false, false))) != map.end()) if ((it = map.find(sourcePort.upToFirstOccurrenceOf(":", false, false))) != map.end())
sourcePort = it->second + sourcePort.fromFirstOccurrenceOf(":", true, false); sourcePort = it->second + sourcePort.fromFirstOccurrenceOf(":", true, false);
if ((it = map.find(targetPort.upToFirstOccurrenceOf(":", false, false))) != map.end()) if ((it = map.find(targetPort.upToFirstOccurrenceOf(":", false, false))) != map.end())
@@ -3157,6 +3167,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
if (isPatchbay) if (isPatchbay)
continue; continue;
isExternal = false; isExternal = false;
loadingAsExternal = true;
} }
// or load external patchbay connections // or load external patchbay connections
else if (tagName == "ExternalPatchbay") else if (tagName == "ExternalPatchbay")
@@ -3199,7 +3210,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
: mapGroupNamesInternal); : mapGroupNamesInternal);
std::map<water::String, water::String>::iterator it; std::map<water::String, water::String>::iterator it;


if (isExternal && isPatchbay && sourcePort.startsWith("system:capture_"))
if (isExternal && isPatchbay && !loadingAsExternal && sourcePort.startsWith("system:capture_"))
{ {
water::String internalPort = sourcePort.trimCharactersAtStart("system:capture_"); water::String internalPort = sourcePort.trimCharactersAtStart("system:capture_");


@@ -3223,12 +3234,29 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
sourcePort.toRawUTF8(), internalPort.toRawUTF8()); sourcePort.toRawUTF8(), internalPort.toRawUTF8());
sourcePort = internalPort; sourcePort = internalPort;
} }
else if (!isExternal && isMultiClient && sourcePort.startsWith("Audio Input:"))
{
water::String externalPort = sourcePort.trimCharactersAtStart("Audio Input:");

/**/ if (externalPort == "Left")
externalPort = "system:capture_1";
else if (externalPort == "Right")
externalPort = "system:capture_2";
else if (externalPort == "Sidechain")
externalPort = "system:capture_3";
else
externalPort = "system:capture_ " + externalPort.trimCharactersAtStart("Capture ");

carla_stdout("Converted port name '%s' to '%s' for this session",
sourcePort.toRawUTF8(), externalPort.toRawUTF8());
sourcePort = externalPort;
}
else if ((it = map.find(sourcePort.upToFirstOccurrenceOf(":", false, false))) != map.end()) else if ((it = map.find(sourcePort.upToFirstOccurrenceOf(":", false, false))) != map.end())
{ {
sourcePort = it->second + sourcePort.fromFirstOccurrenceOf(":", true, false); sourcePort = it->second + sourcePort.fromFirstOccurrenceOf(":", true, false);
} }


if (isExternal && isPatchbay && targetPort.startsWith("system:playback_"))
if (isExternal && isPatchbay && !loadingAsExternal && targetPort.startsWith("system:playback_"))
{ {
water::String internalPort = targetPort.trimCharactersAtStart("system:playback_"); water::String internalPort = targetPort.trimCharactersAtStart("system:playback_");


@@ -3250,6 +3278,21 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
targetPort.toRawUTF8(), internalPort.toRawUTF8()); targetPort.toRawUTF8(), internalPort.toRawUTF8());
targetPort = internalPort; targetPort = internalPort;
} }
else if (!isExternal && isMultiClient && targetPort.startsWith("Audio Output:"))
{
water::String externalPort = targetPort.trimCharactersAtStart("Audio Output:");

/**/ if (externalPort == "Left")
externalPort = "system:playback_1";
else if (externalPort == "Right")
externalPort = "system:playback_2";
else
externalPort = "system:playback_ " + externalPort.trimCharactersAtStart("Playback ");

carla_stdout("Converted port name '%s' to '%s' for this session",
targetPort.toRawUTF8(), externalPort.toRawUTF8());
targetPort = externalPort;
}
else if ((it = map.find(targetPort.upToFirstOccurrenceOf(":", false, false))) != map.end()) else if ((it = map.find(targetPort.upToFirstOccurrenceOf(":", false, false))) != map.end())
{ {
targetPort = it->second + targetPort.fromFirstOccurrenceOf(":", true, false); targetPort = it->second + targetPort.fromFirstOccurrenceOf(":", true, false);


+ 38
- 29
source/backend/engine/CarlaEngineJack.cpp View File

@@ -1539,8 +1539,7 @@ public:
else else
fTimebaseMaster = false; fTimebaseMaster = false;


if (opts.processMode != ENGINE_PROCESS_MODE_PATCHBAY)
initJackPatchbay(true, false, jackClientName);
initJackPatchbay(true, false, jackClientName, pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY);


jackbridge_set_client_registration_callback(fClient, carla_jack_client_registration_callback, this); jackbridge_set_client_registration_callback(fClient, carla_jack_client_registration_callback, this);
jackbridge_set_port_registration_callback(fClient, carla_jack_port_registration_callback, this); jackbridge_set_port_registration_callback(fClient, carla_jack_port_registration_callback, this);
@@ -2451,7 +2450,7 @@ public:
} }


if (! external) if (! external)
return CarlaEngine::patchbayRefresh(sendHost, sendOSC, false);
CarlaEngine::patchbayRefresh(sendHost, sendOSC, false);
} }


{ {
@@ -2464,7 +2463,8 @@ public:
fUsedConnections.clear(); fUsedConnections.clear();
} }


initJackPatchbay(sendHost, sendOSC, jackbridge_get_client_name(fClient));
initJackPatchbay(sendHost, sendOSC, jackbridge_get_client_name(fClient),
pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY && !external);
return true; return true;
} }


@@ -2786,7 +2786,7 @@ public:
if (groupId == 0) if (groupId == 0)
{ {
if (ppos.pluginId < 0 || pData->options.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) if (ppos.pluginId < 0 || pData->options.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS)
carla_stdout("NOTICE: Previously saved client '%s' not found", ppos.name);
carla_stdout("Previously saved client '%s' not found", ppos.name);
} }
else else
{ {
@@ -3146,13 +3146,6 @@ protected:
{ {
CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0',);


// ignore this if on internal patchbay mode
#if defined(HAVE_LIBLO) && !defined(BUILD_BRIDGE)
if (! (fExternalPatchbayHost || (fExternalPatchbayOsc && pData->osc.isControlRegisteredForTCP()))) return;
#else
if (! fExternalPatchbayHost) return;
#endif

uint groupId; uint groupId;


{ {
@@ -3168,6 +3161,13 @@ protected:
fUsedGroups.list.removeOne(groupNameToId); fUsedGroups.list.removeOne(groupNameToId);
} }


// ignore callback if on internal patchbay mode
#if defined(HAVE_LIBLO) && !defined(BUILD_BRIDGE)
if (! (fExternalPatchbayHost || (fExternalPatchbayOsc && pData->osc.isControlRegisteredForTCP()))) return;
#else
if (! fExternalPatchbayHost) return;
#endif

callback(fExternalPatchbayHost, fExternalPatchbayOsc, callback(fExternalPatchbayHost, fExternalPatchbayOsc,
ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED, ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED,
groupId, groupId,
@@ -3191,13 +3191,6 @@ protected:
const char* const shortPortName, const char* const shortPortName,
const CarlaJackPortHints& jackPortHints) const CarlaJackPortHints& jackPortHints)
{ {
// ignore this if on internal patchbay mode
#if defined(HAVE_LIBLO) && !defined(BUILD_BRIDGE)
if (! (fExternalPatchbayHost || (fExternalPatchbayOsc && pData->osc.isControlRegisteredForTCP()))) return;
#else
if (! fExternalPatchbayHost) return;
#endif

bool groupFound; bool groupFound;
CarlaString groupName(portName); CarlaString groupName(portName);
groupName.truncate(groupName.rfind(shortPortName, &groupFound)-1); groupName.truncate(groupName.rfind(shortPortName, &groupFound)-1);
@@ -3232,7 +3225,16 @@ protected:
std::strncpy(groupData.strVal, groupName, STR_MAX-1); std::strncpy(groupData.strVal, groupName, STR_MAX-1);
groupData.strVal[STR_MAX-1] = '\0'; groupData.strVal[STR_MAX-1] = '\0';
} }
}


// ignore the rest if on internal patchbay mode
#if defined(HAVE_LIBLO) && !defined(BUILD_BRIDGE)
if (! (fExternalPatchbayHost || (fExternalPatchbayOsc && pData->osc.isControlRegisteredForTCP()))) return;
#else
if (! fExternalPatchbayHost) return;
#endif

{
uint canvasPortFlags = 0x0; uint canvasPortFlags = 0x0;
canvasPortFlags |= jackPortHints.isInput ? PATCHBAY_PORT_IS_INPUT : 0x0; canvasPortFlags |= jackPortHints.isInput ? PATCHBAY_PORT_IS_INPUT : 0x0;


@@ -3698,10 +3700,8 @@ private:
char strVal[STR_MAX]; char strVal[STR_MAX];
}; };


void initJackPatchbay(const bool sendHost, const bool sendOSC, const char* const ourName)
void initJackPatchbay(const bool sendHost, const bool sendOSC, const char* const ourName, const bool groupsOnly)
{ {
CARLA_SAFE_ASSERT_RETURN(pData->options.processMode != ENGINE_PROCESS_MODE_PATCHBAY ||
(fExternalPatchbayHost && sendHost) || (fExternalPatchbayOsc && sendOSC),);
CARLA_SAFE_ASSERT_RETURN(ourName != nullptr && ourName[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(ourName != nullptr && ourName[0] != '\0',);


fLastPatchbaySetGroupPos.clear(); fLastPatchbaySetGroupPos.clear();
@@ -3775,15 +3775,21 @@ private:


fUsedGroups.list.append(groupNameToId); fUsedGroups.list.append(groupNameToId);


GroupToIdData groupData;
groupData.id = groupId;
groupData.icon = icon;
groupData.pluginId = pluginId;
std::strncpy(groupData.strVal, groupName, STR_MAX-1);
groupData.strVal[STR_MAX-1] = '\0';
groupCallbackData.append(groupData);
if (! groupsOnly)
{
GroupToIdData groupData;
groupData.id = groupId;
groupData.icon = icon;
groupData.pluginId = pluginId;
std::strncpy(groupData.strVal, groupName, STR_MAX-1);
groupData.strVal[STR_MAX-1] = '\0';
groupCallbackData.append(groupData);
}
} }


if (groupsOnly)
continue;

uint canvasPortFlags = 0x0; uint canvasPortFlags = 0x0;
canvasPortFlags |= jackPortHints.isInput ? PATCHBAY_PORT_IS_INPUT : 0x0; canvasPortFlags |= jackPortHints.isInput ? PATCHBAY_PORT_IS_INPUT : 0x0;


@@ -3814,6 +3820,9 @@ private:
jackbridge_free(ports); jackbridge_free(ports);
} }


if (groupsOnly)
return;

// query connections, after all ports are in place // query connections, after all ports are in place
if (const char** const ports = jackbridge_get_ports(fClient, nullptr, nullptr, JackPortIsOutput)) if (const char** const ports = jackbridge_get_ports(fClient, nullptr, nullptr, JackPortIsOutput))
{ {


Loading…
Cancel
Save