123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702 |
- #ifndef _AK_SPEAKERCONFIG_H_
- #define _AK_SPEAKERCONFIG_H_
- #include <AK/SoundEngine/Common/AkTypes.h>
- #include <AK/Tools/Common/AkPlatformFuncs.h>
- #define AK_SPEAKER_FRONT_LEFT 0x1
- #define AK_SPEAKER_FRONT_RIGHT 0x2
- #define AK_SPEAKER_FRONT_CENTER 0x4
- #define AK_SPEAKER_LOW_FREQUENCY 0x8
- #define AK_SPEAKER_BACK_LEFT 0x10
- #define AK_SPEAKER_BACK_RIGHT 0x20
- #define AK_SPEAKER_BACK_CENTER 0x100
- #define AK_SPEAKER_SIDE_LEFT 0x200
- #define AK_SPEAKER_SIDE_RIGHT 0x400
- #define AK_SPEAKER_TOP 0x800
- #define AK_SPEAKER_HEIGHT_FRONT_LEFT 0x1000
- #define AK_SPEAKER_HEIGHT_FRONT_CENTER 0x2000
- #define AK_SPEAKER_HEIGHT_FRONT_RIGHT 0x4000
- #define AK_SPEAKER_HEIGHT_BACK_LEFT 0x8000
- #define AK_SPEAKER_HEIGHT_BACK_CENTER 0x10000
- #define AK_SPEAKER_HEIGHT_BACK_RIGHT 0x20000
- #define AK_SPEAKER_SETUP_MONO AK_SPEAKER_FRONT_CENTER
- #define AK_SPEAKER_SETUP_0POINT1 AK_SPEAKER_LOW_FREQUENCY
- #define AK_SPEAKER_SETUP_1POINT1 (AK_SPEAKER_FRONT_CENTER | AK_SPEAKER_LOW_FREQUENCY)
- #define AK_SPEAKER_SETUP_STEREO (AK_SPEAKER_FRONT_LEFT | AK_SPEAKER_FRONT_RIGHT)
- #define AK_SPEAKER_SETUP_2POINT1 (AK_SPEAKER_SETUP_STEREO | AK_SPEAKER_LOW_FREQUENCY)
- #define AK_SPEAKER_SETUP_3STEREO (AK_SPEAKER_SETUP_STEREO | AK_SPEAKER_FRONT_CENTER)
- #define AK_SPEAKER_SETUP_3POINT1 (AK_SPEAKER_SETUP_3STEREO | AK_SPEAKER_LOW_FREQUENCY)
- #define AK_SPEAKER_SETUP_4 (AK_SPEAKER_SETUP_STEREO | AK_SPEAKER_SIDE_LEFT | AK_SPEAKER_SIDE_RIGHT)
- #define AK_SPEAKER_SETUP_4POINT1 (AK_SPEAKER_SETUP_4 | AK_SPEAKER_LOW_FREQUENCY)
- #define AK_SPEAKER_SETUP_5 (AK_SPEAKER_SETUP_4 | AK_SPEAKER_FRONT_CENTER)
- #define AK_SPEAKER_SETUP_5POINT1 (AK_SPEAKER_SETUP_5 | AK_SPEAKER_LOW_FREQUENCY)
- #define AK_SPEAKER_SETUP_6 (AK_SPEAKER_SETUP_4 | AK_SPEAKER_BACK_LEFT | AK_SPEAKER_BACK_RIGHT)
- #define AK_SPEAKER_SETUP_6POINT1 (AK_SPEAKER_SETUP_6 | AK_SPEAKER_LOW_FREQUENCY)
- #define AK_SPEAKER_SETUP_7 (AK_SPEAKER_SETUP_6 | AK_SPEAKER_FRONT_CENTER)
- #define AK_SPEAKER_SETUP_7POINT1 (AK_SPEAKER_SETUP_7 | AK_SPEAKER_LOW_FREQUENCY)
- #define AK_SPEAKER_SETUP_SURROUND (AK_SPEAKER_SETUP_STEREO | AK_SPEAKER_BACK_CENTER)
- #define AK_SPEAKER_SETUP_DPL2 (AK_SPEAKER_SETUP_4)
- #define AK_SPEAKER_SETUP_HEIGHT_2 (AK_SPEAKER_HEIGHT_FRONT_LEFT | AK_SPEAKER_HEIGHT_FRONT_RIGHT)
- #define AK_SPEAKER_SETUP_HEIGHT_4 (AK_SPEAKER_SETUP_HEIGHT_2 | AK_SPEAKER_HEIGHT_BACK_LEFT | AK_SPEAKER_HEIGHT_BACK_RIGHT)
- #define AK_SPEAKER_SETUP_HEIGHT_5 (AK_SPEAKER_SETUP_HEIGHT_4 | AK_SPEAKER_HEIGHT_FRONT_CENTER)
- #define AK_SPEAKER_SETUP_HEIGHT_ALL (AK_SPEAKER_SETUP_HEIGHT_5 | AK_SPEAKER_HEIGHT_BACK_CENTER)
- #define AK_SPEAKER_SETUP_HEIGHT_4_TOP (AK_SPEAKER_SETUP_HEIGHT_4 | AK_SPEAKER_TOP)
- #define AK_SPEAKER_SETUP_HEIGHT_5_TOP (AK_SPEAKER_SETUP_HEIGHT_5 | AK_SPEAKER_TOP)
- #define AK_SPEAKER_SETUP_AURO_222 (AK_SPEAKER_SETUP_4 | AK_SPEAKER_HEIGHT_FRONT_LEFT | AK_SPEAKER_HEIGHT_FRONT_RIGHT)
- #define AK_SPEAKER_SETUP_AURO_8 (AK_SPEAKER_SETUP_AURO_222 | AK_SPEAKER_HEIGHT_BACK_LEFT | AK_SPEAKER_HEIGHT_BACK_RIGHT)
- #define AK_SPEAKER_SETUP_AURO_9 (AK_SPEAKER_SETUP_AURO_8 | AK_SPEAKER_FRONT_CENTER)
- #define AK_SPEAKER_SETUP_AURO_9POINT1 (AK_SPEAKER_SETUP_AURO_9 | AK_SPEAKER_LOW_FREQUENCY)
- #define AK_SPEAKER_SETUP_AURO_10 (AK_SPEAKER_SETUP_AURO_9 | AK_SPEAKER_TOP)
- #define AK_SPEAKER_SETUP_AURO_10POINT1 (AK_SPEAKER_SETUP_AURO_10 | AK_SPEAKER_LOW_FREQUENCY)
- #define AK_SPEAKER_SETUP_AURO_11 (AK_SPEAKER_SETUP_AURO_10 | AK_SPEAKER_HEIGHT_FRONT_CENTER)
- #define AK_SPEAKER_SETUP_AURO_11POINT1 (AK_SPEAKER_SETUP_AURO_11 | AK_SPEAKER_LOW_FREQUENCY)
- #define AK_SPEAKER_SETUP_AURO_11_740 (AK_SPEAKER_SETUP_7 | AK_SPEAKER_SETUP_HEIGHT_4)
- #define AK_SPEAKER_SETUP_AURO_11POINT1_740 (AK_SPEAKER_SETUP_AURO_11_740 | AK_SPEAKER_LOW_FREQUENCY)
- #define AK_SPEAKER_SETUP_AURO_13_751 (AK_SPEAKER_SETUP_7 | AK_SPEAKER_SETUP_HEIGHT_5 | AK_SPEAKER_TOP)
- #define AK_SPEAKER_SETUP_AURO_13POINT1_751 (AK_SPEAKER_SETUP_AURO_13_751 | AK_SPEAKER_LOW_FREQUENCY)
- #define AK_SPEAKER_SETUP_DOLBY_5_0_2 (AK_SPEAKER_SETUP_5 | AK_SPEAKER_HEIGHT_FRONT_LEFT | AK_SPEAKER_HEIGHT_FRONT_RIGHT )
- #define AK_SPEAKER_SETUP_DOLBY_5_1_2 (AK_SPEAKER_SETUP_DOLBY_5_0_2 | AK_SPEAKER_LOW_FREQUENCY )
- #define AK_SPEAKER_SETUP_DOLBY_6_0_2 (AK_SPEAKER_SETUP_6 | AK_SPEAKER_HEIGHT_FRONT_LEFT | AK_SPEAKER_HEIGHT_FRONT_RIGHT )
- #define AK_SPEAKER_SETUP_DOLBY_6_1_2 (AK_SPEAKER_SETUP_DOLBY_6_0_2 | AK_SPEAKER_LOW_FREQUENCY )
- #define AK_SPEAKER_SETUP_DOLBY_6_0_4 (AK_SPEAKER_SETUP_DOLBY_6_0_2 | AK_SPEAKER_HEIGHT_BACK_LEFT | AK_SPEAKER_HEIGHT_BACK_RIGHT )
- #define AK_SPEAKER_SETUP_DOLBY_6_1_4 (AK_SPEAKER_SETUP_DOLBY_6_0_4 | AK_SPEAKER_LOW_FREQUENCY )
- #define AK_SPEAKER_SETUP_DOLBY_7_0_2 (AK_SPEAKER_SETUP_7 | AK_SPEAKER_HEIGHT_FRONT_LEFT | AK_SPEAKER_HEIGHT_FRONT_RIGHT )
- #define AK_SPEAKER_SETUP_DOLBY_7_1_2 (AK_SPEAKER_SETUP_DOLBY_7_0_2 | AK_SPEAKER_LOW_FREQUENCY )
- #define AK_SPEAKER_SETUP_DOLBY_7_0_4 (AK_SPEAKER_SETUP_DOLBY_7_0_2 | AK_SPEAKER_HEIGHT_BACK_LEFT | AK_SPEAKER_HEIGHT_BACK_RIGHT )
- #define AK_SPEAKER_SETUP_DOLBY_7_1_4 (AK_SPEAKER_SETUP_DOLBY_7_0_4 | AK_SPEAKER_LOW_FREQUENCY )
- #define AK_SPEAKER_SETUP_ALL_SPEAKERS (AK_SPEAKER_SETUP_7POINT1 | AK_SPEAKER_BACK_CENTER | AK_SPEAKER_SETUP_HEIGHT_ALL | AK_SPEAKER_TOP)
- #define AK_IDX_SETUP_FRONT_LEFT (0)
- #define AK_IDX_SETUP_FRONT_RIGHT (1)
- #define AK_IDX_SETUP_CENTER (2)
- #define AK_IDX_SETUP_NOCENTER_BACK_LEFT (2)
- #define AK_IDX_SETUP_NOCENTER_BACK_RIGHT (3)
- #define AK_IDX_SETUP_NOCENTER_SIDE_LEFT (4)
- #define AK_IDX_SETUP_NOCENTER_SIDE_RIGHT (5)
- #define AK_IDX_SETUP_WITHCENTER_BACK_LEFT (3)
- #define AK_IDX_SETUP_WITHCENTER_BACK_RIGHT (4)
- #define AK_IDX_SETUP_WITHCENTER_SIDE_LEFT (5)
- #define AK_IDX_SETUP_WITHCENTER_SIDE_RIGHT (6)
- #define AK_IDX_SETUP_WITHCENTER_HEIGHT_FRONT_LEFT (7)
- #define AK_IDX_SETUP_WITHCENTER_HEIGHT_FRONT_RIGHT (8)
- #define AK_IDX_SETUP_WITHCENTER_HEIGHT_BACK_LEFT (9)
- #define AK_IDX_SETUP_WITHCENTER_HEIGHT_BACK_RIGHT (10)
- #define AK_IDX_SETUP_0_LFE (0)
- #define AK_IDX_SETUP_1_CENTER (0)
- #define AK_IDX_SETUP_1_LFE (1)
- #define AK_IDX_SETUP_2_LEFT (0)
- #define AK_IDX_SETUP_2_RIGHT (1)
- #define AK_IDX_SETUP_2_LFE (2)
- #define AK_IDX_SETUP_3_LEFT (0)
- #define AK_IDX_SETUP_3_RIGHT (1)
- #define AK_IDX_SETUP_3_CENTER (2)
- #define AK_IDX_SETUP_3_LFE (3)
- #define AK_IDX_SETUP_4_FRONTLEFT (0)
- #define AK_IDX_SETUP_4_FRONTRIGHT (1)
- #define AK_IDX_SETUP_4_REARLEFT (2)
- #define AK_IDX_SETUP_4_REARRIGHT (3)
- #define AK_IDX_SETUP_4_LFE (4)
- #define AK_IDX_SETUP_5_FRONTLEFT (0)
- #define AK_IDX_SETUP_5_FRONTRIGHT (1)
- #define AK_IDX_SETUP_5_CENTER (2)
- #define AK_IDX_SETUP_5_REARLEFT (3)
- #define AK_IDX_SETUP_5_REARRIGHT (4)
- #define AK_IDX_SETUP_5_LFE (5)
- #define AK_IDX_SETUP_6_FRONTLEFT (0)
- #define AK_IDX_SETUP_6_FRONTRIGHT (1)
- #define AK_IDX_SETUP_6_REARLEFT (2)
- #define AK_IDX_SETUP_6_REARRIGHT (3)
- #define AK_IDX_SETUP_6_SIDELEFT (4)
- #define AK_IDX_SETUP_6_SIDERIGHT (5)
- #define AK_IDX_SETUP_6_LFE (6)
- #define AK_IDX_SETUP_7_FRONTLEFT (0)
- #define AK_IDX_SETUP_7_FRONTRIGHT (1)
- #define AK_IDX_SETUP_7_CENTER (2)
- #define AK_IDX_SETUP_7_REARLEFT (3)
- #define AK_IDX_SETUP_7_REARRIGHT (4)
- #define AK_IDX_SETUP_7_SIDELEFT (5)
- #define AK_IDX_SETUP_7_SIDERIGHT (6)
- #define AK_IDX_SETUP_7_LFE (7)
- #define AK_SPEAKER_SETUP_0_1 ( AK_SPEAKER_LOW_FREQUENCY )
- #define AK_SPEAKER_SETUP_1_0_CENTER ( AK_SPEAKER_FRONT_CENTER )
- #define AK_SPEAKER_SETUP_1_1_CENTER ( AK_SPEAKER_FRONT_CENTER | AK_SPEAKER_LOW_FREQUENCY )
- #define AK_SPEAKER_SETUP_2_0 ( AK_SPEAKER_FRONT_LEFT | AK_SPEAKER_FRONT_RIGHT )
- #define AK_SPEAKER_SETUP_2_1 ( AK_SPEAKER_FRONT_LEFT | AK_SPEAKER_FRONT_RIGHT | AK_SPEAKER_LOW_FREQUENCY )
- #define AK_SPEAKER_SETUP_3_0 ( AK_SPEAKER_FRONT_LEFT | AK_SPEAKER_FRONT_RIGHT | AK_SPEAKER_FRONT_CENTER )
- #define AK_SPEAKER_SETUP_3_1 ( AK_SPEAKER_SETUP_3_0 | AK_SPEAKER_LOW_FREQUENCY )
- #define AK_SPEAKER_SETUP_FRONT ( AK_SPEAKER_SETUP_3_0 )
- #define AK_SPEAKER_SETUP_4_0 ( AK_SPEAKER_SETUP_4 )
- #define AK_SPEAKER_SETUP_4_1 ( AK_SPEAKER_SETUP_4POINT1 )
- #define AK_SPEAKER_SETUP_5_0 ( AK_SPEAKER_SETUP_5 )
- #define AK_SPEAKER_SETUP_5_1 ( AK_SPEAKER_SETUP_5POINT1 )
- #define AK_SPEAKER_SETUP_6_0 ( AK_SPEAKER_SETUP_6 )
- #define AK_SPEAKER_SETUP_6_1 ( AK_SPEAKER_SETUP_6POINT1 )
- #define AK_SPEAKER_SETUP_7_0 ( AK_SPEAKER_SETUP_7 )
- #define AK_SPEAKER_SETUP_7_1 ( AK_SPEAKER_SETUP_7POINT1 )
- #define AK_SPEAKER_SETUP_DEFAULT_PLANE (AK_SPEAKER_SETUP_7POINT1)
- #define AK_SUPPORTED_STANDARD_CHANNEL_MASK (AK_SPEAKER_SETUP_ALL_SPEAKERS)
- #define AK_STANDARD_MAX_NUM_CHANNELS (8)
- #define AK_MAX_AMBISONICS_ORDER (5)
- inline void AK_SPEAKER_SETUP_FIX_LEFT_TO_CENTER( AkUInt32 &io_uChannelMask )
- {
- if( !(io_uChannelMask & AK_SPEAKER_FRONT_CENTER)
- && !(io_uChannelMask & AK_SPEAKER_FRONT_RIGHT)
- && (io_uChannelMask & AK_SPEAKER_FRONT_LEFT) )
- {
- io_uChannelMask &= ~AK_SPEAKER_FRONT_LEFT;
- io_uChannelMask |= AK_SPEAKER_FRONT_CENTER;
- }
- }
- inline void AK_SPEAKER_SETUP_FIX_REAR_TO_SIDE( AkUInt32 &io_uChannelMask )
- {
- if( io_uChannelMask & ( AK_SPEAKER_BACK_LEFT ) && !( io_uChannelMask & AK_SPEAKER_SIDE_LEFT ) )
- {
- io_uChannelMask &= ~( AK_SPEAKER_BACK_LEFT | AK_SPEAKER_BACK_RIGHT );
- io_uChannelMask |= ( AK_SPEAKER_SIDE_LEFT | AK_SPEAKER_SIDE_RIGHT );
- }
- }
- inline void AK_SPEAKER_SETUP_CONVERT_TO_SUPPORTED( AkUInt32 &io_uChannelMask )
- {
- AK_SPEAKER_SETUP_FIX_LEFT_TO_CENTER( io_uChannelMask );
- AK_SPEAKER_SETUP_FIX_REAR_TO_SIDE( io_uChannelMask );
- }
- namespace AK
- {
- static inline AkUInt8 ChannelMaskToNumChannels( AkChannelMask in_uChannelMask )
- {
- return (AkUInt8)AKPLATFORM::AkPopCount(in_uChannelMask);
- }
- static inline AkChannelMask ChannelMaskFromNumChannels( unsigned int in_uNumChannels )
- {
- AkChannelMask uChannelMask = 0;
- switch ( in_uNumChannels )
- {
- case 1:
- uChannelMask = AK_SPEAKER_SETUP_1_0_CENTER;
- break;
- case 2:
- uChannelMask = AK_SPEAKER_SETUP_2_0;
- break;
- case 3:
- uChannelMask = AK_SPEAKER_SETUP_2_1;
- break;
- case 4:
- uChannelMask = AK_SPEAKER_SETUP_4_0;
- break;
- case 5:
- uChannelMask = AK_SPEAKER_SETUP_5_0;
- break;
- case 6:
- uChannelMask = AK_SPEAKER_SETUP_5_1;
- break;
- case 7:
- uChannelMask = AK_SPEAKER_SETUP_7;
- break;
- case 8:
- uChannelMask = AK_SPEAKER_SETUP_7POINT1;
- break;
- }
- return uChannelMask;
- }
- static inline AkUInt8 ChannelBitToIndex(AkChannelMask in_uChannelBit, AkChannelMask in_uChannelMask)
- {
- #ifdef AKASSERT
- AKASSERT(ChannelMaskToNumChannels(in_uChannelBit) == 1);
- #endif
- if (in_uChannelBit == AK_SPEAKER_LOW_FREQUENCY)
- return ChannelMaskToNumChannels(in_uChannelMask) - 1;
- return ChannelMaskToNumChannels(in_uChannelMask & ~AK_SPEAKER_LOW_FREQUENCY & (in_uChannelBit - 1));
- }
- AkForceInline bool HasLFE(AkChannelMask in_uChannelMask)
- {
- return (in_uChannelMask & AK_SPEAKER_LOW_FREQUENCY) > 0;
- }
- AkForceInline bool HasCenter(AkChannelMask in_uChannelMask)
- {
-
- return (in_uChannelMask & AK_SPEAKER_FRONT_CENTER) > 0;
- }
- AkForceInline AkUInt32 GetNumberOfAnglesForConfig(AkChannelMask in_uChannelMask)
- {
- #ifdef AKASSERT
- AKASSERT((in_uChannelMask & ~AK_SPEAKER_SETUP_DEFAULT_PLANE) == 0);
- #endif
-
- in_uChannelMask &= ~AK_SPEAKER_LOW_FREQUENCY;
-
- in_uChannelMask &= ~AK_SPEAKER_FRONT_CENTER;
-
-
- #ifdef AKASSERT
- AKASSERT((in_uChannelMask & AK_SPEAKER_BACK_CENTER) || ((ChannelMaskToNumChannels(in_uChannelMask) % 2) == 0));
- #endif
- return ChannelMaskToNumChannels(in_uChannelMask) >> 1;
- }
- enum AkChannelOrdering
- {
- ChannelOrdering_Standard,
- ChannelOrdering_RunTime
- };
- AkForceInline bool HasSurroundChannels( AkChannelMask in_uChannelMask )
- {
- return ( in_uChannelMask & AK_SPEAKER_BACK_LEFT || in_uChannelMask & AK_SPEAKER_SIDE_LEFT );
- }
- AkForceInline bool HasStrictlyOnePairOfSurroundChannels( AkChannelMask in_uChannelMask )
- {
- return ( ( ( in_uChannelMask & AK_SPEAKER_BACK_LEFT ) != 0 ) ^ ( ( in_uChannelMask & AK_SPEAKER_SIDE_LEFT ) != 0 ) );
- }
- AkForceInline bool HasSideAndRearChannels( AkChannelMask in_uChannelMask )
- {
- return ( in_uChannelMask & AK_SPEAKER_BACK_LEFT && in_uChannelMask & AK_SPEAKER_SIDE_LEFT );
- }
- AkForceInline bool HasHeightChannels(AkChannelMask in_uChannelMask)
- {
- return (in_uChannelMask & ~AK_SPEAKER_SETUP_DEFAULT_PLANE) > 0;
- }
- AkForceInline AkChannelMask BackToSideChannels( AkChannelMask in_uChannelMask )
- {
- if ( HasStrictlyOnePairOfSurroundChannels( in_uChannelMask ) )
- {
- in_uChannelMask &= ~( AK_SPEAKER_BACK_LEFT | AK_SPEAKER_BACK_RIGHT );
- in_uChannelMask |= ( AK_SPEAKER_SIDE_LEFT | AK_SPEAKER_SIDE_RIGHT );
- }
- return in_uChannelMask;
- }
- static inline unsigned int StdChannelIndexToDisplayIndex( AkChannelOrdering in_eOrdering, unsigned int in_uChannelMask, unsigned int in_uChannelIdx )
- {
- if ( in_eOrdering == ChannelOrdering_Standard )
- {
- unsigned int uNumChannelsFront = ChannelMaskToNumChannels( in_uChannelMask & AK_SPEAKER_SETUP_FRONT );
- if ( ( in_uChannelMask & AK_SPEAKER_LOW_FREQUENCY )
- && ( in_uChannelIdx == uNumChannelsFront ) )
- {
-
- in_uChannelIdx = ChannelMaskToNumChannels( in_uChannelMask ) - 1;
- }
- else if ( in_uChannelIdx >= uNumChannelsFront )
- {
-
- unsigned int uLfeOffset = ( in_uChannelMask & AK_SPEAKER_LOW_FREQUENCY ) ? 1 : 0;
-
- if ( HasSideAndRearChannels( in_uChannelMask ) )
- {
- unsigned int uRearIdx = uNumChannelsFront + uLfeOffset;
- unsigned int uSideIdx = uRearIdx + 2;
- unsigned int uAfterSideIdx = uSideIdx + 2;
- if ( in_uChannelIdx < uAfterSideIdx )
- {
- if ( in_uChannelIdx >= uSideIdx )
- in_uChannelIdx -= 2;
- else
- in_uChannelIdx += 2;
- }
- }
- in_uChannelIdx -= uLfeOffset;
- }
- }
- else
- {
-
- if ( HasSideAndRearChannels( in_uChannelMask ) )
- {
- unsigned int uRearIdx = ChannelMaskToNumChannels( in_uChannelMask & AK_SPEAKER_SETUP_FRONT );
- unsigned int uMaxIdx = uRearIdx + 4;
- if ( in_uChannelIdx >= uRearIdx
- && in_uChannelIdx < uMaxIdx )
- {
-
- unsigned int uSideIdx = uRearIdx + 2;
- if ( in_uChannelIdx >= uSideIdx )
- in_uChannelIdx -= 2;
- else
- in_uChannelIdx += 2;
- }
- }
- }
- return in_uChannelIdx;
- }
- }
- enum AkChannelConfigType
- {
- AK_ChannelConfigType_Anonymous = 0x0,
- AK_ChannelConfigType_Standard = 0x1,
- AK_ChannelConfigType_Ambisonic = 0x2,
- AK_ChannelConfigType_Objects = 0x3,
- AK_ChannelConfigType_UseDeviceMain = 0xE,
- AK_ChannelConfigType_UseDevicePassthrough = 0xF
- };
- struct AkChannelConfig
- {
-
-
-
-
- AkUInt32 uNumChannels : 8;
- AkUInt32 eConfigType : 4;
- AkUInt32 uChannelMask : 20;
-
- static AkForceInline AkChannelConfig Standard(AkUInt32 in_uChannelMask)
- {
- return AkChannelConfig(AK::ChannelMaskToNumChannels(in_uChannelMask), in_uChannelMask);
- }
-
- static AkForceInline AkChannelConfig Anonymous(AkUInt32 in_uNumChannels)
- {
- return AkChannelConfig(in_uNumChannels, 0);
- }
-
- static AkForceInline AkChannelConfig Ambisonic(AkUInt32 in_uNumChannels)
- {
- AkChannelConfig cfg;
- cfg.SetAmbisonic(in_uNumChannels);
- return cfg;
- }
-
- static AkForceInline AkChannelConfig Object()
- {
- AkChannelConfig cfg;
- cfg.SetObject();
- return cfg;
- }
-
- AkForceInline AkChannelConfig()
- : uNumChannels(0)
- , eConfigType(0)
- , uChannelMask(0)
- {
- }
-
- AkForceInline AkChannelConfig(AkUInt32 in_uNumChannels, AkUInt32 in_uChannelMask)
- {
-
- SetStandardOrAnonymous(in_uNumChannels, in_uChannelMask);
- }
-
- AkForceInline bool operator!=(AkUInt32 in_uBitField)
- {
- return (*((AkUInt32*)this) != in_uBitField);
- }
-
- AkForceInline void Clear()
- {
- uNumChannels = 0;
- eConfigType = 0;
- uChannelMask = 0;
- }
-
- AkForceInline void SetStandard(AkUInt32 in_uChannelMask)
- {
- uNumChannels = AK::ChannelMaskToNumChannels(in_uChannelMask);
- eConfigType = AK_ChannelConfigType_Standard;
- uChannelMask = in_uChannelMask;
- }
-
- AkForceInline void SetStandardOrAnonymous(AkUInt32 in_uNumChannels, AkUInt32 in_uChannelMask)
- {
- #ifdef AKASSERT
- AKASSERT(in_uChannelMask == 0 || in_uNumChannels == AK::ChannelMaskToNumChannels(in_uChannelMask));
- #endif
- uNumChannels = in_uNumChannels;
- eConfigType = (in_uChannelMask) ? AK_ChannelConfigType_Standard : AK_ChannelConfigType_Anonymous;
- uChannelMask = in_uChannelMask;
- }
-
- AkForceInline void SetAnonymous(AkUInt32 in_uNumChannels)
- {
- uNumChannels = in_uNumChannels;
- eConfigType = AK_ChannelConfigType_Anonymous;
- uChannelMask = 0;
- }
-
- AkForceInline void SetAmbisonic(AkUInt32 in_uNumChannels)
- {
- uNumChannels = in_uNumChannels;
- eConfigType = AK_ChannelConfigType_Ambisonic;
- uChannelMask = 0;
- }
-
- AkForceInline void SetObject()
- {
- uNumChannels = 0;
- eConfigType = AK_ChannelConfigType_Objects;
- uChannelMask = 0;
- }
-
- AkForceInline void SetSameAsMainMix()
- {
- uNumChannels = 0;
- eConfigType = AK_ChannelConfigType_UseDeviceMain;
- uChannelMask = 0;
- }
-
- AkForceInline void SetSameAsPassthrough()
- {
- uNumChannels = 0;
- eConfigType = AK_ChannelConfigType_UseDevicePassthrough;
- uChannelMask = 0;
- }
-
- AkForceInline bool IsValid() const
- {
- return eConfigType <= AK_ChannelConfigType_Objects && (uNumChannels != 0 || eConfigType == AK_ChannelConfigType_Objects);
- }
-
- AkForceInline AkUInt32 Serialize() const
- {
- return uNumChannels | (eConfigType << 8) | (uChannelMask << 12);
- }
-
- AkForceInline void Deserialize(AkUInt32 in_uChannelConfig)
- {
- uNumChannels = in_uChannelConfig & 0x000000ff;
- eConfigType = (in_uChannelConfig >> 8) & 0x0000000f;
- uChannelMask = (in_uChannelConfig >> 12) & 0x000fffff;
- }
-
- AkForceInline AkChannelConfig RemoveLFE() const
- {
- AkChannelConfig newConfig = *this;
- AkUInt32 uNewChannelMask = newConfig.uChannelMask & ~AK_SPEAKER_LOW_FREQUENCY;
- AkUInt32 uNumLFEChannel = (newConfig.uChannelMask - uNewChannelMask) >> 3;
- #ifdef AKASSERT
- AKASSERT(uNumLFEChannel == 0 || uNumLFEChannel == 1);
- #endif
- newConfig.uNumChannels -= uNumLFEChannel;
- newConfig.uChannelMask = uNewChannelMask;
- return newConfig;
- }
-
- AkForceInline AkChannelConfig RemoveCenter() const
- {
- AkChannelConfig newConfig = *this;
- AkUInt32 uNewChannelMask = newConfig.uChannelMask & ~AK_SPEAKER_FRONT_CENTER;
- AkUInt32 uNumCenterChannel = (newConfig.uChannelMask - uNewChannelMask) >> 2;
- #ifdef AKASSERT
- AKASSERT(uNumCenterChannel == 0 || uNumCenterChannel == 1);
- #endif
- newConfig.uNumChannels -= uNumCenterChannel;
- newConfig.uChannelMask = uNewChannelMask;
- return newConfig;
- }
-
- AkForceInline bool operator==(const AkChannelConfig & in_other) const
- {
- return uNumChannels == in_other.uNumChannels
- && eConfigType == in_other.eConfigType
- && uChannelMask == in_other.uChannelMask;
- }
-
- AkForceInline bool operator!=(const AkChannelConfig & in_other) const
- {
- return uNumChannels != in_other.uNumChannels
- || eConfigType != in_other.eConfigType
- || uChannelMask != in_other.uChannelMask;
- }
-
-
- AkForceInline bool HasLFE() const
- {
- return AK::HasLFE(uChannelMask);
- }
-
-
-
-
- AkForceInline bool HasCenter() const
- {
- return AK::HasCenter(uChannelMask);
- }
- };
- #endif
|