From 39cd0ef532bac3b8001e3748e26005437286f785 Mon Sep 17 00:00:00 2001 From: attila Date: Wed, 8 Mar 2023 19:20:05 +0100 Subject: [PATCH] Add support for AAX SDK 2.5.0 --- .../buffers/juce_AudioChannelSet.cpp | 133 ++++++++++++-- .../buffers/juce_AudioChannelSet.h | 72 +++++++- .../juce_audio_plugin_client_AAX.cpp | 172 +++++++++++++++--- .../format_types/juce_VST3Common.h | 28 +++ .../processors/juce_AudioProcessor.cpp | 18 +- 5 files changed, 379 insertions(+), 44 deletions(-) diff --git a/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp b/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp index 2a359f3b34..e289a35a72 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp +++ b/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp @@ -107,6 +107,34 @@ String AudioChannelSet::getChannelTypeName (AudioChannelSet::ChannelType type) case ambisonicACN33: return NEEDS_TRANS("Ambisonic 33"); case ambisonicACN34: return NEEDS_TRANS("Ambisonic 34"); case ambisonicACN35: return NEEDS_TRANS("Ambisonic 35"); + case ambisonicACN36: return NEEDS_TRANS("Ambisonic 36"); + case ambisonicACN37: return NEEDS_TRANS("Ambisonic 37"); + case ambisonicACN38: return NEEDS_TRANS("Ambisonic 38"); + case ambisonicACN39: return NEEDS_TRANS("Ambisonic 39"); + case ambisonicACN40: return NEEDS_TRANS("Ambisonic 40"); + case ambisonicACN41: return NEEDS_TRANS("Ambisonic 41"); + case ambisonicACN42: return NEEDS_TRANS("Ambisonic 42"); + case ambisonicACN43: return NEEDS_TRANS("Ambisonic 43"); + case ambisonicACN44: return NEEDS_TRANS("Ambisonic 44"); + case ambisonicACN45: return NEEDS_TRANS("Ambisonic 45"); + case ambisonicACN46: return NEEDS_TRANS("Ambisonic 46"); + case ambisonicACN47: return NEEDS_TRANS("Ambisonic 47"); + case ambisonicACN48: return NEEDS_TRANS("Ambisonic 48"); + case ambisonicACN49: return NEEDS_TRANS("Ambisonic 49"); + case ambisonicACN50: return NEEDS_TRANS("Ambisonic 50"); + case ambisonicACN51: return NEEDS_TRANS("Ambisonic 51"); + case ambisonicACN52: return NEEDS_TRANS("Ambisonic 52"); + case ambisonicACN53: return NEEDS_TRANS("Ambisonic 53"); + case ambisonicACN54: return NEEDS_TRANS("Ambisonic 54"); + case ambisonicACN55: return NEEDS_TRANS("Ambisonic 55"); + case ambisonicACN56: return NEEDS_TRANS("Ambisonic 56"); + case ambisonicACN57: return NEEDS_TRANS("Ambisonic 57"); + case ambisonicACN58: return NEEDS_TRANS("Ambisonic 58"); + case ambisonicACN59: return NEEDS_TRANS("Ambisonic 59"); + case ambisonicACN60: return NEEDS_TRANS("Ambisonic 60"); + case ambisonicACN61: return NEEDS_TRANS("Ambisonic 61"); + case ambisonicACN62: return NEEDS_TRANS("Ambisonic 62"); + case ambisonicACN63: return NEEDS_TRANS("Ambisonic 63"); case bottomFrontLeft: return NEEDS_TRANS("Bottom Front Left"); case bottomFrontCentre: return NEEDS_TRANS("Bottom Front Centre"); case bottomFrontRight: return NEEDS_TRANS("Bottom Front Right"); @@ -191,6 +219,34 @@ String AudioChannelSet::getAbbreviatedChannelTypeName (AudioChannelSet::ChannelT case ambisonicACN33: return "ACN33"; case ambisonicACN34: return "ACN34"; case ambisonicACN35: return "ACN35"; + case ambisonicACN36: return "ACN36"; + case ambisonicACN37: return "ACN37"; + case ambisonicACN38: return "ACN38"; + case ambisonicACN39: return "ACN39"; + case ambisonicACN40: return "ACN40"; + case ambisonicACN41: return "ACN41"; + case ambisonicACN42: return "ACN42"; + case ambisonicACN43: return "ACN43"; + case ambisonicACN44: return "ACN44"; + case ambisonicACN45: return "ACN45"; + case ambisonicACN46: return "ACN46"; + case ambisonicACN47: return "ACN47"; + case ambisonicACN48: return "ACN48"; + case ambisonicACN49: return "ACN49"; + case ambisonicACN50: return "ACN50"; + case ambisonicACN51: return "ACN51"; + case ambisonicACN52: return "ACN52"; + case ambisonicACN53: return "ACN53"; + case ambisonicACN54: return "ACN54"; + case ambisonicACN55: return "ACN55"; + case ambisonicACN56: return "ACN56"; + case ambisonicACN57: return "ACN57"; + case ambisonicACN58: return "ACN58"; + case ambisonicACN59: return "ACN59"; + case ambisonicACN60: return "ACN60"; + case ambisonicACN61: return "ACN61"; + case ambisonicACN62: return "ACN62"; + case ambisonicACN63: return "ACN63"; case topSideLeft: return "Tsl"; case topSideRight: return "Tsr"; case bottomFrontLeft: return "Bfl"; @@ -208,9 +264,6 @@ String AudioChannelSet::getAbbreviatedChannelTypeName (AudioChannelSet::ChannelT default: break; } - if (type >= ambisonicACN4 && type <= ambisonicACN35) - return "ACN" + String (type - ambisonicACN4 + 4); - return {}; } @@ -283,6 +336,34 @@ AudioChannelSet::ChannelType AudioChannelSet::getChannelTypeFromAbbreviation (co if (abbr == "ACN33") return ambisonicACN33; if (abbr == "ACN34") return ambisonicACN34; if (abbr == "ACN35") return ambisonicACN35; + if (abbr == "ACN36") return ambisonicACN36; + if (abbr == "ACN37") return ambisonicACN37; + if (abbr == "ACN38") return ambisonicACN38; + if (abbr == "ACN39") return ambisonicACN39; + if (abbr == "ACN40") return ambisonicACN40; + if (abbr == "ACN41") return ambisonicACN41; + if (abbr == "ACN42") return ambisonicACN42; + if (abbr == "ACN43") return ambisonicACN43; + if (abbr == "ACN44") return ambisonicACN44; + if (abbr == "ACN45") return ambisonicACN45; + if (abbr == "ACN46") return ambisonicACN46; + if (abbr == "ACN47") return ambisonicACN47; + if (abbr == "ACN48") return ambisonicACN48; + if (abbr == "ACN49") return ambisonicACN49; + if (abbr == "ACN50") return ambisonicACN50; + if (abbr == "ACN51") return ambisonicACN51; + if (abbr == "ACN52") return ambisonicACN52; + if (abbr == "ACN53") return ambisonicACN53; + if (abbr == "ACN54") return ambisonicACN54; + if (abbr == "ACN55") return ambisonicACN55; + if (abbr == "ACN56") return ambisonicACN56; + if (abbr == "ACN57") return ambisonicACN57; + if (abbr == "ACN58") return ambisonicACN58; + if (abbr == "ACN59") return ambisonicACN59; + if (abbr == "ACN60") return ambisonicACN60; + if (abbr == "ACN61") return ambisonicACN61; + if (abbr == "ACN62") return ambisonicACN62; + if (abbr == "ACN63") return ambisonicACN63; if (abbr == "Tsl") return topSideLeft; if (abbr == "Tsr") return topSideRight; if (abbr == "Bfl") return bottomFrontLeft; @@ -338,6 +419,8 @@ String AudioChannelSet::getDescription() const if (*this == createLCRS()) return "LCRS"; if (*this == create5point0()) return "5.0 Surround"; + if (*this == create5point0point2()) return "5.0.2 Surround"; + if (*this == create5point0point4()) return "5.0.4 Surround"; if (*this == create5point1()) return "5.1 Surround"; if (*this == create5point1point2()) return "5.1.2 Surround"; if (*this == create5point1point4()) return "5.1.4 Surround"; @@ -351,9 +434,13 @@ String AudioChannelSet::getDescription() const if (*this == create7point1SDDS()) return "7.1 Surround SDDS"; if (*this == create7point0point2()) return "7.0.2 Surround"; if (*this == create7point0point4()) return "7.0.4 Surround"; + if (*this == create7point0point6()) return "7.0.6 Surround"; if (*this == create7point1point2()) return "7.1.2 Surround"; if (*this == create7point1point4()) return "7.1.4 Surround"; if (*this == create7point1point6()) return "7.1.6 Surround"; + if (*this == create9point0point4()) return "9.0.4 Surround"; + if (*this == create9point1point4()) return "9.1.4 Surround"; + if (*this == create9point0point6()) return "9.0.6 Surround"; if (*this == create9point1point6()) return "9.1.6 Surround"; if (*this == quadraphonic()) return "Quadraphonic"; @@ -386,11 +473,11 @@ String AudioChannelSet::getDescription() const bool AudioChannelSet::isDiscreteLayout() const noexcept { - for (auto& speaker : getChannelTypes()) - if (speaker <= ambisonicACN35) - return false; + const auto channelTypes = getChannelTypes(); - return true; + return std::none_of (std::begin (channelTypes), + std::end (channelTypes), + [] (const auto& t) { return t < discreteChannel0; }); } int AudioChannelSet::size() const noexcept @@ -467,26 +554,44 @@ AudioChannelSet AudioChannelSet::quadraphonic() { return AudioChannelSet AudioChannelSet AudioChannelSet::pentagonal() { return AudioChannelSet ({ left, right, centre, leftSurroundRear, rightSurroundRear }); } AudioChannelSet AudioChannelSet::hexagonal() { return AudioChannelSet ({ left, right, centre, centreSurround, leftSurroundRear, rightSurroundRear }); } AudioChannelSet AudioChannelSet::octagonal() { return AudioChannelSet ({ left, right, centre, leftSurround, rightSurround, centreSurround, wideLeft, wideRight }); } +AudioChannelSet AudioChannelSet::create5point0point2() { return AudioChannelSet ({ left, right, centre, leftSurround, rightSurround, topSideLeft, topSideRight }); } AudioChannelSet AudioChannelSet::create5point1point2() { return AudioChannelSet ({ left, right, centre, LFE, leftSurround, rightSurround, topSideLeft, topSideRight }); } +AudioChannelSet AudioChannelSet::create5point0point4() { return AudioChannelSet ({ left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, topRearLeft, topRearRight }); } AudioChannelSet AudioChannelSet::create5point1point4() { return AudioChannelSet ({ left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, topRearLeft, topRearRight }); } AudioChannelSet AudioChannelSet::create7point0point2() { return AudioChannelSet ({ left, right, centre, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, topSideLeft, topSideRight }); } AudioChannelSet AudioChannelSet::create7point1point2() { return AudioChannelSet ({ left, right, centre, LFE, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, topSideLeft, topSideRight }); } AudioChannelSet AudioChannelSet::create7point0point4() { return AudioChannelSet ({ left, right, centre, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, topFrontLeft, topFrontRight, topRearLeft, topRearRight }); } AudioChannelSet AudioChannelSet::create7point1point4() { return AudioChannelSet ({ left, right, centre, LFE, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, topFrontLeft, topFrontRight, topRearLeft, topRearRight }); } +AudioChannelSet AudioChannelSet::create7point0point6() { return AudioChannelSet ({ left, right, centre, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, topFrontLeft, topFrontRight, topSideLeft, topSideRight, topRearLeft, topRearRight }); } AudioChannelSet AudioChannelSet::create7point1point6() { return AudioChannelSet ({ left, right, centre, LFE, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, topFrontLeft, topFrontRight, topSideLeft, topSideRight, topRearLeft, topRearRight }); } +AudioChannelSet AudioChannelSet::create9point0point4() { return AudioChannelSet ({ left, right, centre, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, wideLeft, wideRight, topFrontLeft, topFrontRight, topRearLeft, topRearRight }); } +AudioChannelSet AudioChannelSet::create9point1point4() { return AudioChannelSet ({ left, right, centre, LFE, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, wideLeft, wideRight, topFrontLeft, topFrontRight, topRearLeft, topRearRight }); } +AudioChannelSet AudioChannelSet::create9point0point6() { return AudioChannelSet ({ left, right, centre, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, wideLeft, wideRight, topFrontLeft, topFrontRight, topSideLeft, topSideRight, topRearLeft, topRearRight }); } AudioChannelSet AudioChannelSet::create9point1point6() { return AudioChannelSet ({ left, right, centre, LFE, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, wideLeft, wideRight, topFrontLeft, topFrontRight, topSideLeft, topSideRight, topRearLeft, topRearRight }); } AudioChannelSet AudioChannelSet::ambisonic (int order) { - jassert (isPositiveAndBelow (order, 6)); + jassert (isPositiveAndBelow (order, 8)); - if (order == 0) - return AudioChannelSet ((uint32) (1 << ambisonicACN0)); + static constexpr std::pair continuousRanges[] { { ambisonicACN0, ambisonicACN3 }, + { ambisonicACN4, ambisonicACN35 }, + { ambisonicACN36, ambisonicACN63 } }; - AudioChannelSet set ((1u << ambisonicACN0) | (1u << ambisonicACN1) | (1u << ambisonicACN2) | (1u << ambisonicACN3)); + AudioChannelSet set; - auto numAmbisonicChannels = (order + 1) * (order + 1); - set.channels.setRange (ambisonicACN4, numAmbisonicChannels - 4, true); + const auto setBits = [&set] (auto range, auto maxNumToSet) + { + const auto numToSet = std::min (maxNumToSet, range.second - range.first + 1); + set.channels.setRange (range.first, numToSet, true); + return numToSet; + }; + + const auto numAmbisonicChannels = (order + 1) * (order + 1); + + for (int rangeIdx = 0, bitsSet = 0; bitsSet < numAmbisonicChannels; ++rangeIdx) + { + bitsSet += setBits (continuousRanges[rangeIdx], numAmbisonicChannels - bitsSet); + } return set; } @@ -636,7 +741,7 @@ int JUCE_CALLTYPE AudioChannelSet::getAmbisonicOrderForNumChannels (int numChann auto sqrtMinusOne = std::sqrt (static_cast (numChannels)) - 1.0f; auto ambisonicOrder = jmax (0, static_cast (std::floor (sqrtMinusOne))); - if (ambisonicOrder > 5) + if (ambisonicOrder > 7) return -1; return (static_cast (ambisonicOrder) == sqrtMinusOne ? ambisonicOrder : -1); diff --git a/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h b/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h index 3c96befa27..d38ba54137 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h +++ b/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h @@ -196,12 +196,24 @@ public: */ static AudioChannelSet JUCE_CALLTYPE create7point1SDDS(); + /** Creates a set for a 5.0.2 surround setup (left, right, centre, leftSurround, rightSurround, topSideLeft, topSideRight). + + Is equivalent to: AAX_eStemFormat_5_0_2 (AAX). + */ + static AudioChannelSet JUCE_CALLTYPE create5point0point2(); + /** Creates a set for a 5.1.2 surround setup (left, right, centre, LFE, leftSurround, rightSurround, topSideLeft, topSideRight). Is equivalent to: kAudioChannelLayoutTag_Atmos_5_1_2 (CoreAudio). */ static AudioChannelSet JUCE_CALLTYPE create5point1point2(); + /** Creates a set for a 5.0.4 surround setup (left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, topRearLeft, topRearRight). + + Is equivalent to: AAX_eStemFormat_5_0_4 (AAX). + */ + static AudioChannelSet JUCE_CALLTYPE create5point0point4(); + /** Creates a set for a 5.1.4 surround setup (left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, topRearLeft, topRearRight). Is equivalent to: kAudioChannelLayoutTag_Atmos_5_1_4 (CoreAudio). @@ -232,12 +244,36 @@ public: */ static AudioChannelSet JUCE_CALLTYPE create7point1point4(); + /** Creates a set for 7.0.6 surround setup (left, right, centre, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, topFrontLeft, topFrontRight, topSideLeft, topSideRight, topRearLeft, topRearRight). + + Is equivalent to: AAX_eStemFormat_7_0_6 (AAX). + */ + static AudioChannelSet JUCE_CALLTYPE create7point0point6(); + /** Creates a set for Dolby Atmos 7.1.6 surround setup (left, right, centre, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, LFE, topFrontLeft, topFrontRight, topSideLeft, topSideRight, topRearLeft, topRearRight). Is equivalent to: k71_6 (VST), n/a (AAX), n/a (CoreAudio) */ static AudioChannelSet JUCE_CALLTYPE create7point1point6(); + /** Creates a set for a 9.0.4 surround setup (left, right, centre, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, wideLeft, wideRight, topFrontLeft, topFrontRight, topRearLeft, topRearRight). + + Is equivalent to: AAX_eStemFormat_9_0_4 (AAX). + */ + static AudioChannelSet JUCE_CALLTYPE create9point0point4(); + + /** Creates a set for a 9.1.4 surround setup (left, right, centre, LFE, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, wideLeft, wideRight, topFrontLeft, topFrontRight, topRearLeft, topRearRight). + + Is equivalent to: AAX_eStemFormat_9_1_4 (AAX). + */ + static AudioChannelSet JUCE_CALLTYPE create9point1point4(); + + /** Creates a set for a 9.0.6 surround setup (left, right, centre, LFE, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, wideLeft, wideRight, topFrontLeft, topFrontRight, topSideLeft, topSideRight, topRearLeft, topRearRight). + + Is equivalent to: AAX_eStemFormat_9_0_6 (AAX). + */ + static AudioChannelSet JUCE_CALLTYPE create9point0point6(); + /** Creates a set for a 9.1.6 surround setup (left, right, centre, LFE, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, wideLeft, wideRight, topFrontLeft, topFrontRight, topSideLeft, topSideRight, topRearLeft, topRearRight). Note that the VST3 layout arranges the front speakers "L Lc C Rc R", but the JUCE layout @@ -419,6 +455,40 @@ public: bottomRearCentre = 70, /**< Bottom Rear Center (Brc) */ bottomRearRight = 71, /**< Bottom Rear Right (Brr) */ + //============================================================================== + + // sixth-order ambisonic + ambisonicACN36 = 72, /**< Sixth-order ambisonic channel number 36. */ + ambisonicACN37 = 73, /**< Sixth-order ambisonic channel number 37. */ + ambisonicACN38 = 74, /**< Sixth-order ambisonic channel number 38. */ + ambisonicACN39 = 75, /**< Sixth-order ambisonic channel number 39. */ + ambisonicACN40 = 76, /**< Sixth-order ambisonic channel number 40. */ + ambisonicACN41 = 77, /**< Sixth-order ambisonic channel number 41. */ + ambisonicACN42 = 78, /**< Sixth-order ambisonic channel number 42. */ + ambisonicACN43 = 79, /**< Sixth-order ambisonic channel number 43. */ + ambisonicACN44 = 80, /**< Sixth-order ambisonic channel number 44. */ + ambisonicACN45 = 81, /**< Sixth-order ambisonic channel number 45. */ + ambisonicACN46 = 82, /**< Sixth-order ambisonic channel number 46. */ + ambisonicACN47 = 83, /**< Sixth-order ambisonic channel number 47. */ + ambisonicACN48 = 84, /**< Sixth-order ambisonic channel number 48. */ + + // seventh-order ambisonic + ambisonicACN49 = 85, /**< Seventh-order ambisonic channel number 49. */ + ambisonicACN50 = 86, /**< Seventh-order ambisonic channel number 50. */ + ambisonicACN51 = 87, /**< Seventh-order ambisonic channel number 51. */ + ambisonicACN52 = 88, /**< Seventh-order ambisonic channel number 52. */ + ambisonicACN53 = 89, /**< Seventh-order ambisonic channel number 53. */ + ambisonicACN54 = 90, /**< Seventh-order ambisonic channel number 54. */ + ambisonicACN55 = 91, /**< Seventh-order ambisonic channel number 55. */ + ambisonicACN56 = 92, /**< Seventh-order ambisonic channel number 56. */ + ambisonicACN57 = 93, /**< Seventh-order ambisonic channel number 57. */ + ambisonicACN58 = 94, /**< Seventh-order ambisonic channel number 58. */ + ambisonicACN59 = 95, /**< Seventh-order ambisonic channel number 59. */ + ambisonicACN60 = 96, /**< Seventh-order ambisonic channel number 60. */ + ambisonicACN61 = 97, /**< Seventh-order ambisonic channel number 61. */ + ambisonicACN62 = 98, /**< Seventh-order ambisonic channel number 62. */ + ambisonicACN63 = 99, /**< Seventh-order ambisonic channel number 63. */ + //============================================================================== discreteChannel0 = 128 /**< Non-typed individual channels are indexed upwards from this value. */ }; @@ -435,7 +505,7 @@ public: //============================================================================== enum { - maxChannelsOfNamedLayout = 36 + maxChannelsOfNamedLayout = 64 }; /** Adds a channel to the set. */ diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp index 8d616052b8..7ac7fca7e3 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp @@ -50,6 +50,12 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnon-virtual-dtor", static_assert (AAX_SDK_CURRENT_REVISION >= AAX_SDK_2p4p0_REVISION, "JUCE requires AAX SDK version 2.4.0 or higher"); +#if defined (AAX_SDK_2p5p0_REVISION) && AAX_SDK_2p5p0_REVISION <= AAX_SDK_CURRENT_REVISION + #define JUCE_AAX_SDK_2p5p0 1 +#else + #define JUCE_AAX_SDK_2p5p0 0 +#endif + #define INITACFIDS #include @@ -115,7 +121,7 @@ namespace AAXClasses struct AAXChannelStreamOrder { AAX_EStemFormat aaxStemFormat; - AudioChannelSet::ChannelType speakerOrder[10]; + std::initializer_list speakerOrder; }; static AAX_EStemFormat stemFormatForAmbisonicOrder (int order) @@ -125,6 +131,12 @@ namespace AAXClasses case 1: return AAX_eStemFormat_Ambi_1_ACN; case 2: return AAX_eStemFormat_Ambi_2_ACN; case 3: return AAX_eStemFormat_Ambi_3_ACN; + #if JUCE_AAX_SDK_2p5p0 + case 4: return AAX_eStemFormat_Ambi_4_ACN; + case 5: return AAX_eStemFormat_Ambi_5_ACN; + case 6: return AAX_eStemFormat_Ambi_6_ACN; + case 7: return AAX_eStemFormat_Ambi_7_ACN; + #endif default: break; } @@ -133,53 +145,94 @@ namespace AAXClasses static AAXChannelStreamOrder aaxChannelOrder[] = { - { AAX_eStemFormat_Mono, { AudioChannelSet::centre, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, - AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + { AAX_eStemFormat_Mono, { AudioChannelSet::centre } }, - { AAX_eStemFormat_Stereo, { AudioChannelSet::left, AudioChannelSet::right, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, - AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + { AAX_eStemFormat_Stereo, { AudioChannelSet::left, AudioChannelSet::right } }, - { AAX_eStemFormat_LCR, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::unknown, AudioChannelSet::unknown, - AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + { AAX_eStemFormat_LCR, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right } }, - { AAX_eStemFormat_LCRS, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::centreSurround, AudioChannelSet::unknown, - AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + { AAX_eStemFormat_LCRS, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::centreSurround } }, - { AAX_eStemFormat_Quad, { AudioChannelSet::left, AudioChannelSet::right, AudioChannelSet::leftSurround, AudioChannelSet::rightSurround, AudioChannelSet::unknown, - AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + { AAX_eStemFormat_Quad, { AudioChannelSet::left, AudioChannelSet::right, AudioChannelSet::leftSurround, AudioChannelSet::rightSurround } }, - { AAX_eStemFormat_5_0, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurround, AudioChannelSet::rightSurround, - AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + { AAX_eStemFormat_5_0, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurround, AudioChannelSet::rightSurround } }, { AAX_eStemFormat_5_1, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurround, AudioChannelSet::rightSurround, - AudioChannelSet::LFE, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + AudioChannelSet::LFE } }, { AAX_eStemFormat_6_0, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurround, AudioChannelSet::centreSurround, - AudioChannelSet::rightSurround, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + AudioChannelSet::rightSurround } }, { AAX_eStemFormat_6_1, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurround, AudioChannelSet::centreSurround, - AudioChannelSet::rightSurround, AudioChannelSet::LFE, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + AudioChannelSet::rightSurround, AudioChannelSet::LFE } }, { AAX_eStemFormat_7_0_SDDS, { AudioChannelSet::left, AudioChannelSet::leftCentre, AudioChannelSet::centre, AudioChannelSet::rightCentre, AudioChannelSet::right, - AudioChannelSet::leftSurround, AudioChannelSet::rightSurround, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + AudioChannelSet::leftSurround, AudioChannelSet::rightSurround } }, { AAX_eStemFormat_7_0_DTS, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurroundSide, AudioChannelSet::rightSurroundSide, - AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear } }, { AAX_eStemFormat_7_1_SDDS, { AudioChannelSet::left, AudioChannelSet::leftCentre, AudioChannelSet::centre, AudioChannelSet::rightCentre, AudioChannelSet::right, - AudioChannelSet::leftSurround, AudioChannelSet::rightSurround, AudioChannelSet::LFE, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + AudioChannelSet::leftSurround, AudioChannelSet::rightSurround, AudioChannelSet::LFE } }, { AAX_eStemFormat_7_1_DTS, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurroundSide, AudioChannelSet::rightSurroundSide, - AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, AudioChannelSet::LFE, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, AudioChannelSet::LFE } }, { AAX_eStemFormat_7_0_2, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurroundSide, AudioChannelSet::rightSurroundSide, - AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, AudioChannelSet::topSideLeft, AudioChannelSet::topSideRight, AudioChannelSet::unknown } }, + AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, AudioChannelSet::topSideLeft, AudioChannelSet::topSideRight } }, { AAX_eStemFormat_7_1_2, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurroundSide, AudioChannelSet::rightSurroundSide, AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, AudioChannelSet::LFE, AudioChannelSet::topSideLeft, AudioChannelSet::topSideRight } }, - { AAX_eStemFormat_None, { AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, - AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown } }, + #if JUCE_AAX_SDK_2p5p0 + { AAX_eStemFormat_5_0_2, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurround, AudioChannelSet::rightSurround, + AudioChannelSet::topSideLeft, AudioChannelSet::topSideRight } }, + + { AAX_eStemFormat_5_1_2, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurround, AudioChannelSet::rightSurround, + AudioChannelSet::LFE, AudioChannelSet::topSideLeft, AudioChannelSet::topSideRight } }, + + { AAX_eStemFormat_5_0_4, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurround, AudioChannelSet::rightSurround, + AudioChannelSet::topFrontLeft, AudioChannelSet::topFrontRight, AudioChannelSet::topRearLeft, AudioChannelSet::topRearRight } }, + + { AAX_eStemFormat_5_1_4, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurround, AudioChannelSet::rightSurround, + AudioChannelSet::LFE, AudioChannelSet::topFrontLeft, AudioChannelSet::topFrontRight, AudioChannelSet::topRearLeft, AudioChannelSet::topRearRight } }, + + { AAX_eStemFormat_7_0_4, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurroundSide, AudioChannelSet::rightSurroundSide, + AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, AudioChannelSet::topFrontLeft, AudioChannelSet::topFrontRight, + AudioChannelSet::topRearLeft, AudioChannelSet::topRearRight } }, + + { AAX_eStemFormat_7_1_4, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurroundSide, AudioChannelSet::rightSurroundSide, + AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, AudioChannelSet::LFE, AudioChannelSet::topFrontLeft, + AudioChannelSet::topFrontRight, AudioChannelSet::topRearLeft, AudioChannelSet::topRearRight } }, + + { AAX_eStemFormat_7_0_6, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurroundSide, AudioChannelSet::rightSurroundSide, + AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, AudioChannelSet::topFrontLeft, AudioChannelSet::topFrontRight, + AudioChannelSet::topSideLeft, AudioChannelSet::topSideRight, AudioChannelSet::topRearLeft, AudioChannelSet::topRearRight } }, + + { AAX_eStemFormat_7_1_6, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::leftSurroundSide, AudioChannelSet::rightSurroundSide, + AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, AudioChannelSet::LFE, AudioChannelSet::topFrontLeft, AudioChannelSet::topFrontRight, + AudioChannelSet::topSideLeft, AudioChannelSet::topSideRight, AudioChannelSet::topRearLeft, AudioChannelSet::topRearRight } }, + + { AAX_eStemFormat_9_0_4, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::wideLeft, AudioChannelSet::wideRight, + AudioChannelSet::leftSurroundSide, AudioChannelSet::rightSurroundSide, AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, + AudioChannelSet::topFrontLeft, AudioChannelSet::topFrontRight, AudioChannelSet::topRearLeft, AudioChannelSet::topRearRight } }, + + { AAX_eStemFormat_9_1_4, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::wideLeft, AudioChannelSet::wideRight, + AudioChannelSet::leftSurroundSide, AudioChannelSet::rightSurroundSide, AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, + AudioChannelSet::LFE, AudioChannelSet::topFrontLeft, AudioChannelSet::topFrontRight, AudioChannelSet::topRearLeft, AudioChannelSet::topRearRight } }, + + { AAX_eStemFormat_9_0_6, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::wideLeft, AudioChannelSet::wideRight, + AudioChannelSet::leftSurroundSide, AudioChannelSet::rightSurroundSide, AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, + AudioChannelSet::topFrontLeft, AudioChannelSet::topFrontRight, AudioChannelSet::topSideLeft, AudioChannelSet::topSideRight, AudioChannelSet::topRearLeft, + AudioChannelSet::topRearRight } }, + + { AAX_eStemFormat_9_1_6, { AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::wideLeft, AudioChannelSet::wideRight, + AudioChannelSet::leftSurroundSide, AudioChannelSet::rightSurroundSide, AudioChannelSet::leftSurroundRear, AudioChannelSet::rightSurroundRear, + AudioChannelSet::LFE, AudioChannelSet::topFrontLeft, AudioChannelSet::topFrontRight, AudioChannelSet::topSideLeft, AudioChannelSet::topSideRight, + AudioChannelSet::topRearLeft, AudioChannelSet::topRearRight } }, + #endif + + { AAX_eStemFormat_None, {} }, }; static AAX_EStemFormat aaxFormats[] = @@ -201,7 +254,25 @@ namespace AAXClasses AAX_eStemFormat_7_1_2, AAX_eStemFormat_Ambi_1_ACN, AAX_eStemFormat_Ambi_2_ACN, - AAX_eStemFormat_Ambi_3_ACN + AAX_eStemFormat_Ambi_3_ACN, + #if JUCE_AAX_SDK_2p5p0 + AAX_eStemFormat_5_0_2, + AAX_eStemFormat_5_1_2, + AAX_eStemFormat_5_0_4, + AAX_eStemFormat_5_1_4, + AAX_eStemFormat_7_0_4, + AAX_eStemFormat_7_1_4, + AAX_eStemFormat_7_0_6, + AAX_eStemFormat_7_1_6, + AAX_eStemFormat_9_0_4, + AAX_eStemFormat_9_1_4, + AAX_eStemFormat_9_0_6, + AAX_eStemFormat_9_1_6, + AAX_eStemFormat_Ambi_4_ACN, + AAX_eStemFormat_Ambi_5_ACN, + AAX_eStemFormat_Ambi_6_ACN, + AAX_eStemFormat_Ambi_7_ACN, + #endif }; static AAX_EStemFormat getFormatForAudioChannelSet (const AudioChannelSet& set, bool ignoreLayout) noexcept @@ -224,6 +295,14 @@ namespace AAXClasses case 8: return AAX_eStemFormat_7_1_DTS; case 9: return AAX_eStemFormat_7_0_2; case 10: return AAX_eStemFormat_7_1_2; + #if JUCE_AAX_SDK_2p5p0 + case 11: return AAX_eStemFormat_7_0_4; + case 12: return AAX_eStemFormat_7_1_4; + case 13: return AAX_eStemFormat_9_0_4; + case 14: return AAX_eStemFormat_9_1_4; + case 15: return AAX_eStemFormat_9_0_6; + case 16: return AAX_eStemFormat_9_1_6; + #endif default: break; } @@ -254,6 +333,21 @@ namespace AAXClasses if (set == AudioChannelSet::create7point0point2()) return AAX_eStemFormat_7_0_2; if (set == AudioChannelSet::create7point1point2()) return AAX_eStemFormat_7_1_2; + #if JUCE_AAX_SDK_2p5p0 + if (set == AudioChannelSet::create5point0point2()) return AAX_eStemFormat_5_0_2; + if (set == AudioChannelSet::create5point1point2()) return AAX_eStemFormat_5_1_2; + if (set == AudioChannelSet::create5point0point4()) return AAX_eStemFormat_5_0_4; + if (set == AudioChannelSet::create5point1point4()) return AAX_eStemFormat_5_1_4; + if (set == AudioChannelSet::create7point0point4()) return AAX_eStemFormat_7_0_4; + if (set == AudioChannelSet::create7point1point4()) return AAX_eStemFormat_7_1_4; + if (set == AudioChannelSet::create7point0point6()) return AAX_eStemFormat_7_0_6; + if (set == AudioChannelSet::create7point1point6()) return AAX_eStemFormat_7_1_6; + if (set == AudioChannelSet::create9point0point4()) return AAX_eStemFormat_9_0_4; + if (set == AudioChannelSet::create9point1point4()) return AAX_eStemFormat_9_1_4; + if (set == AudioChannelSet::create9point0point6()) return AAX_eStemFormat_9_0_6; + if (set == AudioChannelSet::create9point1point6()) return AAX_eStemFormat_9_1_6; + #endif + auto order = set.getAmbisonicOrder(); if (order >= 0) return stemFormatForAmbisonicOrder (order); @@ -286,9 +380,30 @@ namespace AAXClasses case AAX_eStemFormat_Ambi_1_ACN: return AudioChannelSet::ambisonic (1); case AAX_eStemFormat_Ambi_2_ACN: return AudioChannelSet::ambisonic (2); case AAX_eStemFormat_Ambi_3_ACN: return AudioChannelSet::ambisonic (3); + + #if JUCE_AAX_SDK_2p5p0 + case AAX_eStemFormat_5_0_2: return AudioChannelSet::create5point0point2(); + case AAX_eStemFormat_5_1_2: return AudioChannelSet::create5point1point2(); + case AAX_eStemFormat_5_0_4: return AudioChannelSet::create5point0point4(); + case AAX_eStemFormat_5_1_4: return AudioChannelSet::create5point1point4(); + case AAX_eStemFormat_7_0_4: return AudioChannelSet::create7point0point4(); + case AAX_eStemFormat_7_1_4: return AudioChannelSet::create7point1point4(); + case AAX_eStemFormat_7_0_6: return AudioChannelSet::create7point0point6(); + case AAX_eStemFormat_7_1_6: return AudioChannelSet::create7point1point6(); + case AAX_eStemFormat_9_0_4: return AudioChannelSet::create9point0point4(); + case AAX_eStemFormat_9_1_4: return AudioChannelSet::create9point1point4(); + case AAX_eStemFormat_9_0_6: return AudioChannelSet::create9point0point6(); + case AAX_eStemFormat_9_1_6: return AudioChannelSet::create9point1point6(); + case AAX_eStemFormat_Ambi_4_ACN: return AudioChannelSet::ambisonic (4); + case AAX_eStemFormat_Ambi_5_ACN: return AudioChannelSet::ambisonic (5); + case AAX_eStemFormat_Ambi_6_ACN: return AudioChannelSet::ambisonic (6); + case AAX_eStemFormat_Ambi_7_ACN: return AudioChannelSet::ambisonic (7); + #else case AAX_eStemFormat_Reserved_1: case AAX_eStemFormat_Reserved_2: case AAX_eStemFormat_Reserved_3: + #endif + case AAX_eStemFormatNum: case AAX_eStemFormat_Any: case AAX_eStemFormat_INT32_MAX: @@ -345,11 +460,12 @@ namespace AAXClasses auto& channelOrder = aaxChannelOrder[layoutIndex]; auto channelType = channelSet.getTypeOfChannel (static_cast (juceIndex)); - auto numSpeakers = numElementsInArray (channelOrder.speakerOrder); + const auto& speakerOrder = channelOrder.speakerOrder; - for (int i = 0; i < numSpeakers && channelOrder.speakerOrder[i] != 0; ++i) - if (channelOrder.speakerOrder[i] == channelType) - return i; + const auto it = std::find (std::cbegin (speakerOrder), std::cend (speakerOrder), channelType); + + if (it != std::cend (speakerOrder)) + return (int) std::distance (std::cbegin (speakerOrder), it); return juceIndex; } diff --git a/modules/juce_audio_processors/format_types/juce_VST3Common.h b/modules/juce_audio_processors/format_types/juce_VST3Common.h index 18c89a744c..73597d000f 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3Common.h +++ b/modules/juce_audio_processors/format_types/juce_VST3Common.h @@ -274,6 +274,34 @@ static std::optional getSpeakerType (const AudioChannel case AudioChannelSet::ambisonicACN33: case AudioChannelSet::ambisonicACN34: case AudioChannelSet::ambisonicACN35: + case AudioChannelSet::ambisonicACN36: + case AudioChannelSet::ambisonicACN37: + case AudioChannelSet::ambisonicACN38: + case AudioChannelSet::ambisonicACN39: + case AudioChannelSet::ambisonicACN40: + case AudioChannelSet::ambisonicACN41: + case AudioChannelSet::ambisonicACN42: + case AudioChannelSet::ambisonicACN43: + case AudioChannelSet::ambisonicACN44: + case AudioChannelSet::ambisonicACN45: + case AudioChannelSet::ambisonicACN46: + case AudioChannelSet::ambisonicACN47: + case AudioChannelSet::ambisonicACN48: + case AudioChannelSet::ambisonicACN49: + case AudioChannelSet::ambisonicACN50: + case AudioChannelSet::ambisonicACN51: + case AudioChannelSet::ambisonicACN52: + case AudioChannelSet::ambisonicACN53: + case AudioChannelSet::ambisonicACN54: + case AudioChannelSet::ambisonicACN55: + case AudioChannelSet::ambisonicACN56: + case AudioChannelSet::ambisonicACN57: + case AudioChannelSet::ambisonicACN58: + case AudioChannelSet::ambisonicACN59: + case AudioChannelSet::ambisonicACN60: + case AudioChannelSet::ambisonicACN61: + case AudioChannelSet::ambisonicACN62: + case AudioChannelSet::ambisonicACN63: case AudioChannelSet::wideLeft: case AudioChannelSet::wideRight: case AudioChannelSet::unknown: diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp index f5815241ec..64aaf531f0 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp @@ -1214,7 +1214,23 @@ int32 AudioProcessor::getAAXPluginIDForMainBusConfig (const AudioChannelSet& mai AudioChannelSet::create7point1point2(), AudioChannelSet::ambisonic (1), AudioChannelSet::ambisonic (2), - AudioChannelSet::ambisonic (3) + AudioChannelSet::ambisonic (3), + AudioChannelSet::create5point0point2(), + AudioChannelSet::create5point1point2(), + AudioChannelSet::create5point0point4(), + AudioChannelSet::create5point1point4(), + AudioChannelSet::create7point0point4(), + AudioChannelSet::create7point1point4(), + AudioChannelSet::create7point0point6(), + AudioChannelSet::create7point1point6(), + AudioChannelSet::create9point0point4(), + AudioChannelSet::create9point1point4(), + AudioChannelSet::create9point0point6(), + AudioChannelSet::create9point1point6(), + AudioChannelSet::ambisonic (4), + AudioChannelSet::ambisonic (5), + AudioChannelSet::ambisonic (6), + AudioChannelSet::ambisonic (7) }; const auto index = (int) std::distance (std::begin (sets), std::find (std::begin (sets), std::end (sets), set));