|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2017 - ROLI Ltd.
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- The code included in this file is provided under the terms of the ISC license
- http://www.isc.org/downloads/software-support-policy/isc-license. Permission
- To use, copy, modify, and/or distribute this software for any purpose with or
- without fee is hereby granted provided that the above copyright notice and
- this permission notice appear in all copies.
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- namespace juce
- {
-
- //==============================================================================
- /**
- Represents a set of audio channel types.
-
- For example, you might have a set of left + right channels, which is a stereo
- channel set. It is a collection of values from the AudioChannelSet::ChannelType
- enum, where each type may only occur once within the set.
-
- The documentation below lists which AudioChannelSet corresponds to which native
- layouts used by AAX, VST2/VST3 and CoreAudio/AU. The layout tags in CoreAudio
- are particularly confusing. For example, the layout which is labeled as "7.1 SDDS"
- in Logic Pro, corresponds to CoreAudio/AU's kAudioChannelLayoutTag_DTS_7_0 tag, whereas
- AAX's DTS 7.1 Layout corresponds to CoreAudio/AU's
- kAudioChannelLayoutTag_MPEG_7_1_A format, etc. Please do not use the CoreAudio tag
- as an indication to the actual layout of the speakers.
-
- @see Bus
- */
- class JUCE_API AudioChannelSet
- {
- public:
- /** Creates an empty channel set.
- You can call addChannel to add channels to the set.
- */
- AudioChannelSet() noexcept {}
-
- /** Creates a zero-channel set which can be used to indicate that a
- bus is disabled. */
- static AudioChannelSet JUCE_CALLTYPE disabled();
-
- //==============================================================================
- /** Creates a one-channel mono set (centre).
-
- Is equivalent to: kMonoAAX (VST), AAX_eStemFormat_Mono (AAX), kAudioChannelLayoutTag_Mono (CoreAudio)
- */
- static AudioChannelSet JUCE_CALLTYPE mono();
-
-
- /** Creates a set containing a stereo set (left, right).
-
- Is equivalent to: kStereo (VST), AAX_eStemFormat_Stereo (AAX), kAudioChannelLayoutTag_Stereo (CoreAudio)
- */
- static AudioChannelSet JUCE_CALLTYPE stereo();
-
-
- //==============================================================================
- /** Creates a set containing an LCR set (left, right, centre).
-
- Is equivalent to: k30Cine (VST), AAX_eStemFormat_LCR (AAX), kAudioChannelLayoutTag_MPEG_3_0_A (CoreAudio)
-
- This format is referred to as "LRC" in Cubase.
- This format is referred to as "LCR" in Pro Tools.
- */
- static AudioChannelSet JUCE_CALLTYPE createLCR();
-
-
- /** Creates a set containing an LRS set (left, right, surround).
-
- Is equivalent to: k30Music (VST), n/a (AAX), kAudioChannelLayoutTag_ITU_2_1 (CoreAudio)
-
- This format is referred to as "LRS" in Cubase.
- */
- static AudioChannelSet JUCE_CALLTYPE createLRS();
-
-
- /** Creates a set containing an LCRS set (left, right, centre, surround).
-
- Is equivalent to: k40Cine (VST), AAX_eStemFormat_LCRS (AAX), kAudioChannelLayoutTag_MPEG_4_0_A (CoreAudio)
-
- This format is referred to as "LCRS (Pro Logic)" in Logic Pro.
- This format is referred to as "LRCS" in Cubase.
- This format is referred to as "LCRS" in Pro Tools.
- */
- static AudioChannelSet JUCE_CALLTYPE createLCRS();
-
-
- //==============================================================================
- /** Creates a set for a 5.0 surround setup (left, right, centre, leftSurround, rightSurround).
-
- Is equivalent to: k50 (VST), AAX_eStemFormat_5_0 (AAX), kAudioChannelLayoutTag_MPEG_5_0_A (CoreAudio)
-
- This format is referred to as "5.0" in Cubase.
- This format is referred to as "5.0" in Pro Tools.
- */
- static AudioChannelSet JUCE_CALLTYPE create5point0();
-
-
- /** Creates a set for a 5.1 surround setup (left, right, centre, leftSurround, rightSurround, LFE).
-
- Is equivalent to: k51 (VST), AAX_eStemFormat_5_1 (AAX), kAudioChannelLayoutTag_MPEG_5_1_A (CoreAudio)
-
- This format is referred to as "5.1 (ITU 775)" in Logic Pro.
- This format is referred to as "5.1" in Cubase.
- This format is referred to as "5.1" in Pro Tools.
- */
- static AudioChannelSet JUCE_CALLTYPE create5point1();
-
-
- /** Creates a set for a 6.0 Cine surround setup (left, right, centre, leftSurround, rightSurround, centreSurround).
-
- Is equivalent to: k60Cine (VST), AAX_eStemFormat_6_0 (AAX), kAudioChannelLayoutTag_AudioUnit_6_0 (CoreAudio)
-
- Logic Pro incorrectly uses this for the surround format labeled "6.1 (ES/EX)".
- This format is referred to as "6.0 Cine" in Cubase.
- This format is referred to as "6.0" in Pro Tools.
- */
- static AudioChannelSet JUCE_CALLTYPE create6point0();
-
-
- /** Creates a set for a 6.1 Cine surround setup (left, right, centre, leftSurround, rightSurround, centreSurround, LFE).
-
- Is equivalent to: k61Cine (VST), AAX_eStemFormat_6_1 (AAX), kAudioChannelLayoutTag_MPEG_6_1_A (CoreAudio)
-
- This format is referred to as "6.1" in Pro Tools.
- */
- static AudioChannelSet JUCE_CALLTYPE create6point1();
-
-
- /** Creates a set for a 6.0 Music surround setup (left, right, leftSurround, rightSurround, leftSurroundSide, rightSurroundSide).
-
- Is equivalent to: k60Music (VST), n/a (AAX), kAudioChannelLayoutTag_DTS_6_0_A (CoreAudio)
-
- This format is referred to as "6.0 Music" in Cubase.
- */
- static AudioChannelSet JUCE_CALLTYPE create6point0Music();
-
-
- /** Creates a set for a 6.0 Music surround setup (left, right, leftSurround, rightSurround, leftSurroundSide, rightSurroundSide, LFE).
-
- Is equivalent to: k61Music (VST), n/a (AAX), kAudioChannelLayoutTag_DTS_6_1_A (CoreAudio)
- */
- static AudioChannelSet JUCE_CALLTYPE create6point1Music();
-
-
- /** Creates a set for a DTS 7.0 surround setup (left, right, centre, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear).
-
- Is equivalent to: k70Music (VST), AAX_eStemFormat_7_0_DTS (AAX), kAudioChannelLayoutTag_AudioUnit_7_0 (CoreAudio)
-
- This format is referred to as "7.0" in Pro Tools.
- */
- static AudioChannelSet JUCE_CALLTYPE create7point0();
-
-
- /** Creates a set for a SDDS 7.0 surround setup (left, right, centre, leftSurround, rightSurround, leftCentre, rightCentre).
-
- Is equivalent to: k70Cine (VST), AAX_eStemFormat_7_0_SDDS (AAX), kAudioChannelLayoutTag_AudioUnit_7_0_Front (CoreAudio)
-
- This format is referred to as "7.0 SDDS" in Pro Tools.
- */
- static AudioChannelSet JUCE_CALLTYPE create7point0SDDS();
-
-
- /** Creates a set for a DTS 7.1 surround setup (left, right, centre, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, LFE).
-
- Is equivalent to: k71CineSideFill (VST), AAX_eStemFormat_7_1_DTS (AAX), kAudioChannelLayoutTag_MPEG_7_1_C/kAudioChannelLayoutTag_ITU_3_4_1 (CoreAudio)
-
- This format is referred to as "7.1 (3/4.1)" in Logic Pro.
- This format is referred to as "7.1" in Pro Tools.
- */
- static AudioChannelSet JUCE_CALLTYPE create7point1();
-
-
- /** Creates a set for a 7.1 surround setup (left, right, centre, leftSurround, rightSurround, leftCentre, rightCentre, LFE).
-
- Is equivalent to: k71Cine (VST), AAX_eStemFormat_7_1_SDDS (AAX), kAudioChannelLayoutTag_MPEG_7_1_A (CoreAudio)
-
- This format is referred to as "7.1 (SDDS)" in Logic Pro.
- This format is referred to as "7.1 SDDS" in Pro Tools.
- */
- static AudioChannelSet JUCE_CALLTYPE create7point1SDDS();
-
- /** Creates a set for Dolby Atmos 7.0.2 surround setup (left, right, centre, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, topSideLeft, topSideRight).
-
- Is equivalent to: n/a (VST), AAX_eStemFormat_7_0_2 (AAX), n/a (CoreAudio)
- */
- static AudioChannelSet JUCE_CALLTYPE create7point0point2();
-
- /** Creates a set for Dolby Atmos 7.1.2 surround setup (left, right, centre, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, LFE, topSideLeft, topSideRight).
-
- Is equivalent to: k71_2 (VST), AAX_eStemFormat_7_1_2 (AAX), n/a (CoreAudio)
- */
- static AudioChannelSet JUCE_CALLTYPE create7point1point2();
-
-
- //==============================================================================
- /** Creates a set for ambisonic surround setups (ambisonicW, ambisonicX, ambisonicY, ambisonicZ).
-
- Is equivalent to: kBFormat (VST), n/a (AAX), kAudioChannelLayoutTag_Ambisonic_B_Format (CoreAudio)
- */
- static AudioChannelSet JUCE_CALLTYPE ambisonic();
-
-
- /** Creates a set for quadraphonic surround setup (left, right, leftSurround, rightSurround)
-
- Is equivalent to: k40Music (VST), AAX_eStemFormat_Quad (AAX), kAudioChannelLayoutTag_Quadraphonic (CoreAudio)
-
- This format is referred to as "Quadraphonic" in Logic Pro.
- This format is referred to as "Quadro" in Cubase.
- This format is referred to as "Quad" in Pro Tools.
- */
- static AudioChannelSet JUCE_CALLTYPE quadraphonic();
-
-
- /** Creates a set for pentagonal surround setup (left, right, centre, leftSurroundRear, rightSurroundRear).
-
- Is equivalent to: n/a (VST), n/a (AAX), kAudioChannelLayoutTag_Pentagonal (CoreAudio)
- */
- static AudioChannelSet JUCE_CALLTYPE pentagonal();
-
-
- /** Creates a set for hexagonal surround setup (left, right, leftSurroundRear, rightSurroundRear, centre, surroundCentre).
-
- Is equivalent to: n/a (VST), n/a (AAX), kAudioChannelLayoutTag_Hexagonal (CoreAudio)
- */
- static AudioChannelSet JUCE_CALLTYPE hexagonal();
-
-
- /** Creates a set for octagonal surround setup (left, right, leftSurround, rightSurround, centre, centreSurround, wideLeft, wideRight).
-
- Is equivalent to: n/a (VST), n/a (AAX), kAudioChannelLayoutTag_Octagonal (CoreAudio)
- */
- static AudioChannelSet JUCE_CALLTYPE octagonal();
-
- //==============================================================================
- /** Creates a set of untyped discrete channels. */
- static AudioChannelSet JUCE_CALLTYPE discreteChannels (int numChannels);
-
- /** Create a canonical channel set for a given number of channels.
- For example, numChannels = 1 will return mono, numChannels = 2 will return stereo, etc. */
- static AudioChannelSet JUCE_CALLTYPE canonicalChannelSet (int numChannels);
-
- /** Create a channel set for a given number of channels which is non-discrete.
- If numChannels is larger than the number of channels of the surround format
- with the maximum amount of channels (currently 7.1 Surround), then this
- function returns an empty set.*/
- static AudioChannelSet JUCE_CALLTYPE namedChannelSet (int numChannels);
-
- /** Return an array of channel sets which have a given number of channels */
- static Array<AudioChannelSet> JUCE_CALLTYPE channelSetsWithNumberOfChannels (int numChannels);
-
- //==============================================================================
- /** Represents different audio channel types. */
- enum ChannelType
- {
- unknown = 0,
-
- left = 1, // L
- right = 2, // R
- centre = 3, // C (sometimes M for mono)
-
- LFE = 4,
- leftSurround = 5, // Ls
- rightSurround = 6, // Rs
- leftCentre = 7, // Lc (AAX/VST), Lc used as Lss in AU for most layouts
- rightCentre = 8, // Rc (AAX/VST), Rc used as Rss in AU for most layouts
- centreSurround = 9, // Cs/S
- surround = centreSurround, // Cs/S
- leftSurroundSide = 10, // Lss (AXX), Side Left "Sl" (VST), Left Centre "LC" (AU)
- rightSurroundSide = 11, // Rss (AXX), Side right "Sr" (VST), Right Centre "Rc" (AU)
- topMiddle = 12,
- topFrontLeft = 13,
- topFrontCentre = 14,
- topFrontRight = 15,
- topRearLeft = 16,
- topRearCentre = 17,
- topRearRight = 18,
- LFE2 = 19,
- leftSurroundRear = 20, // Lsr (AAX), Lcs (VST), Rls (AU)
- rightSurroundRear = 21, // Rsr (AAX), Rcs (VST), Rrs (AU)
- wideLeft = 22,
- wideRight = 23,
-
-
- ambisonicW = 24,
- ambisonicX = 25,
- ambisonicY = 26,
- ambisonicZ = 27,
-
- // Used by Dolby Atmos 7.0.2 and 7.1.2
- topSideLeft = 28, // Lts (AAX), Tsl (VST)
- topSideRight = 29, // Rts (AAX), Tsr (VST)
-
-
- discreteChannel0 = 64 /**< 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". */
- static String JUCE_CALLTYPE getChannelTypeName (ChannelType);
-
- /** Returns the abbreviated name of a channel type. For example, this method may return "Ls". */
- static String JUCE_CALLTYPE getAbbreviatedChannelTypeName (ChannelType);
-
- /** Returns the channel type from an abbreviated name. */
- static ChannelType JUCE_CALLTYPE getChannelTypeFromAbbreviation (const String& abbreviation);
-
- //==============================================================================
- enum
- {
- maxChannelsOfNamedLayout = 10
- };
-
- /** Adds a channel to the set. */
- void addChannel (ChannelType newChannelType);
-
- /** Removes a channel from the set. */
- void removeChannel (ChannelType newChannelType);
-
- /** Returns the number of channels in the set. */
- int size() const noexcept;
-
- /** Returns true if there are no channels in the set. */
- bool isDisabled() const noexcept { return size() == 0; }
-
- /** Returns an array of all the types in this channel set. */
- Array<ChannelType> getChannelTypes() const;
-
- /** Returns the type of one of the channels in the set, by index. */
- ChannelType getTypeOfChannel (int channelIndex) const noexcept;
-
- /** Returns the index for a particular channel-type.
- Will return -1 if the this set does not contain a channel of this type. */
- int getChannelIndexForType (ChannelType type) const noexcept;
-
- /** Returns a string containing a whitespace-separated list of speaker types
- corresponding to each channel. For example in a 5.1 arrangement,
- the string may be "L R C Lfe Ls Rs". If the speaker arrangement is unknown,
- the returned string will be empty.*/
- String getSpeakerArrangementAsString() const;
-
- /** Returns an AudioChannelSet from a string returned by getSpeakerArrangementAsString
-
- @see getSpeakerArrangementAsString */
- static AudioChannelSet fromAbbreviatedString (const String& set);
-
- /** Returns the description of the current layout. For example, this method may return
- "Quadraphonic". Note that the returned string may not be unique. */
- String getDescription() const;
-
- /** Returns if this is a channel layout made-up of discrete channels. */
- bool isDiscreteLayout() const noexcept;
-
- /** Intersect two channel layouts. */
- void intersect (const AudioChannelSet& other) { channels &= other.channels; }
-
- /** Creates a channel set for a list of channel types. This function will assert
- if you supply a duplicate channel.
-
- Note that this method ignores the order in which the channels are given, i.e.
- two arrays with the same elements but in a different order will still result
- in the same channel set.
- */
- static AudioChannelSet JUCE_CALLTYPE channelSetWithChannels (const Array<ChannelType>&);
-
- //==============================================================================
- // Conversion between wave and juce channel layout identifiers
-
- /** Create an AudioChannelSet from a WAVEFORMATEXTENSIBLE channelMask (typically used
- in .wav files). */
- static AudioChannelSet JUCE_CALLTYPE fromWaveChannelMask (int32 dwChannelMask);
-
- /** Returns a WAVEFORMATEXTENSIBLE channelMask representation (typically used in .wav
- files) of the receiver.
-
- Returns -1 if the receiver cannot be represented in a WAVEFORMATEXTENSIBLE channelMask
- representation.
- */
- int32 getWaveChannelMask() const noexcept;
-
- //==============================================================================
- bool operator== (const AudioChannelSet&) const noexcept;
- bool operator!= (const AudioChannelSet&) const noexcept;
- bool operator< (const AudioChannelSet&) const noexcept;
-
- private:
- //==============================================================================
- BigInteger channels;
-
- //==============================================================================
- explicit AudioChannelSet (uint32);
- explicit AudioChannelSet (const Array<ChannelType>&);
- };
-
- } // namespace juce
|