/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) b) the Affero GPL v3 Details of these licenses can be found at: www.gnu.org/licenses JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.juce.com for more information. ============================================================================== */ AudioChannelSet::AudioChannelSet (uint32 c) : channels (c) {} bool AudioChannelSet::operator== (const AudioChannelSet& other) const noexcept { return channels == other.channels; } bool AudioChannelSet::operator!= (const AudioChannelSet& other) const noexcept { return channels != other.channels; } bool AudioChannelSet::operator< (const AudioChannelSet& other) const noexcept { return channels < other.channels; } const char* AudioChannelSet::getChannelTypeName (AudioChannelSet::ChannelType type) noexcept { switch (type) { case left: return NEEDS_TRANS("Left"); case right: return NEEDS_TRANS("Right"); case centre: return NEEDS_TRANS("Centre"); case subbass: return NEEDS_TRANS("Subbass"); case surroundLeft: return NEEDS_TRANS("Left Surround"); case surroundRight: return NEEDS_TRANS("Right Surround"); case centreLeft: return NEEDS_TRANS("Centre Left"); case centreRight: return NEEDS_TRANS("Centre Right"); case surround: return NEEDS_TRANS("Surround"); case sideLeft: return NEEDS_TRANS("Side Left"); case sideRight: return NEEDS_TRANS("Side Right"); case topMiddle: return NEEDS_TRANS("Top Middle"); case topFrontLeft: return NEEDS_TRANS("Top Front Left"); case topFrontCentre: return NEEDS_TRANS("Top Front Centre"); case topFrontRight: return NEEDS_TRANS("Top Front Right"); case topRearLeft: return NEEDS_TRANS("Top Rear Left"); case topRearCentre: return NEEDS_TRANS("Top Rear Centre"); case topRearRight: return NEEDS_TRANS("Top Rear Right"); case wideLeft: return NEEDS_TRANS("Wide Left"); case wideRight: return NEEDS_TRANS("Wide Right"); case subbass2: return NEEDS_TRANS("Subbass 2"); case ambisonicW: return NEEDS_TRANS("Ambisonic W"); case ambisonicX: return NEEDS_TRANS("Ambisonic X"); case ambisonicY: return NEEDS_TRANS("Ambisonic Y"); case ambisonicZ: return NEEDS_TRANS("Ambisonic Z"); default: break; } return "Unknown"; } const char* AudioChannelSet::getAbbreviatedChannelTypeName (AudioChannelSet::ChannelType type) noexcept { switch (type) { case left: return "L"; case right: return "R"; case centre: return "C"; case subbass: return "Lfe"; case surroundLeft: return "Ls"; case surroundRight: return "Rs"; case centreLeft: return "Lc"; case centreRight: return "Rc"; case surround: return "S"; case sideLeft: return "Sl"; case sideRight: return "Sr"; case topMiddle: return "Tm"; case topFrontLeft: return "Tfl"; case topFrontCentre: return "Tfc"; case topFrontRight: return "Tfr"; case topRearLeft: return "Trl"; case topRearCentre: return "Trc"; case topRearRight: return "Trr"; case wideLeft: return "Wl"; case wideRight: return "Wr"; case subbass2: return "Lfe2"; case ambisonicW: return "W"; case ambisonicX: return "X"; case ambisonicY: return "Y"; case ambisonicZ: return "Z"; default: break; } return ""; } String AudioChannelSet::getSpeakerArrangementAsString() const { StringArray speakerTypes; Array speakers = getChannelTypes(); for (int i = 0; i < speakers.size(); ++i) { String name = getAbbreviatedChannelTypeName (speakers.getReference (i)); if (name.isNotEmpty()) speakerTypes.add (name); } return speakerTypes.joinIntoString (" "); } int AudioChannelSet::size() const noexcept { return channels.countNumberOfSetBits(); } AudioChannelSet::ChannelType AudioChannelSet::getTypeOfChannel (int index) const noexcept { int bit = channels.findNextSetBit(0); for (int i = 0; i < index && bit >= 0; ++i) bit = channels.findNextSetBit (bit + 1); return static_cast (bit); } Array AudioChannelSet::getChannelTypes() const { Array result; for (int bit = channels.findNextSetBit(0); bit >= 0; bit = channels.findNextSetBit (bit + 1)) result.add (static_cast (bit)); return result; } void AudioChannelSet::addChannel (ChannelType newChannel) { const int bit = static_cast (newChannel); jassert (bit >= 0 && bit < 1024); channels.setBit (bit); } AudioChannelSet AudioChannelSet::disabled() { return AudioChannelSet(); } AudioChannelSet AudioChannelSet::mono() { return AudioChannelSet (1u << centre); } AudioChannelSet AudioChannelSet::stereo() { return AudioChannelSet ((1u << left) | (1u << right)); } AudioChannelSet AudioChannelSet::createLCR() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre)); } AudioChannelSet AudioChannelSet::createLCRS() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << surround)); } AudioChannelSet AudioChannelSet::quadraphonic() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << sideLeft) | (1u << sideRight)); } AudioChannelSet AudioChannelSet::pentagonal() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << sideLeft) | (1u << sideRight) | (1u << centre)); } AudioChannelSet AudioChannelSet::hexagonal() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << sideLeft) | (1u << sideRight) | (1u << centre) | (1u << surround)); } AudioChannelSet AudioChannelSet::octagonal() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << sideLeft) | (1u << sideRight) | (1u << centre) | (1u << surround) | (1u << wideLeft) | (1u << wideRight)); } AudioChannelSet AudioChannelSet::ambisonic() { return AudioChannelSet ((1u << ambisonicW) | (1u << ambisonicX) | (1u << ambisonicY) | (1u << ambisonicZ)); } AudioChannelSet AudioChannelSet::create5point0() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << surroundLeft) | (1u << surroundRight)); } AudioChannelSet AudioChannelSet::create5point1() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << subbass) | (1u << surroundLeft) | (1u << surroundRight)); } AudioChannelSet AudioChannelSet::create6point0() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << surroundLeft) | (1u << surroundRight) | (1u << surround)); } AudioChannelSet AudioChannelSet::create6point1() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << subbass) | (1u << surroundLeft) | (1u << surroundRight) | (1u << surround)); } AudioChannelSet AudioChannelSet::create7point0() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << surroundLeft) | (1u << surroundRight) | (1u << topRearLeft) | (1u << topRearRight)); } AudioChannelSet AudioChannelSet::create7point1() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << subbass) | (1u << surroundLeft) | (1u << surroundRight) | (1u << topRearLeft) | (1u << topRearRight)); } AudioChannelSet AudioChannelSet::createFront7point0() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << surroundLeft) | (1u << surroundRight) | (1u << centreLeft) | (1u << centreRight)); } AudioChannelSet AudioChannelSet::createFront7point1() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << subbass) | (1u << surroundLeft) | (1u << surroundRight) | (1u << centreLeft) | (1u << centreRight)); } AudioChannelSet AudioChannelSet::discreteChannels (int numChannels) { AudioChannelSet s; s.channels.setRange (discreteChannel0, numChannels, true); return s; } AudioChannelSet AudioChannelSet::canonicalChannelSet (int numChannels) { if (numChannels == 1) return AudioChannelSet::mono(); if (numChannels == 2) return AudioChannelSet::stereo(); if (numChannels == 4) return AudioChannelSet::quadraphonic(); return discreteChannels (numChannels); }