LMMS
Loading...
Searching...
No Matches
juce_AudioChannelSet.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 The code included in this file is provided under the terms of the ISC license
11 http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12 To use, copy, modify, and/or distribute this software for any purpose with or
13 without fee is hereby granted provided that the above copyright notice and
14 this permission notice appear in all copies.
15
16 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18 DISCLAIMED.
19
20 ==============================================================================
21*/
22
23namespace juce
24{
25
26
27
31
32AudioChannelSet::AudioChannelSet (const std::initializer_list<ChannelType>& c)
33{
34 for (auto channel : c)
35 addChannel (channel);
36}
37
38bool AudioChannelSet::operator== (const AudioChannelSet& other) const noexcept { return channels == other.channels; }
39bool AudioChannelSet::operator!= (const AudioChannelSet& other) const noexcept { return channels != other.channels; }
40bool AudioChannelSet::operator< (const AudioChannelSet& other) const noexcept { return channels < other.channels; }
41
43{
45 return "Discrete " + String (type - discreteChannel0 + 1);
46
47 switch (type)
48 {
49 case left: return NEEDS_TRANS("Left");
50 case right: return NEEDS_TRANS("Right");
51 case centre: return NEEDS_TRANS("Centre");
52 case LFE: return NEEDS_TRANS("LFE");
53 case leftSurround: return NEEDS_TRANS("Left Surround");
54 case rightSurround: return NEEDS_TRANS("Right Surround");
55 case leftCentre: return NEEDS_TRANS("Left Centre");
56 case rightCentre: return NEEDS_TRANS("Right Centre");
57 case centreSurround: return NEEDS_TRANS("Centre Surround");
58 case leftSurroundRear: return NEEDS_TRANS("Left Surround Rear");
59 case rightSurroundRear: return NEEDS_TRANS("Right Surround Rear");
60 case topMiddle: return NEEDS_TRANS("Top Middle");
61 case topFrontLeft: return NEEDS_TRANS("Top Front Left");
62 case topFrontCentre: return NEEDS_TRANS("Top Front Centre");
63 case topFrontRight: return NEEDS_TRANS("Top Front Right");
64 case topRearLeft: return NEEDS_TRANS("Top Rear Left");
65 case topRearCentre: return NEEDS_TRANS("Top Rear Centre");
66 case topRearRight: return NEEDS_TRANS("Top Rear Right");
67 case wideLeft: return NEEDS_TRANS("Wide Left");
68 case wideRight: return NEEDS_TRANS("Wide Right");
69 case LFE2: return NEEDS_TRANS("LFE 2");
70 case leftSurroundSide: return NEEDS_TRANS("Left Surround Side");
71 case rightSurroundSide: return NEEDS_TRANS("Right Surround Side");
72 case ambisonicW: return NEEDS_TRANS("Ambisonic W");
73 case ambisonicX: return NEEDS_TRANS("Ambisonic X");
74 case ambisonicY: return NEEDS_TRANS("Ambisonic Y");
75 case ambisonicZ: return NEEDS_TRANS("Ambisonic Z");
76 case topSideLeft: return NEEDS_TRANS("Top Side Left");
77 case topSideRight: return NEEDS_TRANS("Top Side Right");
78 case ambisonicACN4: return NEEDS_TRANS("Ambisonic 4");
79 case ambisonicACN5: return NEEDS_TRANS("Ambisonic 5");
80 case ambisonicACN6: return NEEDS_TRANS("Ambisonic 6");
81 case ambisonicACN7: return NEEDS_TRANS("Ambisonic 7");
82 case ambisonicACN8: return NEEDS_TRANS("Ambisonic 8");
83 case ambisonicACN9: return NEEDS_TRANS("Ambisonic 9");
84 case ambisonicACN10: return NEEDS_TRANS("Ambisonic 10");
85 case ambisonicACN11: return NEEDS_TRANS("Ambisonic 11");
86 case ambisonicACN12: return NEEDS_TRANS("Ambisonic 12");
87 case ambisonicACN13: return NEEDS_TRANS("Ambisonic 13");
88 case ambisonicACN14: return NEEDS_TRANS("Ambisonic 14");
89 case ambisonicACN15: return NEEDS_TRANS("Ambisonic 15");
90 case ambisonicACN16: return NEEDS_TRANS("Ambisonic 16");
91 case ambisonicACN17: return NEEDS_TRANS("Ambisonic 17");
92 case ambisonicACN18: return NEEDS_TRANS("Ambisonic 18");
93 case ambisonicACN19: return NEEDS_TRANS("Ambisonic 19");
94 case ambisonicACN20: return NEEDS_TRANS("Ambisonic 20");
95 case ambisonicACN21: return NEEDS_TRANS("Ambisonic 21");
96 case ambisonicACN22: return NEEDS_TRANS("Ambisonic 22");
97 case ambisonicACN23: return NEEDS_TRANS("Ambisonic 23");
98 case ambisonicACN24: return NEEDS_TRANS("Ambisonic 24");
99 case ambisonicACN25: return NEEDS_TRANS("Ambisonic 25");
100 case ambisonicACN26: return NEEDS_TRANS("Ambisonic 26");
101 case ambisonicACN27: return NEEDS_TRANS("Ambisonic 27");
102 case ambisonicACN28: return NEEDS_TRANS("Ambisonic 28");
103 case ambisonicACN29: return NEEDS_TRANS("Ambisonic 29");
104 case ambisonicACN30: return NEEDS_TRANS("Ambisonic 30");
105 case ambisonicACN31: return NEEDS_TRANS("Ambisonic 31");
106 case ambisonicACN32: return NEEDS_TRANS("Ambisonic 32");
107 case ambisonicACN33: return NEEDS_TRANS("Ambisonic 33");
108 case ambisonicACN34: return NEEDS_TRANS("Ambisonic 34");
109 case ambisonicACN35: return NEEDS_TRANS("Ambisonic 35");
110 case bottomFrontLeft: return NEEDS_TRANS("Bottom Front Left");
111 case bottomFrontCentre: return NEEDS_TRANS("Bottom Front Centre");
112 case bottomFrontRight: return NEEDS_TRANS("Bottom Front Right");
113 case proximityLeft: return NEEDS_TRANS("Proximity Left");
114 case proximityRight: return NEEDS_TRANS("Proximity Right");
115 case bottomSideLeft: return NEEDS_TRANS("Bottom Side Left");
116 case bottomSideRight: return NEEDS_TRANS("Bottom Side Right");
117 case bottomRearLeft: return NEEDS_TRANS("Bottom Rear Left");
118 case bottomRearCentre: return NEEDS_TRANS("Bottom Rear Centre");
119 case bottomRearRight: return NEEDS_TRANS("Bottom Rear Right");
120 case discreteChannel0:
121 case unknown:
122 default: break;
123 }
124
125 return "Unknown";
126}
127
129{
130 if (type >= discreteChannel0)
131 return String (type - discreteChannel0 + 1);
132
133 switch (type)
134 {
135 case left: return "L";
136 case right: return "R";
137 case centre: return "C";
138 case LFE: return "Lfe";
139 case leftSurround: return "Ls";
140 case rightSurround: return "Rs";
141 case leftCentre: return "Lc";
142 case rightCentre: return "Rc";
143 case centreSurround: return "Cs";
144 case leftSurroundRear: return "Lrs";
145 case rightSurroundRear: return "Rrs";
146 case topMiddle: return "Tm";
147 case topFrontLeft: return "Tfl";
148 case topFrontCentre: return "Tfc";
149 case topFrontRight: return "Tfr";
150 case topRearLeft: return "Trl";
151 case topRearCentre: return "Trc";
152 case topRearRight: return "Trr";
153 case wideLeft: return "Wl";
154 case wideRight: return "Wr";
155 case LFE2: return "Lfe2";
156 case leftSurroundSide: return "Lss";
157 case rightSurroundSide: return "Rss";
158 case ambisonicACN0: return "ACN0";
159 case ambisonicACN1: return "ACN1";
160 case ambisonicACN2: return "ACN2";
161 case ambisonicACN3: return "ACN3";
162 case ambisonicACN4: return "ACN4";
163 case ambisonicACN5: return "ACN5";
164 case ambisonicACN6: return "ACN6";
165 case ambisonicACN7: return "ACN7";
166 case ambisonicACN8: return "ACN8";
167 case ambisonicACN9: return "ACN9";
168 case ambisonicACN10: return "ACN10";
169 case ambisonicACN11: return "ACN11";
170 case ambisonicACN12: return "ACN12";
171 case ambisonicACN13: return "ACN13";
172 case ambisonicACN14: return "ACN14";
173 case ambisonicACN15: return "ACN15";
174 case ambisonicACN16: return "ACN16";
175 case ambisonicACN17: return "ACN17";
176 case ambisonicACN18: return "ACN18";
177 case ambisonicACN19: return "ACN19";
178 case ambisonicACN20: return "ACN20";
179 case ambisonicACN21: return "ACN21";
180 case ambisonicACN22: return "ACN22";
181 case ambisonicACN23: return "ACN23";
182 case ambisonicACN24: return "ACN24";
183 case ambisonicACN25: return "ACN25";
184 case ambisonicACN26: return "ACN26";
185 case ambisonicACN27: return "ACN27";
186 case ambisonicACN28: return "ACN28";
187 case ambisonicACN29: return "ACN29";
188 case ambisonicACN30: return "ACN30";
189 case ambisonicACN31: return "ACN31";
190 case ambisonicACN32: return "ACN32";
191 case ambisonicACN33: return "ACN33";
192 case ambisonicACN34: return "ACN34";
193 case ambisonicACN35: return "ACN35";
194 case topSideLeft: return "Tsl";
195 case topSideRight: return "Tsr";
196 case bottomFrontLeft: return "Bfl";
197 case bottomFrontCentre: return "Bfc";
198 case bottomFrontRight: return "Bfr";
199 case proximityLeft: return "Pl";
200 case proximityRight: return "Pr";
201 case bottomSideLeft: return "Bsl";
202 case bottomSideRight: return "Bsr";
203 case bottomRearLeft: return "Brl";
204 case bottomRearCentre: return "Brc";
205 case bottomRearRight: return "Brr";
206 case discreteChannel0:
207 case unknown:
208 default: break;
209 }
210
212 return "ACN" + String (type - ambisonicACN4 + 4);
213
214 return {};
215}
216
218{
219 if (abbr.length() > 0 && (abbr[0] >= '0' && abbr[0] <= '9'))
220 return static_cast<AudioChannelSet::ChannelType> (static_cast<int> (discreteChannel0)
221 + abbr.getIntValue() - 1);
222
223 if (abbr == "L") return left;
224 if (abbr == "R") return right;
225 if (abbr == "C") return centre;
226 if (abbr == "Lfe") return LFE;
227 if (abbr == "Ls") return leftSurround;
228 if (abbr == "Rs") return rightSurround;
229 if (abbr == "Lc") return leftCentre;
230 if (abbr == "Rc") return rightCentre;
231 if (abbr == "Cs") return centreSurround;
232 if (abbr == "Lrs") return leftSurroundRear;
233 if (abbr == "Rrs") return rightSurroundRear;
234 if (abbr == "Tm") return topMiddle;
235 if (abbr == "Tfl") return topFrontLeft;
236 if (abbr == "Tfc") return topFrontCentre;
237 if (abbr == "Tfr") return topFrontRight;
238 if (abbr == "Trl") return topRearLeft;
239 if (abbr == "Trc") return topRearCentre;
240 if (abbr == "Trr") return topRearRight;
241 if (abbr == "Wl") return wideLeft;
242 if (abbr == "Wr") return wideRight;
243 if (abbr == "Lfe2") return LFE2;
244 if (abbr == "Lss") return leftSurroundSide;
245 if (abbr == "Rss") return rightSurroundSide;
246 if (abbr == "W") return ambisonicW;
247 if (abbr == "X") return ambisonicX;
248 if (abbr == "Y") return ambisonicY;
249 if (abbr == "Z") return ambisonicZ;
250 if (abbr == "ACN0") return ambisonicACN0;
251 if (abbr == "ACN1") return ambisonicACN1;
252 if (abbr == "ACN2") return ambisonicACN2;
253 if (abbr == "ACN3") return ambisonicACN3;
254 if (abbr == "ACN4") return ambisonicACN4;
255 if (abbr == "ACN5") return ambisonicACN5;
256 if (abbr == "ACN6") return ambisonicACN6;
257 if (abbr == "ACN7") return ambisonicACN7;
258 if (abbr == "ACN8") return ambisonicACN8;
259 if (abbr == "ACN9") return ambisonicACN9;
260 if (abbr == "ACN10") return ambisonicACN10;
261 if (abbr == "ACN11") return ambisonicACN11;
262 if (abbr == "ACN12") return ambisonicACN12;
263 if (abbr == "ACN13") return ambisonicACN13;
264 if (abbr == "ACN14") return ambisonicACN14;
265 if (abbr == "ACN15") return ambisonicACN15;
266 if (abbr == "ACN16") return ambisonicACN16;
267 if (abbr == "ACN17") return ambisonicACN17;
268 if (abbr == "ACN18") return ambisonicACN18;
269 if (abbr == "ACN19") return ambisonicACN19;
270 if (abbr == "ACN20") return ambisonicACN20;
271 if (abbr == "ACN21") return ambisonicACN21;
272 if (abbr == "ACN22") return ambisonicACN22;
273 if (abbr == "ACN23") return ambisonicACN23;
274 if (abbr == "ACN24") return ambisonicACN24;
275 if (abbr == "ACN25") return ambisonicACN25;
276 if (abbr == "ACN26") return ambisonicACN26;
277 if (abbr == "ACN27") return ambisonicACN27;
278 if (abbr == "ACN28") return ambisonicACN28;
279 if (abbr == "ACN29") return ambisonicACN29;
280 if (abbr == "ACN30") return ambisonicACN30;
281 if (abbr == "ACN31") return ambisonicACN31;
282 if (abbr == "ACN32") return ambisonicACN32;
283 if (abbr == "ACN33") return ambisonicACN33;
284 if (abbr == "ACN34") return ambisonicACN34;
285 if (abbr == "ACN35") return ambisonicACN35;
286 if (abbr == "Tsl") return topSideLeft;
287 if (abbr == "Tsr") return topSideRight;
288 if (abbr == "Bfl") return bottomFrontLeft;
289 if (abbr == "Bfc") return bottomFrontCentre;
290 if (abbr == "Bfr") return bottomFrontRight;
291 if (abbr == "Bsl") return bottomSideLeft;
292 if (abbr == "Bsr") return bottomSideRight;
293 if (abbr == "Brl") return bottomRearLeft;
294 if (abbr == "Brc") return bottomRearCentre;
295 if (abbr == "Brr") return bottomRearRight;
296 return unknown;
297}
298
300{
301 StringArray speakerTypes;
302
303 for (auto& speaker : getChannelTypes())
304 {
305 auto name = getAbbreviatedChannelTypeName (speaker);
306
307 if (name.isNotEmpty())
308 speakerTypes.add (name);
309 }
310
311 return speakerTypes.joinIntoString (" ");
312}
313
315{
316 AudioChannelSet set;
317
318 for (auto& abbr : StringArray::fromTokens (str, true))
319 {
321
322 if (type != unknown)
323 set.addChannel (type);
324 }
325
326 return set;
327}
328
330{
331 if (isDiscreteLayout()) return "Discrete #" + String (size());
332 if (*this == disabled()) return "Disabled";
333 if (*this == mono()) return "Mono";
334 if (*this == stereo()) return "Stereo";
335
336 if (*this == createLCR()) return "LCR";
337 if (*this == createLRS()) return "LRS";
338 if (*this == createLCRS()) return "LCRS";
339
340 if (*this == create5point0()) return "5.0 Surround";
341 if (*this == create5point1()) return "5.1 Surround";
342 if (*this == create5point1point2()) return "5.1.2 Surround";
343 if (*this == create5point1point4()) return "5.1.4 Surround";
344 if (*this == create6point0()) return "6.0 Surround";
345 if (*this == create6point1()) return "6.1 Surround";
346 if (*this == create6point0Music()) return "6.0 (Music) Surround";
347 if (*this == create6point1Music()) return "6.1 (Music) Surround";
348 if (*this == create7point0()) return "7.0 Surround";
349 if (*this == create7point1()) return "7.1 Surround";
350 if (*this == create7point0SDDS()) return "7.0 Surround SDDS";
351 if (*this == create7point1SDDS()) return "7.1 Surround SDDS";
352 if (*this == create7point0point2()) return "7.0.2 Surround";
353 if (*this == create7point0point4()) return "7.0.4 Surround";
354 if (*this == create7point1point2()) return "7.1.2 Surround";
355 if (*this == create7point1point4()) return "7.1.4 Surround";
356 if (*this == create7point1point6()) return "7.1.6 Surround";
357 if (*this == create9point1point6()) return "9.1.6 Surround";
358
359 if (*this == quadraphonic()) return "Quadraphonic";
360 if (*this == pentagonal()) return "Pentagonal";
361 if (*this == hexagonal()) return "Hexagonal";
362 if (*this == octagonal()) return "Octagonal";
363
364 // ambisonics
365 {
366 auto order = getAmbisonicOrder();
367
368 if (order >= 0)
369 {
370 String suffix;
371
372 switch (order)
373 {
374 case 1: suffix = "st"; break;
375 case 2: suffix = "nd"; break;
376 case 3: suffix = "rd"; break;
377 default: suffix = "th"; break;
378 }
379
380 return String (order) + suffix + " Order Ambisonics";
381 }
382 }
383
384 return "Unknown";
385}
386
388{
389 for (auto& speaker : getChannelTypes())
390 if (speaker <= ambisonicACN35)
391 return false;
392
393 return true;
394}
395
397{
398 return channels.countNumberOfSetBits();
399}
400
402{
403 int bit = channels.findNextSetBit(0);
404
405 for (int i = 0; i < index && bit >= 0; ++i)
406 bit = channels.findNextSetBit (bit + 1);
407
408 return static_cast<ChannelType> (bit);
409}
410
412{
413 int idx = 0;
414
415 for (int bit = channels.findNextSetBit (0); bit >= 0; bit = channels.findNextSetBit (bit + 1))
416 {
417 if (static_cast<ChannelType> (bit) == type)
418 return idx;
419
420 idx++;
421 }
422
423 return -1;
424}
425
427{
429
430 for (int bit = channels.findNextSetBit(0); bit >= 0; bit = channels.findNextSetBit (bit + 1))
431 result.add (static_cast<ChannelType> (bit));
432
433 return result;
434}
435
437{
438 const int bit = static_cast<int> (newChannel);
439 jassert (bit >= 0 && bit < 1024);
440 channels.setBit (bit);
441}
442
444{
445 const int bit = static_cast<int> (newChannel);
446 jassert (bit >= 0 && bit < 1024);
447 channels.clearBit (bit);
448}
449
478
480{
481 jassert (isPositiveAndBelow (order, 6));
482
483 if (order == 0)
484 return AudioChannelSet ((uint32) (1 << ambisonicACN0));
485
486 AudioChannelSet set ((1u << ambisonicACN0) | (1u << ambisonicACN1) | (1u << ambisonicACN2) | (1u << ambisonicACN3));
487
488 auto numAmbisonicChannels = (order + 1) * (order + 1);
489 set.channels.setRange (ambisonicACN4, numAmbisonicChannels - 4, true);
490
491 return set;
492}
493
495{
496 auto ambisonicOrder = getAmbisonicOrderForNumChannels (size());
497
498 if (ambisonicOrder >= 0)
499 return (*this == ambisonic (ambisonicOrder) ? ambisonicOrder : -1);
500
501 return -1;
502}
503
505{
507 s.channels.setRange (discreteChannel0, numChannels, true);
508 return s;
509}
510
512{
513 if (numChannels == 1) return AudioChannelSet::mono();
514 if (numChannels == 2) return AudioChannelSet::stereo();
515 if (numChannels == 3) return AudioChannelSet::createLCR();
516 if (numChannels == 4) return AudioChannelSet::quadraphonic();
517 if (numChannels == 5) return AudioChannelSet::create5point0();
518 if (numChannels == 6) return AudioChannelSet::create5point1();
519 if (numChannels == 7) return AudioChannelSet::create7point0();
520 if (numChannels == 8) return AudioChannelSet::create7point1();
521
522 return discreteChannels (numChannels);
523}
524
526{
527 if (numChannels == 1) return AudioChannelSet::mono();
528 if (numChannels == 2) return AudioChannelSet::stereo();
529 if (numChannels == 3) return AudioChannelSet::createLCR();
530 if (numChannels == 4) return AudioChannelSet::quadraphonic();
531 if (numChannels == 5) return AudioChannelSet::create5point0();
532 if (numChannels == 6) return AudioChannelSet::create5point1();
533 if (numChannels == 7) return AudioChannelSet::create7point0();
534 if (numChannels == 8) return AudioChannelSet::create7point1();
535
536 return {};
537}
538
540{
542
543 if (numChannels != 0)
544 {
545 retval.add (AudioChannelSet::discreteChannels (numChannels));
546
547 retval.addArray ([numChannels]() -> Array<AudioChannelSet>
548 {
549 switch (numChannels)
550 {
551 case 1:
552 return { AudioChannelSet::mono() };
553 case 2:
554 return { AudioChannelSet::stereo() };
555 case 3:
558 case 4:
561 case 5:
564 case 6:
569 case 7:
574 case 8:
579 case 9:
581 case 10:
584 case 11:
586 case 12:
588 case 14:
590 case 16:
592 }
593
594 return {};
595 }());
596
597 auto order = getAmbisonicOrderForNumChannels (numChannels);
598 if (order >= 0)
600 }
601
602 return retval;
603}
604
606{
607 AudioChannelSet set;
608
609 for (auto ch : channelArray)
610 {
611 jassert (! set.channels[static_cast<int> (ch)]);
612
613 set.addChannel (ch);
614 }
615
616 return set;
617}
618
619//==============================================================================
621{
622 return AudioChannelSet (static_cast<uint32> ((dwChannelMask & ((1 << 18) - 1)) << 1));
623}
624
626{
627 if (channels.getHighestBit() > topRearRight)
628 return -1;
629
630 return (channels.toInteger() >> 1);
631}
632
633//==============================================================================
635{
636 auto sqrtMinusOne = std::sqrt (static_cast<float> (numChannels)) - 1.0f;
637 auto ambisonicOrder = jmax (0, static_cast<int> (std::floor (sqrtMinusOne)));
638
639 if (ambisonicOrder > 5)
640 return -1;
641
642 return (static_cast<float> (ambisonicOrder) == sqrtMinusOne ? ambisonicOrder : -1);
643}
644
645
646//==============================================================================
647//==============================================================================
648#if JUCE_UNIT_TESTS
649
650class AudioChannelSetUnitTest : public UnitTest
651{
652public:
653 AudioChannelSetUnitTest()
654 : UnitTest ("AudioChannelSetUnitTest", UnitTestCategories::audio)
655 {}
656
657 void runTest() override
658 {
659 auto max = AudioChannelSet::maxChannelsOfNamedLayout;
660
661 beginTest ("maxChannelsOfNamedLayout is non-discrete");
662 expect (AudioChannelSet::channelSetsWithNumberOfChannels (max).size() >= 2);
663
664 beginTest ("channelSetsWithNumberOfChannels returns correct speaker count");
665 {
666 for (auto ch = 1; ch <= max; ++ch)
667 {
668 auto channelSets = AudioChannelSet::channelSetsWithNumberOfChannels (ch);
669
670 for (auto set : channelSets)
671 expect (set.size() == ch);
672 }
673 }
674
675 beginTest ("Ambisonics");
676 {
677 uint64 mask = 0;
678
679 mask |= (1ull << AudioChannelSet::ambisonicACN0);
680 checkAmbisonic (mask, 0, "0th Order Ambisonics");
681
682 mask |= (1ull << AudioChannelSet::ambisonicACN1) | (1ull << AudioChannelSet::ambisonicACN2) | (1ull << AudioChannelSet::ambisonicACN3);
683 checkAmbisonic (mask, 1, "1st Order Ambisonics");
684
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");
688
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");
693
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");
698
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");
704 }
705 }
706
707private:
708 void checkAmbisonic (uint64 mask, int order, const char* layoutName)
709 {
710 auto expected = AudioChannelSet::ambisonic (order);
711 auto numChannels = expected.size();
712
713 expect (numChannels == BigInteger ((int64) mask).countNumberOfSetBits());
714 expect (channelSetFromMask (mask) == expected);
715
716 expect (order == expected.getAmbisonicOrder());
717 expect (expected.getDescription() == layoutName);
718
719 auto layouts = AudioChannelSet::channelSetsWithNumberOfChannels (numChannels);
720 expect (layouts.contains (expected));
721
722 for (auto layout : layouts)
723 expect (layout.getAmbisonicOrder() == (layout == expected ? order : -1));
724 }
725
726 static AudioChannelSet channelSetFromMask (uint64 mask)
727 {
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));
732
733 return AudioChannelSet::channelSetWithChannels (channels);
734 }
735};
736
737static AudioChannelSetUnitTest audioChannelSetUnitTest;
738
739#endif
740
741} // namespace juce
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
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
#define jassert(expression)
#define JUCE_CALLTYPE
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
ulg size
Definition extract.c:2350
int result
Definition process.c:1455
#define const
Definition zconf.h:137