1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

VST3: Added compatibility with more speaker arrangements

This commit is contained in:
Tom Poole 2019-01-24 16:53:51 +00:00
parent 3661d928c1
commit f6aa82af27
3 changed files with 166 additions and 85 deletions

View file

@ -75,6 +75,27 @@ String AudioChannelSet::getChannelTypeName (AudioChannelSet::ChannelType type)
case ambisonicZ: return NEEDS_TRANS("Ambisonic Z");
case topSideLeft: return NEEDS_TRANS("Top Side Left");
case topSideRight: return NEEDS_TRANS("Top Side Right");
case ambisonicACN4: return NEEDS_TRANS("Ambisonic 4");
case ambisonicACN5: return NEEDS_TRANS("Ambisonic 5");
case ambisonicACN6: return NEEDS_TRANS("Ambisonic 6");
case ambisonicACN7: return NEEDS_TRANS("Ambisonic 7");
case ambisonicACN8: return NEEDS_TRANS("Ambisonic 8");
case ambisonicACN9: return NEEDS_TRANS("Ambisonic 9");
case ambisonicACN10: return NEEDS_TRANS("Ambisonic 10");
case ambisonicACN11: return NEEDS_TRANS("Ambisonic 11");
case ambisonicACN12: return NEEDS_TRANS("Ambisonic 12");
case ambisonicACN13: return NEEDS_TRANS("Ambisonic 13");
case ambisonicACN14: return NEEDS_TRANS("Ambisonic 14");
case ambisonicACN15: return NEEDS_TRANS("Ambisonic 15");
case bottomFrontLeft: return NEEDS_TRANS("Bottom Front Left");
case bottomFrontCentre: return NEEDS_TRANS("Bottom Front Centre");
case bottomFrontRight: return NEEDS_TRANS("Bottom Front Right");
case bottomSideLeft: return NEEDS_TRANS("Bottom Side Left");
case bottomSideRight: return NEEDS_TRANS("Bottom Side Right");
case bottomRearLeft: return NEEDS_TRANS("Bottom Rear Left");
case bottomRearCentre: return NEEDS_TRANS("Bottom Rear Centre");
case bottomRearRight: return NEEDS_TRANS("Bottom Rear Right");
case discreteChannel0: return NEEDS_TRANS("Discrete channel");
default: break;
}
@ -115,8 +136,28 @@ String AudioChannelSet::getAbbreviatedChannelTypeName (AudioChannelSet::ChannelT
case ambisonicACN1: return "ACN1";
case ambisonicACN2: return "ACN2";
case ambisonicACN3: return "ACN3";
case ambisonicACN4: return "ACN4";
case ambisonicACN5: return "ACN5";
case ambisonicACN6: return "ACN6";
case ambisonicACN7: return "ACN7";
case ambisonicACN8: return "ACN8";
case ambisonicACN9: return "ACN9";
case ambisonicACN10: return "ACN10";
case ambisonicACN11: return "ACN11";
case ambisonicACN12: return "ACN12";
case ambisonicACN13: return "ACN13";
case ambisonicACN14: return "ACN14";
case ambisonicACN15: return "ACN15";
case topSideLeft: return "Tsl";
case topSideRight: return "Tsr";
case bottomFrontLeft: return "Bfl";
case bottomFrontCentre: return "Bfc";
case bottomFrontRight: return "Bfr";
case bottomSideLeft: return "Bsl";
case bottomSideRight: return "Bsr";
case bottomRearLeft: return "Brl";
case bottomRearCentre: return "Brc";
case bottomRearRight: return "Brr";
default: break;
}
@ -132,36 +173,59 @@ AudioChannelSet::ChannelType AudioChannelSet::getChannelTypeFromAbbreviation (co
return static_cast<AudioChannelSet::ChannelType> (static_cast<int> (discreteChannel0)
+ abbr.getIntValue() + 1);
if (abbr == "L") return left;
if (abbr == "R") return right;
if (abbr == "C") return centre;
if (abbr == "Lfe") return LFE;
if (abbr == "Ls") return leftSurround;
if (abbr == "Rs") return rightSurround;
if (abbr == "Lc") return leftCentre;
if (abbr == "Rc") return rightCentre;
if (abbr == "Cs") return centreSurround;
if (abbr == "Lrs") return leftSurroundRear;
if (abbr == "Rrs") return rightSurroundRear;
if (abbr == "Tm") return topMiddle;
if (abbr == "Tfl") return topFrontLeft;
if (abbr == "Tfc") return topFrontCentre;
if (abbr == "Tfr") return topFrontRight;
if (abbr == "Trl") return topRearLeft;
if (abbr == "Trc") return topRearCentre;
if (abbr == "Trr") return topRearRight;
if (abbr == "Wl") return wideLeft;
if (abbr == "Wr") return wideRight;
if (abbr == "Lfe2") return LFE2;
if (abbr == "Lss") return leftSurroundSide;
if (abbr == "Rss") return rightSurroundSide;
if (abbr == "W") return ambisonicW;
if (abbr == "X") return ambisonicX;
if (abbr == "Y") return ambisonicY;
if (abbr == "Z") return ambisonicZ;
if (abbr == "Tsl") return topSideLeft;
if (abbr == "Tsr") return topSideRight;
if (abbr == "L") return left;
if (abbr == "R") return right;
if (abbr == "C") return centre;
if (abbr == "Lfe") return LFE;
if (abbr == "Ls") return leftSurround;
if (abbr == "Rs") return rightSurround;
if (abbr == "Lc") return leftCentre;
if (abbr == "Rc") return rightCentre;
if (abbr == "Cs") return centreSurround;
if (abbr == "Lrs") return leftSurroundRear;
if (abbr == "Rrs") return rightSurroundRear;
if (abbr == "Tm") return topMiddle;
if (abbr == "Tfl") return topFrontLeft;
if (abbr == "Tfc") return topFrontCentre;
if (abbr == "Tfr") return topFrontRight;
if (abbr == "Trl") return topRearLeft;
if (abbr == "Trc") return topRearCentre;
if (abbr == "Trr") return topRearRight;
if (abbr == "Wl") return wideLeft;
if (abbr == "Wr") return wideRight;
if (abbr == "Lfe2") return LFE2;
if (abbr == "Lss") return leftSurroundSide;
if (abbr == "Rss") return rightSurroundSide;
if (abbr == "W") return ambisonicW;
if (abbr == "X") return ambisonicX;
if (abbr == "Y") return ambisonicY;
if (abbr == "Z") return ambisonicZ;
if (abbr == "ACN0") return ambisonicACN0;
if (abbr == "ACN1") return ambisonicACN1;
if (abbr == "ACN2") return ambisonicACN2;
if (abbr == "ACN3") return ambisonicACN3;
if (abbr == "ACN4") return ambisonicACN4;
if (abbr == "ACN5") return ambisonicACN5;
if (abbr == "ACN6") return ambisonicACN6;
if (abbr == "ACN7") return ambisonicACN7;
if (abbr == "ACN8") return ambisonicACN8;
if (abbr == "ACN9") return ambisonicACN9;
if (abbr == "ACN10") return ambisonicACN10;
if (abbr == "ACN11") return ambisonicACN11;
if (abbr == "ACN12") return ambisonicACN12;
if (abbr == "ACN13") return ambisonicACN13;
if (abbr == "ACN14") return ambisonicACN14;
if (abbr == "ACN15") return ambisonicACN15;
if (abbr == "Tsl") return topSideLeft;
if (abbr == "Tsr") return topSideRight;
if (abbr == "Bfl") return bottomFrontLeft;
if (abbr == "Bfc") return bottomFrontCentre;
if (abbr == "Bfr") return bottomFrontRight;
if (abbr == "Bsl") return bottomSideLeft;
if (abbr == "Bsr") return bottomSideRight;
if (abbr == "Brl") return bottomRearLeft;
if (abbr == "Brc") return bottomRearCentre;
if (abbr == "Brr") return bottomRearRight;
return unknown;
}

View file

@ -365,7 +365,21 @@ public:
ambisonicZ = ambisonicACN2, /**< Same as first-order ambisonic channel number 2. */
//==============================================================================
discreteChannel0 = 64 /**< Non-typed individual channels are indexed upwards from this value. */
bottomFrontLeft = 62, /**< Bottom Front Left (Bfl) */
bottomFrontCentre = 63, /**< Bottom Front Centre (Bfc) */
bottomFrontRight = 64, /**< Bottom Front Right (Bfr) */
proxymityLeft = 65, /**< Proximity Left (Pl) */
proximityRight = 66, /**< Proximity Right (Pr) */
bottomSideLeft = 67, /**< Bottom Side Left (Bsl) */
bottomSideRight = 68, /**< Bottom Side Right (Bsr) */
bottomRearLeft = 69, /**< Bottom Rear Left (Brl) */
bottomRearCentre = 70, /**< Bottom Rear Center (Brc) */
bottomRearRight = 71, /**< Bottom Rear Right (Brr) */
//==============================================================================
discreteChannel0 = 128 /**< Non-typed individual channels are indexed upwards from this value. */
};
/** Returns the name of a given channel type. For example, this method may return "Surround Left". */

View file

@ -163,8 +163,8 @@ static inline Steinberg::Vst::Speaker getSpeakerType (const AudioChannelSet& set
case AudioChannelSet::leftCentre: return Steinberg::Vst::kSpeakerLc;
case AudioChannelSet::rightCentre: return Steinberg::Vst::kSpeakerRc;
case AudioChannelSet::centreSurround: return Steinberg::Vst::kSpeakerCs;
case AudioChannelSet::leftSurroundSide: return (1ull << 26); /* kSpeakerLcs */
case AudioChannelSet::rightSurroundSide: return (1ull << 27); /* kSpeakerRcs */
case AudioChannelSet::leftSurroundSide: return Steinberg::Vst::kSpeakerLcs;
case AudioChannelSet::rightSurroundSide: return Steinberg::Vst::kSpeakerRcs;
case AudioChannelSet::topMiddle: return (1ull << 11); /* kSpeakerTm */
case AudioChannelSet::topFrontLeft: return Steinberg::Vst::kSpeakerTfl;
case AudioChannelSet::topFrontCentre: return Steinberg::Vst::kSpeakerTfc;
@ -177,36 +177,35 @@ static inline Steinberg::Vst::Speaker getSpeakerType (const AudioChannelSet& set
case AudioChannelSet::rightSurroundRear: return Steinberg::Vst::kSpeakerSr;
case AudioChannelSet::wideLeft: return Steinberg::Vst::kSpeakerPl;
case AudioChannelSet::wideRight: return Steinberg::Vst::kSpeakerPr;
case AudioChannelSet::ambisonicACN0: return (1ull << 20); /* kSpeakerACN0 */
case AudioChannelSet::ambisonicACN1: return (1ull << 21); /* kSpeakerACN1 */
case AudioChannelSet::ambisonicACN2: return (1ull << 22); /* kSpeakerACN2 */
case AudioChannelSet::ambisonicACN3: return (1ull << 23); /* kSpeakerACN3 */
case AudioChannelSet::ambisonicACN4: return (1ull << 38); /* kSpeakerACN4 */
case AudioChannelSet::ambisonicACN5: return (1ull << 39); /* kSpeakerACN5 */
case AudioChannelSet::ambisonicACN6: return (1ull << 40); /* kSpeakerACN6 */
case AudioChannelSet::ambisonicACN7: return (1ull << 41); /* kSpeakerACN7 */
case AudioChannelSet::ambisonicACN8: return (1ull << 42); /* kSpeakerACN8 */
case AudioChannelSet::ambisonicACN9: return (1ull << 43); /* kSpeakerACN9 */
case AudioChannelSet::ambisonicACN10: return (1ull << 44); /* kSpeakerACN10 */
case AudioChannelSet::ambisonicACN11: return (1ull << 45); /* kSpeakerACN11 */
case AudioChannelSet::ambisonicACN12: return (1ull << 46); /* kSpeakerACN12 */
case AudioChannelSet::ambisonicACN13: return (1ull << 47); /* kSpeakerACN13 */
case AudioChannelSet::ambisonicACN14: return (1ull << 48); /* kSpeakerACN14 */
case AudioChannelSet::ambisonicACN15: return (1ull << 49); /* kSpeakerACN15 */
case AudioChannelSet::topSideLeft: return (1ull << 24); /* kSpeakerTsl */
case AudioChannelSet::topSideRight: return (1ull << 25); /* kSpeakerTsr */
case AudioChannelSet::ambisonicACN0: return Steinberg::Vst::kSpeakerACN0;
case AudioChannelSet::ambisonicACN1: return Steinberg::Vst::kSpeakerACN1;
case AudioChannelSet::ambisonicACN2: return Steinberg::Vst::kSpeakerACN2;
case AudioChannelSet::ambisonicACN3: return Steinberg::Vst::kSpeakerACN3;
case AudioChannelSet::ambisonicACN4: return Steinberg::Vst::kSpeakerACN4;
case AudioChannelSet::ambisonicACN5: return Steinberg::Vst::kSpeakerACN5;
case AudioChannelSet::ambisonicACN6: return Steinberg::Vst::kSpeakerACN6;
case AudioChannelSet::ambisonicACN7: return Steinberg::Vst::kSpeakerACN7;
case AudioChannelSet::ambisonicACN8: return Steinberg::Vst::kSpeakerACN8;
case AudioChannelSet::ambisonicACN9: return Steinberg::Vst::kSpeakerACN9;
case AudioChannelSet::ambisonicACN10: return Steinberg::Vst::kSpeakerACN10;
case AudioChannelSet::ambisonicACN11: return Steinberg::Vst::kSpeakerACN11;
case AudioChannelSet::ambisonicACN12: return Steinberg::Vst::kSpeakerACN12;
case AudioChannelSet::ambisonicACN13: return Steinberg::Vst::kSpeakerACN13;
case AudioChannelSet::ambisonicACN14: return Steinberg::Vst::kSpeakerACN14;
case AudioChannelSet::ambisonicACN15: return Steinberg::Vst::kSpeakerACN15;
case AudioChannelSet::topSideLeft: return Steinberg::Vst::kSpeakerTsl;
case AudioChannelSet::topSideRight: return Steinberg::Vst::kSpeakerTsr;
case AudioChannelSet::bottomFrontLeft: return Steinberg::Vst::kSpeakerBfl;
case AudioChannelSet::bottomFrontCentre: return Steinberg::Vst::kSpeakerBfc;
case AudioChannelSet::bottomFrontRight: return Steinberg::Vst::kSpeakerBfr;
case AudioChannelSet::bottomSideLeft: return Steinberg::Vst::kSpeakerBsl;
case AudioChannelSet::bottomSideRight: return Steinberg::Vst::kSpeakerBsr;
case AudioChannelSet::bottomRearLeft: return Steinberg::Vst::kSpeakerBrl;
case AudioChannelSet::bottomRearCentre: return Steinberg::Vst::kSpeakerBrc;
case AudioChannelSet::bottomRearRight: return Steinberg::Vst::kSpeakerBrr;
case AudioChannelSet::discreteChannel0: return Steinberg::Vst::kSpeakerM;
default:
break;
}
switch (static_cast<int> (type))
{
case (int) AudioChannelSet::discreteChannel0 + 3: return (1ull << 28); /* kSpeakerBfl */
case (int) AudioChannelSet::discreteChannel0 + 4: return (1ull << 29); /* kSpeakerBfc */
case (int) AudioChannelSet::discreteChannel0 + 5: return (1ull << 30); /* kSpeakerBfr */
default:
break;
}
@ -230,7 +229,7 @@ static inline AudioChannelSet::ChannelType getChannelType (Steinberg::Vst::Speak
case Steinberg::Vst::kSpeakerCs: return AudioChannelSet::centreSurround;
case Steinberg::Vst::kSpeakerSl: return AudioChannelSet::leftSurroundRear;
case Steinberg::Vst::kSpeakerSr: return AudioChannelSet::rightSurroundRear;
case (1ull << 11): return AudioChannelSet::topMiddle; /* kSpeakerTm */
case Steinberg::Vst::kSpeakerTc: return AudioChannelSet::topMiddle; /* kSpeakerTm */
case Steinberg::Vst::kSpeakerTfl: return AudioChannelSet::topFrontLeft;
case Steinberg::Vst::kSpeakerTfc: return AudioChannelSet::topFrontCentre;
case Steinberg::Vst::kSpeakerTfr: return AudioChannelSet::topFrontRight;
@ -238,32 +237,36 @@ static inline AudioChannelSet::ChannelType getChannelType (Steinberg::Vst::Speak
case Steinberg::Vst::kSpeakerTrc: return AudioChannelSet::topRearCentre;
case Steinberg::Vst::kSpeakerTrr: return AudioChannelSet::topRearRight;
case Steinberg::Vst::kSpeakerLfe2: return AudioChannelSet::LFE2;
case (1ull << 19): return ((arr & Steinberg::Vst::kSpeakerC) != 0 ? AudioChannelSet::discreteChannel0 : AudioChannelSet::centre);
case (1ull << 20): return AudioChannelSet::ambisonicACN0; /* kSpeakerACN0 */
case (1ull << 21): return AudioChannelSet::ambisonicACN1; /* kSpeakerACN1 */
case (1ull << 22): return AudioChannelSet::ambisonicACN2; /* kSpeakerACN2 */
case (1ull << 23): return AudioChannelSet::ambisonicACN3; /* kSpeakerACN3 */
case (1ull << 38): return AudioChannelSet::ambisonicACN4; /* kSpeakerACN4 */
case (1ull << 39): return AudioChannelSet::ambisonicACN5; /* kSpeakerACN5 */
case (1ull << 40): return AudioChannelSet::ambisonicACN6; /* kSpeakerACN6 */
case (1ull << 41): return AudioChannelSet::ambisonicACN7; /* kSpeakerACN7 */
case (1ull << 42): return AudioChannelSet::ambisonicACN8; /* kSpeakerACN8 */
case (1ull << 43): return AudioChannelSet::ambisonicACN9; /* kSpeakerACN9 */
case (1ull << 44): return AudioChannelSet::ambisonicACN10; /* kSpeakerACN10 */
case (1ull << 45): return AudioChannelSet::ambisonicACN11; /* kSpeakerACN11 */
case (1ull << 46): return AudioChannelSet::ambisonicACN12; /* kSpeakerACN12 */
case (1ull << 47): return AudioChannelSet::ambisonicACN13; /* kSpeakerACN13 */
case (1ull << 48): return AudioChannelSet::ambisonicACN14; /* kSpeakerACN14 */
case (1ull << 49): return AudioChannelSet::ambisonicACN15; /* kSpeakerACN15 */
case (1ull << 24): return AudioChannelSet::topSideLeft; /* kSpeakerTsl */
case (1ull << 25): return AudioChannelSet::topSideRight; /* kSpeakerTsr */
case (1ull << 26): return AudioChannelSet::leftSurroundSide; /* kSpeakerLcs */
case (1ull << 27): return AudioChannelSet::rightSurroundSide; /* kSpeakerRcs */
case (1ull << 28): return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 3); /* kSpeakerBfl */
case (1ull << 29): return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 4); /* kSpeakerBfc */
case (1ull << 30): return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 5); /* kSpeakerBfr */
case Steinberg::Vst::kSpeakerACN0: return ((arr & Steinberg::Vst::kSpeakerC) != 0 ? AudioChannelSet::discreteChannel0 : AudioChannelSet::centre); /* kSpeakerACN0 */
case Steinberg::Vst::kSpeakerACN1: return AudioChannelSet::ambisonicACN1;
case Steinberg::Vst::kSpeakerACN2: return AudioChannelSet::ambisonicACN2;
case Steinberg::Vst::kSpeakerACN3: return AudioChannelSet::ambisonicACN3;
case Steinberg::Vst::kSpeakerACN4: return AudioChannelSet::ambisonicACN4;
case Steinberg::Vst::kSpeakerACN5: return AudioChannelSet::ambisonicACN5;
case Steinberg::Vst::kSpeakerACN6: return AudioChannelSet::ambisonicACN6;
case Steinberg::Vst::kSpeakerACN7: return AudioChannelSet::ambisonicACN7;
case Steinberg::Vst::kSpeakerACN8: return AudioChannelSet::ambisonicACN8;
case Steinberg::Vst::kSpeakerACN9: return AudioChannelSet::ambisonicACN9;
case Steinberg::Vst::kSpeakerACN10: return AudioChannelSet::ambisonicACN10;
case Steinberg::Vst::kSpeakerACN11: return AudioChannelSet::ambisonicACN11;
case Steinberg::Vst::kSpeakerACN12: return AudioChannelSet::ambisonicACN12;
case Steinberg::Vst::kSpeakerACN13: return AudioChannelSet::ambisonicACN13;
case Steinberg::Vst::kSpeakerACN14: return AudioChannelSet::ambisonicACN14;
case Steinberg::Vst::kSpeakerACN15: return AudioChannelSet::ambisonicACN15;
case Steinberg::Vst::kSpeakerTsl: return AudioChannelSet::topSideLeft;
case Steinberg::Vst::kSpeakerTsr: return AudioChannelSet::topSideRight;
case Steinberg::Vst::kSpeakerLcs: return AudioChannelSet::leftSurroundSide;
case Steinberg::Vst::kSpeakerRcs: return AudioChannelSet::rightSurroundSide;
case Steinberg::Vst::kSpeakerBfl: return AudioChannelSet::bottomFrontLeft;
case Steinberg::Vst::kSpeakerBfc: return AudioChannelSet::bottomFrontCentre;
case Steinberg::Vst::kSpeakerBfr: return AudioChannelSet::bottomFrontRight;
case Steinberg::Vst::kSpeakerPl: return AudioChannelSet::wideLeft;
case Steinberg::Vst::kSpeakerPr: return AudioChannelSet::wideRight;
case Steinberg::Vst::kSpeakerBsl: return AudioChannelSet::bottomSideLeft;
case Steinberg::Vst::kSpeakerBsr: return AudioChannelSet::bottomSideRight;
case Steinberg::Vst::kSpeakerBrl: return AudioChannelSet::bottomRearLeft;
case Steinberg::Vst::kSpeakerBrc: return AudioChannelSet::bottomRearCentre;
case Steinberg::Vst::kSpeakerBrr: return AudioChannelSet::bottomRearRight;
default: break;
}