163 [[nodiscard]]
constexpr bool Has(
EChannel channel)
const noexcept {
return (mChannelMask &
static_cast<uint32_t
>(channel)) == channel; }
164 [[nodiscard]]
constexpr bool HasLFE() const noexcept {
return (mChannelMask &
static_cast<uint32_t
>(EChannel::LFE)) == EChannel::LFE; }
165 [[nodiscard]]
constexpr bool HasTopChannels() const noexcept {
return mChannelMask >= EChannel::TOP_Channels; }
166 [[nodiscard]]
constexpr bool IsValid() const noexcept {
return mChannelMask != ChannelMask::Invalid; }
172 return std::popcount(mChannelMask &
static_cast<uint32>((1ull << EChannel::NUM_GroundChannels) - 1u));
179 return InvalidChannelIndex;
182 int value =
static_cast<int>(mChannelMask);
185 if (channel ==
static_cast<EChannel>(value & -value))
188 value &= (value - 1);
191 return InvalidChannelIndex;
196 EChannel foundChannel = EChannel::Invalid;
198 ForEachChannel([index, &foundChannel](
EChannel channel,
uint32 channelIndex)
200 if (channelIndex == index)
201 foundChannel = channel;
217 case 2:
return ChannelMap(ChannelMask::Stereo);
220 case 5:
return ChannelMap(ChannelMask::Surround_4_1);
221 case 6:
return ChannelMap(ChannelMask::Surround_5_1);
222 case 7:
return ChannelMap(ChannelMask::Surround_6_1);
223 case 8:
return ChannelMap(ChannelMask::Surround_7_1);
225 JPL_ASSERT(
"ChannelMap can be created from channel count up to 8 channels.");
230 template<
class Predicate>
234 int value =
static_cast<int>(mChannelMask);
237 static_assert(std::invocable<Predicate, EChannel, uint32> ||
238 std::invocable<Predicate, EChannel>,
"Invalid predicate signature.");
240 const auto channel =
static_cast<EChannel>(value & -value);
241 if constexpr (std::invocable<Predicate, EChannel, uint32>)
242 predicate(channel, channelIndex);
247 value &= (value - 1);
252 [[nodiscard]]
constexpr bool operator==(
const ChannelMap& other)
const noexcept {
return mChannelMask == other.mChannelMask; }
253 [[nodiscard]]
constexpr bool operator!=(
const ChannelMap& other)
const noexcept {
return mChannelMask != other.mChannelMask; }
257 uint32 mChannelMask = ChannelMask::Invalid;
268 : Name(ChannelMask::
ToString(channelMask))
269 , Layout(
ChannelMap::FromChannelMask(channelMask))
275 JPL_INLINE
bool operator==(const
NamedChannelMask& other) const noexcept {
return other.Layout == Layout; }
283 struct [[nodiscard]] hash<
JPL::ChannelMap>
287 return channelMap.mChannelMask;
402#define GROUND_CHANNEL_COUNT_OF(ChannelMask)\
403ChannelMap::FromChannelMask(ChannelMask).GetNumGroundChannels()
405 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Invalid) == 0);
406 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Mono) == 1);
407 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Stereo) == 2);
408 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::StereoHeadphones) == 2);
409 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::LCR) == 3);
410 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::LRS) == 3);
411 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::LCRS) == 4);
412 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Quad) == 4);
413 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Pentagonal) == 5);
414 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Octagonal) == 8);
415 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_4_1) == 5);
416 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_5_0) == 5);
417 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_5_1) == 6);
418 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_6_0) == 6);
419 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_6_1) == 7);
420 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_7_0) == 7);
421 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_7_1) == 8);
423 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_5_0_2) == 5);
424 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_5_0_4) == 5);
425 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_5_1_2) == 6);
426 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_5_1_4) == 6);
427 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_7_0_2) == 7);
428 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_7_0_4) == 7);
429 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_7_0_6) == 7);
430 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_7_1_2) == 8);
431 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_7_1_4) == 8);
432 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_7_1_6) == 8);
433 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_9_0_4) == 9);
434 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_9_0_6) == 9);
435 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_9_1_4) == 10);
436 static_assert(GROUND_CHANNEL_COUNT_OF(ChannelMask::Surround_9_1_6) == 10);
438#undef GROUND_CHANNEL_COUNT_OF
441#define HEIGHT_CHANNEL_COUNT_OF(ChannelMask)\
442ChannelMap::FromChannelMask(ChannelMask).GetNumHeightChannels()
444 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Invalid) == 0);
445 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Mono) == 0);
446 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Stereo) == 0);
447 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::StereoHeadphones) == 0);
448 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::LCR) == 0);
449 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::LRS) == 0);
450 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::LCRS) == 0);
451 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Quad) == 0);
452 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Pentagonal) == 0);
453 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Octagonal) == 0);
454 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_4_1) == 0);
455 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_5_0) == 0);
456 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_5_1) == 0);
457 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_6_0) == 0);
458 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_6_1) == 0);
459 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_7_0) == 0);
460 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_7_1) == 0);
462 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_5_0_2) == 2);
463 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_5_0_4) == 4);
464 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_5_1_2) == 2);
465 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_5_1_4) == 4);
466 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_7_0_2) == 2);
467 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_7_0_4) == 4);
468 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_7_0_6) == 6);
469 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_7_1_2) == 2);
470 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_7_1_4) == 4);
471 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_7_1_6) == 6);
472 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_9_0_4) == 4);
473 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_9_0_6) == 6);
474 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_9_1_4) == 4);
475 static_assert(HEIGHT_CHANNEL_COUNT_OF(ChannelMask::Surround_9_1_6) == 6);
477#undef HEIGHT_CHANNEL_COUNT_OF
#define JPL_BIT(x)
Definition Core.h:359
#define JPL_ASSERT(inExpression,...)
Main assert macro, usage: JPL_ASSERT(condition, message) or JPL_ASSERT(condition)
Definition ErrorReporting.h:80
Definition ChannelMap.h:156
constexpr uint32 GetNumHeightChannels() const noexcept
Definition ChannelMap.h:174
constexpr uint32 GetNumChannels() const noexcept
Definition ChannelMap.h:168
constexpr bool IsValid() const noexcept
Definition ChannelMap.h:166
constexpr uint32 GetNumGroundChannels() const noexcept
Definition ChannelMap.h:170
constexpr bool operator==(const ChannelMap &other) const noexcept
Definition ChannelMap.h:252
static constexpr ChannelMap FromNumChannels(uint32 numChannels)
Definition ChannelMap.h:212
static constexpr ChannelMap FromChannelMask(uint32 channelMask)
Definition ChannelMap.h:211
constexpr bool operator!=(const ChannelMap &other) const noexcept
Definition ChannelMap.h:253
constexpr ChannelMap()=default
constexpr uint32 GetChannelMask() const
Definition ChannelMap.h:207
constexpr bool HasTopChannels() const noexcept
Definition ChannelMap.h:165
constexpr EChannel GetChannelAtIndex(uint32 index) const
Definition ChannelMap.h:194
constexpr uint32 GetChannelIndex(EChannel channel) const
Definition ChannelMap.h:176
constexpr bool HasLFE() const noexcept
Definition ChannelMap.h:164
constexpr bool Has(EChannel channel) const noexcept
Definition ChannelMap.h:163
constexpr void ForEachChannel(Predicate predicate) const
Definition ChannelMap.h:231
constexpr uint32 Surround_7_1
Definition ChannelMap.h:124
constexpr uint32 LCR
Definition ChannelMap.h:98
constexpr uint32 Surround_5_1
Definition ChannelMap.h:117
constexpr uint32 Pentagonal
Definition ChannelMap.h:107
constexpr uint32 Surround_9_0_6
Definition ChannelMap.h:146
constexpr uint32 Surround_7_0_2
Definition ChannelMap.h:134
constexpr uint32 Surround_7_0
Definition ChannelMap.h:123
constexpr uint32 Surround_7_1_4
Definition ChannelMap.h:137
constexpr uint32 Surround_6_1
Definition ChannelMap.h:119
constexpr uint32 Stereo
Definition ChannelMap.h:97
constexpr uint32 Surround_9_0_4
Definition ChannelMap.h:144
constexpr uint32 Surround_5_1_4
Definition ChannelMap.h:130
constexpr uint32 LRS
Definition ChannelMap.h:99
constexpr uint32 Octagonal
Definition ChannelMap.h:112
constexpr uint32 Surround_4_1
Definition ChannelMap.h:115
constexpr uint32 Surround_7_0_4
Definition ChannelMap.h:136
constexpr uint32 Invalid
Definition ChannelMap.h:93
constexpr uint32 Surround_6_0
Definition ChannelMap.h:118
constexpr uint32 LCRS
Definition ChannelMap.h:100
constexpr uint32 Surround_5_0
Definition ChannelMap.h:116
constexpr uint32 Surround_7_0_6
Definition ChannelMap.h:139
constexpr uint32 StereoHeadphones
Definition ChannelMap.h:104
JPL_INLINE std::string_view ToString(uint32 channelMask)
Definition ChannelMap.h:294
constexpr uint32 Surround_9_1_6
Definition ChannelMap.h:147
constexpr uint32 Surround_9_1_4
Definition ChannelMap.h:145
constexpr uint32 Surround_5_0_4
Definition ChannelMap.h:129
constexpr uint32 Quad
Definition ChannelMap.h:101
constexpr uint32 Surround_7_1_6
Definition ChannelMap.h:140
constexpr uint32 Surround_7_1_2
Definition ChannelMap.h:135
constexpr uint32 Surround_5_0_2
Definition ChannelMap.h:127
constexpr uint32 Mono
Definition ChannelMap.h:96
constexpr uint32 Surround_5_1_2
Definition ChannelMap.h:128
Definition DirectionEncoding.h:485
Definition AcousticMaterial.h:36
std::uint32_t uint32
Definition Core.h:311
constexpr std::string_view ToString(EChannel channel)
Definition ChannelMap.h:335
constexpr std::string_view ToStringShort(EChannel channel)
Definition ChannelMap.h:366
EChannel
Definition ChannelMap.h:39
@ TOP_Channels
Definition ChannelMap.h:75
@ TopBackLeft
Definition ChannelMap.h:67
@ TopFrontRight
Definition ChannelMap.h:61
@ BackCenter
Definition ChannelMap.h:53
@ TopSideRight
Definition ChannelMap.h:65
@ Invalid
Definition ChannelMap.h:78
@ TopFrontCenter
Definition ChannelMap.h:60
@ TopSideLeft
Definition ChannelMap.h:64
@ FrontLeftCenter
Definition ChannelMap.h:48
@ TopBackCenter
Definition ChannelMap.h:68
@ SideRight
Definition ChannelMap.h:46
@ SideLeft
Definition ChannelMap.h:45
@ FrontCenter
Definition ChannelMap.h:42
@ WideRight
Definition ChannelMap.h:56
@ BackRight
Definition ChannelMap.h:52
@ NUM_GroundChannels
Definition ChannelMap.h:73
@ NUM_TopChannels
Definition ChannelMap.h:76
@ TopBackRight
Definition ChannelMap.h:69
@ BackLeft
Definition ChannelMap.h:51
@ FrontRightCenter
Definition ChannelMap.h:49
@ TopCenter
Definition ChannelMap.h:58
@ LFE
Definition ChannelMap.h:43
@ FrontLeft
Definition ChannelMap.h:40
@ WideLeft
Definition ChannelMap.h:55
@ TopFrontLeft
Definition ChannelMap.h:59
@ FrontRight
Definition ChannelMap.h:41
Definition ChannelMap.h:281
Utility to hold some channel mask with a name.
Definition ChannelMap.h:263
NamedChannelMask(uint32 channelMask)
Definition ChannelMap.h:267
std::string_view Name
Definition ChannelMap.h:264
ChannelMap Layout
Definition ChannelMap.h:265
NamedChannelMask() noexcept=default
constexpr std::size_t operator()(const JPL::ChannelMap &channelMap) const
Definition ChannelMap.h:285