Browse Source

Use plugin audio port names in bridge mode

Fixes #344
tags/1.9.7
falkTX 8 years ago
parent
commit
e3960d91d0
3 changed files with 134 additions and 4 deletions
  1. +51
    -2
      source/backend/engine/CarlaEngineBridge.cpp
  2. +65
    -2
      source/backend/plugin/CarlaPluginBridge.cpp
  3. +18
    -0
      source/utils/CarlaBridgeUtils.hpp

+ 51
- 2
source/backend/engine/CarlaEngineBridge.cpp View File

@@ -561,6 +561,7 @@ public:
char bufStr[STR_MAX+1];
uint32_t bufStrSize;

const CarlaEngineClient* const client(plugin->getEngineClient());
const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);

// kPluginBridgeNonRtServerPluginInfo1
@@ -609,13 +610,50 @@ public:

// kPluginBridgeNonRtServerAudioCount
{
const uint32_t aIns = plugin->getAudioInCount();
const uint32_t aOuts = plugin->getAudioOutCount();

// uint/ins, uint/outs
fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerAudioCount);
fShmNonRtServerControl.writeUInt(plugin->getAudioInCount());
fShmNonRtServerControl.writeUInt(plugin->getAudioOutCount());
fShmNonRtServerControl.writeUInt(aIns);
fShmNonRtServerControl.writeUInt(aOuts);
fShmNonRtServerControl.commitWrite();

// kPluginBridgeNonRtServerPortName
for (uint32_t i=0; i<aIns; ++i)
{
const char* const portName(client->getAudioPortName(true, i));
CARLA_SAFE_ASSERT_CONTINUE(portName != nullptr && portName[0] != '\0');

// byte/type, uint/index, uint/size, str[] (name)
fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerPortName);
fShmNonRtServerControl.writeByte(kPluginBridgePortAudioInput);
fShmNonRtServerControl.writeUInt(i);

bufStrSize = std::strlen(portName);
fShmNonRtServerControl.writeUInt(bufStrSize);
fShmNonRtServerControl.writeCustomData(portName, bufStrSize);
}

// kPluginBridgeNonRtServerPortName
for (uint32_t i=0; i<aOuts; ++i)
{
const char* const portName(client->getAudioPortName(false, i));
CARLA_SAFE_ASSERT_CONTINUE(portName != nullptr && portName[0] != '\0');

// byte/type, uint/index, uint/size, str[] (name)
fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerPortName);
fShmNonRtServerControl.writeByte(kPluginBridgePortAudioOutput);
fShmNonRtServerControl.writeUInt(i);

bufStrSize = std::strlen(portName);
fShmNonRtServerControl.writeUInt(bufStrSize);
fShmNonRtServerControl.writeCustomData(portName, bufStrSize);
}
}

fShmNonRtServerControl.waitIfDataIsReachingLimit();

// kPluginBridgeNonRtServerMidiCount
{
// uint/ins, uint/outs
@@ -627,6 +665,17 @@ public:

fShmNonRtServerControl.waitIfDataIsReachingLimit();

// kPluginBridgeNonRtServerCvCount
{
// uint/ins, uint/outs
fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerCvCount);
fShmNonRtServerControl.writeUInt(plugin->getCVInCount());
fShmNonRtServerControl.writeUInt(plugin->getCVOutCount());
fShmNonRtServerControl.commitWrite();
}

fShmNonRtServerControl.waitIfDataIsReachingLimit();

// kPluginBridgeNonRtServerParameter*
if (const uint32_t count = plugin->getParameterCount())
{


+ 65
- 2
source/backend/plugin/CarlaPluginBridge.cpp View File

@@ -1256,7 +1256,11 @@ public:
portName += ":";
}

if (fInfo.aIns > 1)
if (fInfo.aInNames != nullptr && fInfo.aInNames[j] != nullptr)
{
portName += fInfo.aInNames[j];
}
else if (fInfo.aIns > 1)
{
portName += "input_";
portName += CarlaString(j+1);
@@ -1281,7 +1285,11 @@ public:
portName += ":";
}

if (fInfo.aOuts > 1)
if (fInfo.aOutNames != nullptr && fInfo.aOutNames[j] != nullptr)
{
portName += fInfo.aOutNames[j];
}
else if (fInfo.aOuts > 1)
{
portName += "output_";
portName += CarlaString(j+1);
@@ -1295,6 +1303,8 @@ public:
pData->audioOut.ports[j].rindex = j;
}

// TODO - MIDI

// TODO - CV

if (needsCtrlIn)
@@ -2049,6 +2059,22 @@ public:
// uint/ins, uint/outs
fInfo.aIns = fShmNonRtServerControl.readUInt();
fInfo.aOuts = fShmNonRtServerControl.readUInt();

CARLA_SAFE_ASSERT(fInfo.aInNames == nullptr);
CARLA_SAFE_ASSERT(fInfo.aOutNames == nullptr);

if (fInfo.aIns > 0)
{
fInfo.aInNames = new const char*[fInfo.aIns];
carla_zeroPointers(fInfo.aInNames, fInfo.aIns);
}

if (fInfo.aOuts > 0)
{
fInfo.aOutNames = new const char*[fInfo.aOuts];
carla_zeroPointers(fInfo.aOutNames, fInfo.aOuts);
}

} break;

case kPluginBridgeNonRtServerMidiCount: {
@@ -2057,6 +2083,12 @@ public:
fInfo.mOuts = fShmNonRtServerControl.readUInt();
} break;

case kPluginBridgeNonRtServerCvCount: {
// uint/ins, uint/outs
fInfo.cvIns = fShmNonRtServerControl.readUInt();
fInfo.cvOuts = fShmNonRtServerControl.readUInt();
} break;

case kPluginBridgeNonRtServerParameterCount: {
// uint/count
const uint32_t count = fShmNonRtServerControl.readUInt();
@@ -2106,6 +2138,33 @@ public:

} break;

case kPluginBridgeNonRtServerPortName: {
// byte/type, uint/index, uint/size, str[] (name)
const uint8_t portType = fShmNonRtServerControl.readByte();
const uint32_t index = fShmNonRtServerControl.readUInt();

// name
const uint32_t nameSize(fShmNonRtServerControl.readUInt());
char* const name = new char[nameSize+1];
carla_zeroChars(name, nameSize+1);
fShmNonRtServerControl.readCustomData(name, nameSize);

CARLA_SAFE_ASSERT_BREAK(portType > kPluginBridgePortNull && portType < kPluginBridgePortTypeCount);

switch (portType)
{
case kPluginBridgePortAudioInput:
CARLA_SAFE_ASSERT_BREAK(index < fInfo.aIns);
fInfo.aInNames[index] = name;
break;
case kPluginBridgePortAudioOutput:
CARLA_SAFE_ASSERT_BREAK(index < fInfo.aOuts);
fInfo.aOutNames[index] = name;
break;
}

} break;

case kPluginBridgeNonRtServerParameterData1: {
// uint/index, int/rindex, uint/type, uint/hints, int/cc
const uint32_t index = fShmNonRtServerControl.readUInt();
@@ -2619,6 +2678,8 @@ private:
CarlaString label;
CarlaString maker;
CarlaString copyright;
const char** aInNames;
const char** aOutNames;
std::vector<uint8_t> chunk;

Info()
@@ -2634,6 +2695,8 @@ private:
label(),
maker(),
copyright(),
aInNames(nullptr),
aOutNames(nullptr),
chunk() {}
} fInfo;



+ 18
- 0
source/utils/CarlaBridgeUtils.hpp View File

@@ -87,9 +87,11 @@ enum PluginBridgeNonRtServerOpcode {
kPluginBridgeNonRtServerPluginInfo2, // uint/size, str[] (realName), uint/size, str[] (label), uint/size, str[] (maker), uint/size, str[] (copyright)
kPluginBridgeNonRtServerAudioCount, // uint/ins, uint/outs
kPluginBridgeNonRtServerMidiCount, // uint/ins, uint/outs
kPluginBridgeNonRtServerCvCount, // uint/ins, uint/outs
kPluginBridgeNonRtServerParameterCount, // uint/count
kPluginBridgeNonRtServerProgramCount, // uint/count
kPluginBridgeNonRtServerMidiProgramCount, // uint/count
kPluginBridgeNonRtServerPortName, // byte/type, uint/index, uint/size, str[] (name)
kPluginBridgeNonRtServerParameterData1, // uint/index, int/rindex, uint/type, uint/hints, short/cc
kPluginBridgeNonRtServerParameterData2, // uint/index, uint/size, str[] (name), uint/size, str[] (symbol), uint/size, str[] (unit)
kPluginBridgeNonRtServerParameterRanges, // uint/index, float/def, float/min, float/max, float/step, float/stepSmall, float/stepLarge
@@ -109,6 +111,18 @@ enum PluginBridgeNonRtServerOpcode {
kPluginBridgeNonRtServerError // uint/size, str[]
};

// used for kPluginBridgeNonRtServerPortName
enum PluginBridgePortType {
kPluginBridgePortNull = 0,
kPluginBridgePortAudioInput,
kPluginBridgePortAudioOutput,
kPluginBridgePortCvInput,
kPluginBridgePortCvOutput,
kPluginBridgePortMidiInput,
kPluginBridgePortMidiOutput,
kPluginBridgePortTypeCount
};

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

struct BridgeSemaphore {
@@ -271,12 +285,16 @@ const char* PluginBridgeNonRtServerOpcode2str(const PluginBridgeNonRtServerOpcod
return "kPluginBridgeNonRtServerAudioCount";
case kPluginBridgeNonRtServerMidiCount:
return "kPluginBridgeNonRtServerMidiCount";
case kPluginBridgeNonRtServerCvCount:
return "kPluginBridgeNonRtServerCvCount";
case kPluginBridgeNonRtServerParameterCount:
return "kPluginBridgeNonRtServerParameterCount";
case kPluginBridgeNonRtServerProgramCount:
return "kPluginBridgeNonRtServerProgramCount";
case kPluginBridgeNonRtServerMidiProgramCount:
return "kPluginBridgeNonRtServerMidiProgramCount";
case kPluginBridgeNonRtServerPortName:
return "kPluginBridgeNonRtServerPortName";
case kPluginBridgeNonRtServerParameterData1:
return "kPluginBridgeNonRtServerParameterData1";
case kPluginBridgeNonRtServerParameterData2:


Loading…
Cancel
Save