diff --git a/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp b/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp index c6e46cc03e..8cfaa300b9 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp +++ b/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp @@ -277,3 +277,60 @@ AudioChannelSet AudioChannelSet::namedChannelSet (int numChannels) return AudioChannelSet(); } + +Array AudioChannelSet::channelSetsWithNumberOfChannels (int numChannels) +{ + Array retval; + + if (numChannels != 0) + { + retval.add (AudioChannelSet::discreteChannels (numChannels)); + + if (numChannels == 1) + { + retval.add (AudioChannelSet::mono()); + } + else if (numChannels == 2) + { + retval.add (AudioChannelSet::stereo()); + } + else if (numChannels == 3) + { + retval.add (AudioChannelSet::createLCR()); + retval.add (AudioChannelSet::createLRS()); + } + else if (numChannels == 4) + { + retval.add (AudioChannelSet::quadraphonic()); + retval.add (AudioChannelSet::createLCRS()); + retval.add (AudioChannelSet::ambisonic()); + } + else if (numChannels == 5) + { + retval.add (AudioChannelSet::create5point0()); + retval.add (AudioChannelSet::pentagonal()); + } + else if (numChannels == 6) + { + retval.add (AudioChannelSet::create5point1()); + retval.add (AudioChannelSet::create6point0()); + retval.add (AudioChannelSet::create6point0Music()); + retval.add (AudioChannelSet::hexagonal()); + } + else if (numChannels == 7) + { + retval.add (AudioChannelSet::create7point0()); + retval.add (AudioChannelSet::create7point0SDDS()); + retval.add (AudioChannelSet::create6point1()); + retval.add (AudioChannelSet::create6point1Music()); + } + else if (numChannels == 8) + { + retval.add (AudioChannelSet::create7point1()); + retval.add (AudioChannelSet::create7point1SDDS()); + retval.add (AudioChannelSet::octagonal()); + } + } + + return retval; +} diff --git a/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h b/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h index a8053a8876..c4c9274cc8 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h +++ b/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h @@ -251,6 +251,9 @@ public: function returns an empty set.*/ static AudioChannelSet namedChannelSet (int numChannels); + /** Return an array of channel sets which have a given number of channels */ + static Array channelSetsWithNumberOfChannels (int numChannels); + //============================================================================== /** Represents different audio channel types. */ enum ChannelType diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp index 35db88315f..0342db4672 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp @@ -1157,19 +1157,33 @@ bool AudioProcessor::Bus::isNumberOfChannelsSupported (int channels) const { if (channels == 0) return isLayoutSupported(AudioChannelSet::disabled()); - return isLayoutSupported (supportedLayoutWithChannels (channels)); + const AudioChannelSet set = supportedLayoutWithChannels (channels); + return (! set.isDisabled()) && isLayoutSupported (set); } AudioChannelSet AudioProcessor::Bus::supportedLayoutWithChannels (int channels) const { if (channels == 0) return AudioChannelSet::disabled(); - AudioChannelSet set; - if (! (set = AudioChannelSet::namedChannelSet (channels)).isDisabled() && isLayoutSupported (set)) - return set; + { + AudioChannelSet set; + if (! (set = AudioChannelSet::namedChannelSet (channels)).isDisabled() && isLayoutSupported (set)) + return set; - if (! (set = AudioChannelSet::discreteChannels (channels)).isDisabled() && isLayoutSupported (set)) - return set; + if (! (set = AudioChannelSet::discreteChannels (channels)).isDisabled() && isLayoutSupported (set)) + return set; + } + + Array sets = AudioChannelSet::channelSetsWithNumberOfChannels (channels); + const int n = sets.size(); + + for (int i = 0; i < n; ++i) + { + const AudioChannelSet set = sets.getReference (i); + + if (isLayoutSupported (set)) + return set; + } return AudioChannelSet::disabled(); }