Browse Source

VST3: Properly describe provided classes, fixes Ableton; Cleanup

pull/381/head
falkTX 2 years ago
parent
commit
a27d7a9b67
1 changed files with 123 additions and 118 deletions
  1. +123
    -118
      distrho/src/DistrhoPluginVST3.cpp

+ 123
- 118
distrho/src/DistrhoPluginVST3.cpp View File

@@ -603,110 +603,10 @@ public:
#endif
{
#if DISTRHO_PLUGIN_NUM_INPUTS > 0
std::vector<uint32_t> visitedInputPortGroups;
for (uint32_t i=0; i<DISTRHO_PLUGIN_NUM_INPUTS; ++i)
{
AudioPortWithBusId& port(fPlugin.getAudioPort(true, i));

if (port.groupId != kPortGroupNone)
{
const std::vector<uint32_t>::iterator end = visitedInputPortGroups.end();
if (std::find(visitedInputPortGroups.begin(), end, port.groupId) == end)
{
visitedInputPortGroups.push_back(port.groupId);
++inputBuses.numGroups;
}
continue;
}

if (port.hints & kAudioPortIsCV)
++inputBuses.numCV;
else
++inputBuses.numMainAudio;

if (port.hints & kAudioPortIsSidechain)
++inputBuses.numSidechain;
}

if (inputBuses.numMainAudio != 0)
inputBuses.audio = 1;
if (inputBuses.numSidechain != 0)
inputBuses.sidechain = 1;

uint32_t cvInputBusId = 0;
for (uint32_t i=0; i<DISTRHO_PLUGIN_NUM_INPUTS; ++i)
{
AudioPortWithBusId& port(fPlugin.getAudioPort(true, i));

if (port.groupId != kPortGroupNone)
{
port.busId = port.groupId;
}
else
{
if (port.hints & kAudioPortIsCV)
port.busId = inputBuses.audio + inputBuses.sidechain + cvInputBusId++;
else if (port.hints & kAudioPortIsSidechain)
port.busId = inputBuses.audio;
else
port.busId = 0;

port.busId += inputBuses.numGroups;
}
}
fillInBusInfoDetails<true>();
#endif
#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0
std::vector<uint32_t> visitedOutputPortGroups;
for (uint32_t i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS; ++i)
{
AudioPortWithBusId& port(fPlugin.getAudioPort(false, i));

if (port.groupId != kPortGroupNone)
{
const std::vector<uint32_t>::iterator end = visitedOutputPortGroups.end();
if (std::find(visitedOutputPortGroups.begin(), end, port.groupId) == end)
{
visitedOutputPortGroups.push_back(port.groupId);
++outputBuses.numGroups;
}
continue;
}

if (port.hints & kAudioPortIsCV)
++outputBuses.numCV;
else
++outputBuses.numMainAudio;

if (port.hints & kAudioPortIsSidechain)
++outputBuses.numSidechain;
}

if (outputBuses.numMainAudio != 0)
outputBuses.audio = 1;
if (outputBuses.numSidechain != 0)
outputBuses.sidechain = 1;

uint32_t cvOutputBusId = 0;
for (uint32_t i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS; ++i)
{
AudioPortWithBusId& port(fPlugin.getAudioPort(false, i));

if (port.groupId != kPortGroupNone)
{
port.busId = port.groupId;
}
else
{
if (port.hints & kAudioPortIsCV)
port.busId = outputBuses.audio + outputBuses.sidechain + cvOutputBusId++;
else if (port.hints & kAudioPortIsSidechain)
port.busId = outputBuses.audio;
else
port.busId = 0;

port.busId += outputBuses.numGroups;
}
}
fillInBusInfoDetails<false>();
#endif

if (const uint32_t extraParameterCount = fParameterCount + kVst3InternalParameterBaseCount)
@@ -1484,7 +1384,10 @@ public:
AudioPortWithBusId& port(fPlugin.getAudioPort(true, i));

if (port.busId != busId)
{
d_stdout("port.busId != busId: %d %d", port.busId, busId);
continue;
}

v3_speaker_arrangement arr;

@@ -1532,7 +1435,7 @@ public:
return V3_OK;
}
#endif // DISTRHO_PLUGIN_NUM_INPUTS
d_stdout("invalid bus arrangement %d", busIndex);
d_stdout("invalid input bus arrangement %d", busIndex);
return V3_INVALID_ARG;
}
else
@@ -1543,7 +1446,10 @@ public:
AudioPortWithBusId& port(fPlugin.getAudioPort(false, i));

if (port.busId != busId)
{
d_stdout("port.busId != busId: %d %d", port.busId, busId);
continue;
}

v3_speaker_arrangement arr;

@@ -1591,7 +1497,7 @@ public:
return V3_OK;
}
#endif // DISTRHO_PLUGIN_NUM_OUTPUTS
d_stdout("invalid bus arrangement %d", busIndex);
d_stdout("invalid output bus arrangement %d", busIndex);
return V3_INVALID_ARG;
}
}
@@ -2724,6 +2630,71 @@ private:
TimePosition fTimePosition;
#endif

// ----------------------------------------------------------------------------------------------------------------
// bus related helper functions called on constructor

#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0
template<bool isInput>
void fillInBusInfoDetails()
{
constexpr const uint32_t numPorts = isInput ? DISTRHO_PLUGIN_NUM_INPUTS : DISTRHO_PLUGIN_NUM_OUTPUTS;
BusInfo& bufInfo(isInput ? inputBuses : outputBuses);

std::vector<uint32_t> visitedPortGroups;
for (uint32_t i=0; i<numPorts; ++i)
{
AudioPortWithBusId& port(fPlugin.getAudioPort(isInput, i));

if (port.groupId != kPortGroupNone)
{
const std::vector<uint32_t>::iterator end = visitedPortGroups.end();
if (std::find(visitedPortGroups.begin(), end, port.groupId) == end)
{
visitedPortGroups.push_back(port.groupId);
++bufInfo.numGroups;
}
continue;
}

if (port.hints & kAudioPortIsCV)
++bufInfo.numCV;
else
++bufInfo.numMainAudio;

if (port.hints & kAudioPortIsSidechain)
++bufInfo.numSidechain;
}

if (bufInfo.numMainAudio != 0)
bufInfo.audio = 1;
if (bufInfo.numSidechain != 0)
bufInfo.sidechain = 1;

uint32_t busIdFromGroup = 0;
uint32_t busIdForCV = 0;
for (uint32_t i=0; i<DISTRHO_PLUGIN_NUM_INPUTS; ++i)
{
AudioPortWithBusId& port(fPlugin.getAudioPort(isInput, i));

if (port.groupId != kPortGroupNone)
{
port.busId = busIdFromGroup++;
}
else
{
if (port.hints & kAudioPortIsCV)
port.busId = bufInfo.audio + bufInfo.sidechain + busIdForCV++;
else if (port.hints & kAudioPortIsSidechain)
port.busId = bufInfo.audio;
else
port.busId = 0;

port.busId += bufInfo.numGroups;
}
}
}
#endif

// ----------------------------------------------------------------------------------------------------------------
// helper functions called during process, cannot block

@@ -4609,19 +4580,33 @@ struct dpf_factory : v3_plugin_factory_cpp {
static int32_t V3_API num_classes(void*)
{
d_stdout("dpf_factory::num_classes");
return 1;
#if DPF_VST3_USES_SEPARATE_CONTROLLER
return 2; // factory can create component and edit-controller
#else
return 1; // factory can only create component, edit-controller must be casted
#endif
}

static v3_result V3_API get_class_info(void*, const int32_t idx, v3_class_info* const info)
{
d_stdout("dpf_factory::get_class_info => %i %p", idx, info);
std::memset(info, 0, sizeof(*info));
DISTRHO_SAFE_ASSERT_RETURN(idx == 0, V3_INVALID_ARG);
DISTRHO_SAFE_ASSERT_RETURN(idx <= 2, V3_INVALID_ARG);

info->cardinality = 0x7FFFFFFF;
std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid));
DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category));
DISTRHO_NAMESPACE::strncpy(info->name, getPluginInfo().getName(), ARRAY_SIZE(info->name));

if (idx == 0)
{
std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid));
DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category));
}
else
{
std::memcpy(info->class_id, dpf_tuid_controller, sizeof(v3_tuid));
DISTRHO_NAMESPACE::strncpy(info->category, "Component Controller Class", ARRAY_SIZE(info->category));
}

return V3_OK;
}

@@ -4671,19 +4656,29 @@ struct dpf_factory : v3_plugin_factory_cpp {
{
d_stdout("dpf_factory::get_class_info_2 => %i %p", idx, info);
std::memset(info, 0, sizeof(*info));
DISTRHO_SAFE_ASSERT_RETURN(idx == 0, V3_INVALID_ARG);
DISTRHO_SAFE_ASSERT_RETURN(idx <= 2, V3_INVALID_ARG);

info->cardinality = 0x7FFFFFFF;
#if DPF_VST3_USES_SEPARATE_CONTROLLER || !DISTRHO_PLUGIN_HAS_UI
#if DPF_VST3_USES_SEPARATE_CONTROLLER || !DISTRHO_PLUGIN_HAS_UI
info->class_flags = V3_DISTRIBUTABLE;
#endif
std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid));
DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category));
#endif
DISTRHO_NAMESPACE::strncpy(info->sub_categories, getPluginCategories(), ARRAY_SIZE(info->sub_categories));
DISTRHO_NAMESPACE::strncpy(info->name, getPluginInfo().getName(), ARRAY_SIZE(info->name));
DISTRHO_NAMESPACE::strncpy(info->vendor, getPluginInfo().getMaker(), ARRAY_SIZE(info->vendor));
DISTRHO_NAMESPACE::strncpy(info->version, getPluginVersion(), ARRAY_SIZE(info->version));
DISTRHO_NAMESPACE::strncpy(info->sdk_version, "Travesty 3.7.4", ARRAY_SIZE(info->sdk_version));

if (idx == 0)
{
std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid));
DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category));
}
else
{
std::memcpy(info->class_id, dpf_tuid_controller, sizeof(v3_tuid));
DISTRHO_NAMESPACE::strncpy(info->category, "Component Controller Class", ARRAY_SIZE(info->category));
}

return V3_OK;
}

@@ -4694,19 +4689,29 @@ struct dpf_factory : v3_plugin_factory_cpp {
{
d_stdout("dpf_factory::get_class_info_utf16 => %i %p", idx, info);
std::memset(info, 0, sizeof(*info));
DISTRHO_SAFE_ASSERT_RETURN(idx == 0, V3_INVALID_ARG);
DISTRHO_SAFE_ASSERT_RETURN(idx <= 2, V3_INVALID_ARG);

info->cardinality = 0x7FFFFFFF;
#if DPF_VST3_USES_SEPARATE_CONTROLLER || !DISTRHO_PLUGIN_HAS_UI
#if DPF_VST3_USES_SEPARATE_CONTROLLER || !DISTRHO_PLUGIN_HAS_UI
info->class_flags = V3_DISTRIBUTABLE;
#endif
std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid));
DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category));
#endif
DISTRHO_NAMESPACE::strncpy(info->sub_categories, getPluginCategories(), ARRAY_SIZE(info->sub_categories));
DISTRHO_NAMESPACE::strncpy_utf16(info->name, getPluginInfo().getName(), ARRAY_SIZE(info->name));
DISTRHO_NAMESPACE::strncpy_utf16(info->vendor, getPluginInfo().getMaker(), ARRAY_SIZE(info->vendor));
DISTRHO_NAMESPACE::strncpy_utf16(info->version, getPluginVersion(), ARRAY_SIZE(info->version));
DISTRHO_NAMESPACE::strncpy_utf16(info->sdk_version, "Travesty 3.7.4", ARRAY_SIZE(info->sdk_version));

if (idx == 0)
{
std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid));
DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category));
}
else
{
std::memcpy(info->class_id, dpf_tuid_controller, sizeof(v3_tuid));
DISTRHO_NAMESPACE::strncpy(info->category, "Component Controller Class", ARRAY_SIZE(info->category));
}

return V3_OK;
}



Loading…
Cancel
Save