34 for (
auto channel :
c)
135 case left:
return "L";
136 case right:
return "R";
138 case LFE:
return "Lfe";
155 case LFE2:
return "Lfe2";
219 if (abbr.
length() > 0 && (abbr[0] >=
'0' && abbr[0] <=
'9'))
223 if (abbr ==
"L")
return left;
224 if (abbr ==
"R")
return right;
225 if (abbr ==
"C")
return centre;
226 if (abbr ==
"Lfe")
return LFE;
243 if (abbr ==
"Lfe2")
return LFE2;
307 if (
name.isNotEmpty())
332 if (*
this ==
disabled())
return "Disabled";
333 if (*
this ==
mono())
return "Mono";
334 if (*
this ==
stereo())
return "Stereo";
360 if (*
this ==
pentagonal())
return "Pentagonal";
361 if (*
this ==
hexagonal())
return "Hexagonal";
362 if (*
this ==
octagonal())
return "Octagonal";
374 case 1: suffix =
"st";
break;
375 case 2: suffix =
"nd";
break;
376 case 3: suffix =
"rd";
break;
377 default: suffix =
"th";
break;
380 return String (order) + suffix +
" Order Ambisonics";
398 return channels.countNumberOfSetBits();
403 int bit =
channels.findNextSetBit(0);
406 bit =
channels.findNextSetBit (bit + 1);
415 for (
int bit =
channels.findNextSetBit (0); bit >= 0; bit =
channels.findNextSetBit (bit + 1))
430 for (
int bit =
channels.findNextSetBit(0); bit >= 0; bit =
channels.findNextSetBit (bit + 1))
438 const int bit =
static_cast<int> (newChannel);
439 jassert (bit >= 0 && bit < 1024);
445 const int bit =
static_cast<int> (newChannel);
446 jassert (bit >= 0 && bit < 1024);
474AudioChannelSet AudioChannelSet::create7point0point4() {
return AudioChannelSet ({
left,
right,
centre,
leftSurroundSide,
rightSurroundSide,
leftSurroundRear,
rightSurroundRear,
topFrontLeft,
topFrontRight,
topRearLeft,
topRearRight }); }
475AudioChannelSet AudioChannelSet::create7point1point4() {
return AudioChannelSet ({
left,
right,
centre,
LFE,
leftSurroundSide,
rightSurroundSide,
leftSurroundRear,
rightSurroundRear,
topFrontLeft,
topFrontRight,
topRearLeft,
topRearRight }); }
476AudioChannelSet AudioChannelSet::create7point1point6() {
return AudioChannelSet ({
left,
right,
centre,
LFE,
leftSurroundSide,
rightSurroundSide,
leftSurroundRear,
rightSurroundRear,
topFrontLeft,
topFrontRight,
topSideLeft,
topSideRight,
topRearLeft,
topRearRight }); }
477AudioChannelSet AudioChannelSet::create9point1point6() {
return AudioChannelSet ({
left,
right,
centre,
LFE,
leftSurroundSide,
rightSurroundSide,
leftSurroundRear,
rightSurroundRear,
wideLeft,
wideRight,
topFrontLeft,
topFrontRight,
topSideLeft,
topSideRight,
topRearLeft,
topRearRight }); }
488 auto numAmbisonicChannels = (order + 1) * (order + 1);
498 if (ambisonicOrder >= 0)
499 return (*
this ==
ambisonic (ambisonicOrder) ? ambisonicOrder : -1);
543 if (numChannels != 0)
609 for (
auto ch : channelArray)
636 auto sqrtMinusOne = std::sqrt (
static_cast<float> (numChannels)) - 1.0f;
637 auto ambisonicOrder =
jmax (0,
static_cast<int> (std::floor (sqrtMinusOne)));
639 if (ambisonicOrder > 5)
642 return (
static_cast<float> (ambisonicOrder) == sqrtMinusOne ? ambisonicOrder : -1);
650class AudioChannelSetUnitTest :
public UnitTest
653 AudioChannelSetUnitTest()
657 void runTest()
override
659 auto max = AudioChannelSet::maxChannelsOfNamedLayout;
661 beginTest (
"maxChannelsOfNamedLayout is non-discrete");
662 expect (AudioChannelSet::channelSetsWithNumberOfChannels (
max).
size() >= 2);
664 beginTest (
"channelSetsWithNumberOfChannels returns correct speaker count");
666 for (
auto ch = 1; ch <=
max; ++ch)
668 auto channelSets = AudioChannelSet::channelSetsWithNumberOfChannels (ch);
670 for (
auto set : channelSets)
671 expect (set.size() == ch);
675 beginTest (
"Ambisonics");
679 mask |= (1ull << AudioChannelSet::ambisonicACN0);
680 checkAmbisonic (
mask, 0,
"0th Order Ambisonics");
682 mask |= (1ull << AudioChannelSet::ambisonicACN1) | (1ull << AudioChannelSet::ambisonicACN2) | (1ull << AudioChannelSet::ambisonicACN3);
683 checkAmbisonic (
mask, 1,
"1st Order Ambisonics");
685 mask |= (1ull << AudioChannelSet::ambisonicACN4) | (1ull << AudioChannelSet::ambisonicACN5) | (1ull << AudioChannelSet::ambisonicACN6)
686 | (1ull << AudioChannelSet::ambisonicACN7) | (1ull << AudioChannelSet::ambisonicACN8);
687 checkAmbisonic (
mask, 2,
"2nd Order Ambisonics");
689 mask |= (1ull << AudioChannelSet::ambisonicACN9) | (1ull << AudioChannelSet::ambisonicACN10) | (1ull << AudioChannelSet::ambisonicACN11)
690 | (1ull << AudioChannelSet::ambisonicACN12) | (1ull << AudioChannelSet::ambisonicACN13) | (1ull << AudioChannelSet::ambisonicACN14)
691 | (1ull << AudioChannelSet::ambisonicACN15);
692 checkAmbisonic (
mask, 3,
"3rd Order Ambisonics");
694 mask |= (1ull << AudioChannelSet::ambisonicACN16) | (1ull << AudioChannelSet::ambisonicACN17) | (1ull << AudioChannelSet::ambisonicACN18)
695 | (1ull << AudioChannelSet::ambisonicACN19) | (1ull << AudioChannelSet::ambisonicACN20) | (1ull << AudioChannelSet::ambisonicACN21)
696 | (1ull << AudioChannelSet::ambisonicACN22) | (1ull << AudioChannelSet::ambisonicACN23) | (1ull << AudioChannelSet::ambisonicACN24);
697 checkAmbisonic (
mask, 4,
"4th Order Ambisonics");
699 mask |= (1ull << AudioChannelSet::ambisonicACN25) | (1ull << AudioChannelSet::ambisonicACN26) | (1ull << AudioChannelSet::ambisonicACN27)
700 | (1ull << AudioChannelSet::ambisonicACN28) | (1ull << AudioChannelSet::ambisonicACN29) | (1ull << AudioChannelSet::ambisonicACN30)
701 | (1ull << AudioChannelSet::ambisonicACN31) | (1ull << AudioChannelSet::ambisonicACN32) | (1ull << AudioChannelSet::ambisonicACN33)
702 | (1ull << AudioChannelSet::ambisonicACN34) | (1ull << AudioChannelSet::ambisonicACN35);
703 checkAmbisonic (
mask, 5,
"5th Order Ambisonics");
708 void checkAmbisonic (
uint64 mask,
int order,
const char* layoutName)
710 auto expected = AudioChannelSet::ambisonic (order);
711 auto numChannels = expected.size();
713 expect (numChannels == BigInteger ((
int64)
mask).countNumberOfSetBits());
714 expect (channelSetFromMask (
mask) == expected);
716 expect (order == expected.getAmbisonicOrder());
717 expect (expected.getDescription() == layoutName);
719 auto layouts = AudioChannelSet::channelSetsWithNumberOfChannels (numChannels);
720 expect (layouts.contains (expected));
722 for (
auto layout : layouts)
723 expect (layout.getAmbisonicOrder() == (layout == expected ? order : -1));
726 static AudioChannelSet channelSetFromMask (
uint64 mask)
728 Array<AudioChannelSet::ChannelType> channels;
729 for (
int bit = 0; bit <= 62; ++bit)
730 if ((
mask & (1ull << bit)) != 0)
731 channels.
add (
static_cast<AudioChannelSet::ChannelType
> (bit));
733 return AudioChannelSet::channelSetWithChannels (channels);
737static AudioChannelSetUnitTest audioChannelSetUnitTest;
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
int64_t int64
Definition basics.h:91
uint64_t uint64
Definition basics.h:92
static const unsigned long mask[]
Definition bitwise.c:31
bool add(const ElementType &newElement) noexcept
Definition Array.h:354
Definition juce_Array.h:56
int getAmbisonicOrder() const
Definition juce_AudioChannelSet.cpp:494
static AudioChannelSet JUCE_CALLTYPE create7point1()
Definition juce_AudioChannelSet.cpp:464
static AudioChannelSet JUCE_CALLTYPE namedChannelSet(int numChannels)
Definition juce_AudioChannelSet.cpp:525
static AudioChannelSet JUCE_CALLTYPE quadraphonic()
Definition juce_AudioChannelSet.cpp:466
static AudioChannelSet JUCE_CALLTYPE create5point0()
Definition juce_AudioChannelSet.cpp:456
static ChannelType JUCE_CALLTYPE getChannelTypeFromAbbreviation(const String &abbreviation)
Definition juce_AudioChannelSet.cpp:217
static int JUCE_CALLTYPE getAmbisonicOrderForNumChannels(int)
Definition juce_AudioChannelSet.cpp:634
int size() const noexcept
Definition juce_AudioChannelSet.cpp:396
static AudioChannelSet JUCE_CALLTYPE create6point0()
Definition juce_AudioChannelSet.cpp:458
bool isDiscreteLayout() const noexcept
Definition juce_AudioChannelSet.cpp:387
AudioChannelSet()=default
static AudioChannelSet JUCE_CALLTYPE create6point1Music()
Definition juce_AudioChannelSet.cpp:461
void removeChannel(ChannelType newChannelType)
Definition juce_AudioChannelSet.cpp:443
static AudioChannelSet JUCE_CALLTYPE create5point1point4()
Definition juce_AudioChannelSet.cpp:471
static AudioChannelSet JUCE_CALLTYPE disabled()
Definition juce_AudioChannelSet.cpp:450
static AudioChannelSet JUCE_CALLTYPE hexagonal()
Definition juce_AudioChannelSet.cpp:468
static AudioChannelSet fromAbbreviatedString(const String &set)
Definition juce_AudioChannelSet.cpp:314
static AudioChannelSet JUCE_CALLTYPE mono()
Definition juce_AudioChannelSet.cpp:451
static AudioChannelSet JUCE_CALLTYPE create7point0point4()
Definition juce_AudioChannelSet.cpp:474
BigInteger channels
Definition juce_AudioChannelSet.h:515
static AudioChannelSet JUCE_CALLTYPE createLRS()
Definition juce_AudioChannelSet.cpp:454
static Array< AudioChannelSet > JUCE_CALLTYPE channelSetsWithNumberOfChannels(int numChannels)
Definition juce_AudioChannelSet.cpp:539
static AudioChannelSet JUCE_CALLTYPE stereo()
Definition juce_AudioChannelSet.cpp:452
ChannelType
Definition juce_AudioChannelSet.h:317
@ wideRight
Definition juce_AudioChannelSet.h:346
@ topFrontRight
Definition juce_AudioChannelSet.h:338
@ ambisonicACN2
Definition juce_AudioChannelSet.h:359
@ topFrontLeft
Definition juce_AudioChannelSet.h:336
@ ambisonicACN25
Definition juce_AudioChannelSet.h:390
@ ambisonicACN28
Definition juce_AudioChannelSet.h:393
@ right
Definition juce_AudioChannelSet.h:322
@ ambisonicW
Definition juce_AudioChannelSet.h:403
@ ambisonicACN13
Definition juce_AudioChannelSet.h:374
@ ambisonicACN8
Definition juce_AudioChannelSet.h:367
@ ambisonicACN4
Definition juce_AudioChannelSet.h:363
@ leftSurround
Definition juce_AudioChannelSet.h:327
@ topRearLeft
Definition juce_AudioChannelSet.h:339
@ ambisonicACN15
Definition juce_AudioChannelSet.h:376
@ centreSurround
Definition juce_AudioChannelSet.h:331
@ topSideLeft
Definition juce_AudioChannelSet.h:350
@ ambisonicACN30
Definition juce_AudioChannelSet.h:395
@ surround
Definition juce_AudioChannelSet.h:332
@ unknown
Definition juce_AudioChannelSet.h:318
@ proximityRight
Definition juce_AudioChannelSet.h:414
@ ambisonicACN19
Definition juce_AudioChannelSet.h:382
@ ambisonicACN18
Definition juce_AudioChannelSet.h:381
@ bottomRearCentre
Definition juce_AudioChannelSet.h:419
@ ambisonicACN27
Definition juce_AudioChannelSet.h:392
@ centre
Definition juce_AudioChannelSet.h:323
@ ambisonicACN21
Definition juce_AudioChannelSet.h:384
@ bottomRearRight
Definition juce_AudioChannelSet.h:420
@ ambisonicACN26
Definition juce_AudioChannelSet.h:391
@ ambisonicACN22
Definition juce_AudioChannelSet.h:385
@ ambisonicACN12
Definition juce_AudioChannelSet.h:373
@ bottomRearLeft
Definition juce_AudioChannelSet.h:418
@ ambisonicACN24
Definition juce_AudioChannelSet.h:387
@ topSideRight
Definition juce_AudioChannelSet.h:351
@ ambisonicACN1
Definition juce_AudioChannelSet.h:358
@ ambisonicACN32
Definition juce_AudioChannelSet.h:397
@ rightSurroundRear
Definition juce_AudioChannelSet.h:344
@ rightSurroundSide
Definition juce_AudioChannelSet.h:334
@ ambisonicACN29
Definition juce_AudioChannelSet.h:394
@ ambisonicACN3
Definition juce_AudioChannelSet.h:360
@ ambisonicACN31
Definition juce_AudioChannelSet.h:396
@ bottomFrontRight
Definition juce_AudioChannelSet.h:411
@ ambisonicACN6
Definition juce_AudioChannelSet.h:365
@ ambisonicZ
Definition juce_AudioChannelSet.h:406
@ wideLeft
Definition juce_AudioChannelSet.h:345
@ ambisonicACN17
Definition juce_AudioChannelSet.h:380
@ proximityLeft
Definition juce_AudioChannelSet.h:413
@ ambisonicACN35
Definition juce_AudioChannelSet.h:400
@ rightSurround
Definition juce_AudioChannelSet.h:328
@ ambisonicACN20
Definition juce_AudioChannelSet.h:383
@ ambisonicACN16
Definition juce_AudioChannelSet.h:379
@ ambisonicY
Definition juce_AudioChannelSet.h:405
@ ambisonicACN0
Definition juce_AudioChannelSet.h:357
@ bottomFrontCentre
Definition juce_AudioChannelSet.h:410
@ ambisonicACN10
Definition juce_AudioChannelSet.h:371
@ topRearCentre
Definition juce_AudioChannelSet.h:340
@ ambisonicACN14
Definition juce_AudioChannelSet.h:375
@ topMiddle
Definition juce_AudioChannelSet.h:335
@ topFrontCentre
Definition juce_AudioChannelSet.h:337
@ ambisonicACN34
Definition juce_AudioChannelSet.h:399
@ topRearRight
Definition juce_AudioChannelSet.h:341
@ LFE2
Definition juce_AudioChannelSet.h:342
@ rightCentre
Definition juce_AudioChannelSet.h:330
@ leftCentre
Definition juce_AudioChannelSet.h:329
@ bottomSideRight
Definition juce_AudioChannelSet.h:417
@ ambisonicACN5
Definition juce_AudioChannelSet.h:364
@ ambisonicACN23
Definition juce_AudioChannelSet.h:386
@ ambisonicACN11
Definition juce_AudioChannelSet.h:372
@ ambisonicX
Definition juce_AudioChannelSet.h:404
@ leftSurroundSide
Definition juce_AudioChannelSet.h:333
@ bottomSideLeft
Definition juce_AudioChannelSet.h:416
@ ambisonicACN7
Definition juce_AudioChannelSet.h:366
@ ambisonicACN33
Definition juce_AudioChannelSet.h:398
@ discreteChannel0
Definition juce_AudioChannelSet.h:423
@ bottomFrontLeft
Definition juce_AudioChannelSet.h:409
@ leftSurroundRear
Definition juce_AudioChannelSet.h:343
@ left
Definition juce_AudioChannelSet.h:321
@ ambisonicACN9
Definition juce_AudioChannelSet.h:370
@ LFE
Definition juce_AudioChannelSet.h:326
static AudioChannelSet JUCE_CALLTYPE octagonal()
Definition juce_AudioChannelSet.cpp:469
static AudioChannelSet JUCE_CALLTYPE create6point1()
Definition juce_AudioChannelSet.cpp:459
void addChannel(ChannelType newChannelType)
Definition juce_AudioChannelSet.cpp:436
static AudioChannelSet JUCE_CALLTYPE create5point1()
Definition juce_AudioChannelSet.cpp:457
static AudioChannelSet JUCE_CALLTYPE create7point0SDDS()
Definition juce_AudioChannelSet.cpp:463
static AudioChannelSet JUCE_CALLTYPE create5point1point2()
Definition juce_AudioChannelSet.cpp:470
ChannelType getTypeOfChannel(int channelIndex) const noexcept
Definition juce_AudioChannelSet.cpp:401
static AudioChannelSet JUCE_CALLTYPE create9point1point6()
Definition juce_AudioChannelSet.cpp:477
static AudioChannelSet JUCE_CALLTYPE create6point0Music()
Definition juce_AudioChannelSet.cpp:460
static String JUCE_CALLTYPE getChannelTypeName(ChannelType)
Definition juce_AudioChannelSet.cpp:42
static AudioChannelSet JUCE_CALLTYPE create7point0point2()
Definition juce_AudioChannelSet.cpp:472
static AudioChannelSet JUCE_CALLTYPE create7point1SDDS()
Definition juce_AudioChannelSet.cpp:465
String getSpeakerArrangementAsString() const
Definition juce_AudioChannelSet.cpp:299
static AudioChannelSet JUCE_CALLTYPE create7point0()
Definition juce_AudioChannelSet.cpp:462
static AudioChannelSet JUCE_CALLTYPE channelSetWithChannels(const Array< ChannelType > &)
Definition juce_AudioChannelSet.cpp:605
static AudioChannelSet JUCE_CALLTYPE ambisonic(int order=1)
Definition juce_AudioChannelSet.cpp:479
static AudioChannelSet JUCE_CALLTYPE createLCRS()
Definition juce_AudioChannelSet.cpp:455
static AudioChannelSet JUCE_CALLTYPE create7point1point2()
Definition juce_AudioChannelSet.cpp:473
static AudioChannelSet JUCE_CALLTYPE canonicalChannelSet(int numChannels)
Definition juce_AudioChannelSet.cpp:511
static AudioChannelSet JUCE_CALLTYPE discreteChannels(int numChannels)
Definition juce_AudioChannelSet.cpp:504
static AudioChannelSet JUCE_CALLTYPE create7point1point6()
Definition juce_AudioChannelSet.cpp:476
static AudioChannelSet JUCE_CALLTYPE createLCR()
Definition juce_AudioChannelSet.cpp:453
static AudioChannelSet JUCE_CALLTYPE fromWaveChannelMask(int32 dwChannelMask)
Definition juce_AudioChannelSet.cpp:620
String getDescription() const
Definition juce_AudioChannelSet.cpp:329
static AudioChannelSet JUCE_CALLTYPE pentagonal()
Definition juce_AudioChannelSet.cpp:467
int getChannelIndexForType(ChannelType type) const noexcept
Definition juce_AudioChannelSet.cpp:411
static String JUCE_CALLTYPE getAbbreviatedChannelTypeName(ChannelType)
Definition juce_AudioChannelSet.cpp:128
int32 getWaveChannelMask() const noexcept
Definition juce_AudioChannelSet.cpp:625
static AudioChannelSet JUCE_CALLTYPE create7point1point4()
Definition juce_AudioChannelSet.cpp:475
Array< ChannelType > getChannelTypes() const
Definition juce_AudioChannelSet.cpp:426
void setRange(int startBit, int numBits, bool shouldBeSet)
Definition juce_BigInteger.cpp:321
Definition juce_StringArray.h:35
String joinIntoString(StringRef separatorString, int startIndex=0, int numberOfElements=-1) const
Definition juce_StringArray.cpp:289
static StringArray fromTokens(StringRef stringToTokenise, bool preserveQuotedStrings)
Definition juce_StringArray.cpp:387
void add(String stringToAdd)
Definition juce_StringArray.cpp:136
Definition juce_String.h:53
int length() const noexcept
Definition juce_String.cpp:511
int getIntValue() const noexcept
Definition juce_String.cpp:1871
Definition juce_UnitTest.h:70
register unsigned i
Definition inflate.c:1575
int retval
Definition inflate.c:947
unsigned s
Definition inflate.c:1555
static const char * name
Definition pugl.h:1582
#define NEEDS_TRANS(stringLiteral)
Definition juce_LocalisedStrings.h:218
Definition juce_UnitTestCategories.h:27
Definition carla_juce.cpp:31
unsigned int uint32
Definition juce_MathsFunctions.h:45
long long int64
Definition juce_MathsFunctions.h:54
signed int int32
Definition juce_MathsFunctions.h:43
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
#define max(x, y)
Definition os.h:78
return c
Definition crypt.c:175
int result
Definition process.c:1455
#define const
Definition zconf.h:137