@@ -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()) | |||
{ | |||
@@ -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; | |||
@@ -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: | |||