commit 79c6601fd435efd98017a9ea42c18a54bc2cc82d
parent 639c5100f2ac0a8ce2077f29020e91f673d7c2f8
Author: falkTX <falktx@falktx.com>
Date: Wed, 10 Aug 2022 02:00:41 +0100
Try to make sense of vst3 non-conventional speaker arrangements
Diffstat:
1 file changed, 28 insertions(+), 7 deletions(-)
diff --git a/distrho/src/DistrhoPluginVST3.cpp b/distrho/src/DistrhoPluginVST3.cpp
@@ -2619,6 +2619,24 @@ private:
return V3_OK;
}
+ // someone please tell me what is up with these..
+ static inline v3_speaker_arrangement indexToSpeaker(const uint32_t index)
+ {
+ switch (index)
+ {
+ case 0: return 1ull << 23ull;
+ case 1: return 1ull << 22ull;
+ case 2: return 1ull << 20ull;
+ case 3: return 1ull << 21ull;
+ case 4: return 1ull << 28ull;
+ case 5: return 1ull << 29ull;
+ case 6: return 1ull << 30ull;
+ case 7: return 1ull << 31ull;
+ case 8: return 1ull << 32ull;
+ default: return 1ull << (index - 8ull + 33ull);
+ }
+ }
+
template<bool isInput>
v3_speaker_arrangement getSpeakerArrangementForAudioPort(const BusInfo& busInfo, const uint32_t portGroupId, uint32_t busId) const noexcept
{
@@ -2636,7 +2654,7 @@ private:
{
const uint32_t numPortsInBus = fPlugin.getAudioPortCountWithGroupId(isInput, busId);
for (uint32_t j=0; j<numPortsInBus; ++j)
- arr |= 1ull << (j + 33ull);
+ arr |= indexToSpeaker(j);
}
else
{
@@ -2644,19 +2662,17 @@ private:
if (busInfo.audio != 0 && busId == 0)
{
- arr = 0x0;
for (uint32_t j=0; j<busInfo.audioPorts; ++j)
- arr |= 1ull << (j + 33ull);
+ arr |= indexToSpeaker(j);
}
else if (busInfo.sidechain != 0 && busId == busInfo.audio)
{
- arr = 0x0;
for (uint32_t j=0; j<busInfo.sidechainPorts; ++j)
- arr |= 1ull << (busInfo.audioPorts + j + 33ull);
+ arr |= indexToSpeaker(busInfo.audioPorts + j);
}
else
{
- arr = 1ull << (busInfo.audioPorts + busInfo.sidechainPorts + busId + 33ull);
+ arr = indexToSpeaker(busInfo.audioPorts + busInfo.sidechainPorts + busId);
}
}
@@ -2668,6 +2684,7 @@ private:
{
constexpr const uint32_t numPorts = isInput ? DISTRHO_PLUGIN_NUM_INPUTS : DISTRHO_PLUGIN_NUM_OUTPUTS;
const BusInfo& busInfo(isInput ? inputBuses : outputBuses);
+ /*
const bool* const enabledPorts = isInput
#if DISTRHO_PLUGIN_NUM_INPUTS > 0
? fEnabledInputs
@@ -2679,6 +2696,7 @@ private:
#else
: nullptr;
#endif
+ */
for (uint32_t i=0; i<numPorts; ++i)
{
@@ -2690,12 +2708,14 @@ private:
continue;
}
+ /* FIXME should we disable this by default?
if (!enabledPorts[i])
{
*speaker = 0;
// d_stdout("getAudioBusArrangement %d %d not enabled", i, busId);
return true;
}
+ */
*speaker = getSpeakerArrangementForAudioPort<isInput>(busInfo, port.groupId, busId);
// d_stdout("getAudioBusArrangement %d enabled by value %lx", busId, *speaker);
@@ -2744,7 +2764,8 @@ private:
const v3_speaker_arrangement earr = getSpeakerArrangementForAudioPort<isInput>(busInfo, port.groupId, busId);
// fail if host tries to map it to anything else
- if (earr != arr && arr != 0)
+ // FIXME should we allow to map speaker to zero as a way to disable it?
+ if (earr != arr /* && arr != 0 */)
{
ok = false;
continue;