commit a27d7a9b67a15443ae5911dbf5c14a299d303017
parent 72c7dc1e2fe40333b437846456e1a3448e6dfb52
Author: falkTX <falktx@falktx.com>
Date: Sun, 7 Aug 2022 01:15:36 +0100
VST3: Properly describe provided classes, fixes Ableton; Cleanup
Diffstat:
1 file changed, 123 insertions(+), 118 deletions(-)
diff --git a/distrho/src/DistrhoPluginVST3.cpp b/distrho/src/DistrhoPluginVST3.cpp
@@ -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;
}
}
@@ -2725,6 +2631,71 @@ private:
#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
void updateParametersFromProcessing(v3_param_changes** const outparamsptr, const int32_t offset)
@@ -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;
}