00001 00002 // 00003 // AkSpeakerConfig.h 00004 // 00005 // 00006 // Copyright 2008-2009 Audiokinetic Inc. 00007 // 00009 00010 #ifndef _AK_SPEAKERCONFIG_H_ 00011 #define _AK_SPEAKERCONFIG_H_ 00012 00013 #include <AK/SoundEngine/Common/AkTypes.h> 00014 00016 #define AK_SPEAKER_FRONT_LEFT 0x1 ///< Front left speaker bit mask 00017 #define AK_SPEAKER_FRONT_RIGHT 0x2 ///< Front right speaker bit mask 00018 #define AK_SPEAKER_FRONT_CENTER 0x4 ///< Front center speaker bit mask 00019 #define AK_SPEAKER_LOW_FREQUENCY 0x8 ///< Low-frequency speaker bit mask 00020 #define AK_SPEAKER_BACK_LEFT 0x10 ///< Rear left speaker bit mask 00021 #define AK_SPEAKER_BACK_RIGHT 0x20 ///< Rear right speaker bit mask 00022 #define AK_SPEAKER_BACK_CENTER 0x100 ///< Rear center speaker ("surround speaker") bit mask 00023 #define AK_SPEAKER_SIDE_LEFT 0x200 ///< Side left speaker bit mask 00024 #define AK_SPEAKER_SIDE_RIGHT 0x400 ///< Side right speaker bit mask 00025 00027 #define AK_SPEAKER_TOP 0x800 ///< Top speaker bit mask 00028 #define AK_SPEAKER_HEIGHT_FRONT_LEFT 0x1000 ///< Front left speaker bit mask 00029 #define AK_SPEAKER_HEIGHT_FRONT_CENTER 0x2000 ///< Front center speaker bit mask 00030 #define AK_SPEAKER_HEIGHT_FRONT_RIGHT 0x4000 ///< Front right speaker bit mask 00031 #define AK_SPEAKER_HEIGHT_BACK_LEFT 0x8000 ///< Rear left speaker bit mask 00032 #define AK_SPEAKER_HEIGHT_BACK_CENTER 0x10000 ///< Rear center speaker bit mask 00033 #define AK_SPEAKER_HEIGHT_BACK_RIGHT 0x20000 ///< Rear right speaker bit mask 00034 00035 // 00036 // Supported speaker setups. Those are the ones that can be used in the Wwise Sound Engine audio pipeline. 00037 // 00038 00039 #define AK_SPEAKER_SETUP_MONO AK_SPEAKER_FRONT_CENTER ///< 1.0 setup channel mask 00040 #define AK_SPEAKER_SETUP_0POINT1 AK_SPEAKER_LOW_FREQUENCY ///< 0.1 setup channel mask 00041 #define AK_SPEAKER_SETUP_1POINT1 (AK_SPEAKER_FRONT_CENTER | AK_SPEAKER_LOW_FREQUENCY) ///< 1.1 setup channel mask 00042 #define AK_SPEAKER_SETUP_STEREO (AK_SPEAKER_FRONT_LEFT | AK_SPEAKER_FRONT_RIGHT) ///< 2.0 setup channel mask 00043 #define AK_SPEAKER_SETUP_2POINT1 (AK_SPEAKER_SETUP_STEREO | AK_SPEAKER_LOW_FREQUENCY) ///< 2.1 setup channel mask 00044 #define AK_SPEAKER_SETUP_3STEREO (AK_SPEAKER_SETUP_STEREO | AK_SPEAKER_FRONT_CENTER) ///< 3.0 setup channel mask 00045 #define AK_SPEAKER_SETUP_3POINT1 (AK_SPEAKER_SETUP_3STEREO | AK_SPEAKER_LOW_FREQUENCY) ///< 3.1 setup channel mask 00046 #define AK_SPEAKER_SETUP_4 (AK_SPEAKER_SETUP_STEREO | AK_SPEAKER_SIDE_LEFT | AK_SPEAKER_SIDE_RIGHT) ///< 4.0 setup channel mask 00047 #define AK_SPEAKER_SETUP_4POINT1 (AK_SPEAKER_SETUP_4 | AK_SPEAKER_LOW_FREQUENCY) ///< 4.1 setup channel mask 00048 #define AK_SPEAKER_SETUP_5 (AK_SPEAKER_SETUP_4 | AK_SPEAKER_FRONT_CENTER) ///< 5.0 setup channel mask 00049 #define AK_SPEAKER_SETUP_5POINT1 (AK_SPEAKER_SETUP_5 | AK_SPEAKER_LOW_FREQUENCY) ///< 5.1 setup channel mask 00050 #define AK_SPEAKER_SETUP_6 (AK_SPEAKER_SETUP_4 | AK_SPEAKER_BACK_LEFT | AK_SPEAKER_BACK_RIGHT) ///< 6.0 setup channel mask 00051 #define AK_SPEAKER_SETUP_6POINT1 (AK_SPEAKER_SETUP_6 | AK_SPEAKER_LOW_FREQUENCY) ///< 6.1 setup channel mask 00052 #define AK_SPEAKER_SETUP_7 (AK_SPEAKER_SETUP_6 | AK_SPEAKER_FRONT_CENTER) ///< 7.0 setup channel mask 00053 #define AK_SPEAKER_SETUP_7POINT1 (AK_SPEAKER_SETUP_7 | AK_SPEAKER_LOW_FREQUENCY) ///< 7.1 setup channel mask 00054 #define AK_SPEAKER_SETUP_SURROUND (AK_SPEAKER_SETUP_STEREO | AK_SPEAKER_BACK_CENTER) ///< Wii surround setup channel mask 00055 00056 // Note. DPL2 does not really have 4 channels, but it is used by plugins to differentiate from stereo setup. 00057 #define AK_SPEAKER_SETUP_DPL2 (AK_SPEAKER_SETUP_4) ///< Wii DPL2 setup channel mask 00058 00059 #define AK_SPEAKER_SETUP_HEIGHT_4 (AK_SPEAKER_HEIGHT_FRONT_LEFT | AK_SPEAKER_HEIGHT_FRONT_RIGHT | AK_SPEAKER_HEIGHT_BACK_LEFT | AK_SPEAKER_HEIGHT_BACK_RIGHT) ///< 4 speaker height layer. 00060 #define AK_SPEAKER_SETUP_HEIGHT_5 (AK_SPEAKER_SETUP_HEIGHT_4 | AK_SPEAKER_HEIGHT_FRONT_CENTER) ///< 5 speaker height layer. 00061 #define AK_SPEAKER_SETUP_HEIGHT_ALL (AK_SPEAKER_SETUP_HEIGHT_5 | AK_SPEAKER_HEIGHT_BACK_CENTER) ///< All height speaker layer. 00062 00063 // Auro speaker setups 00064 #define AK_SPEAKER_SETUP_AURO_222 (AK_SPEAKER_SETUP_4 | AK_SPEAKER_HEIGHT_FRONT_LEFT | AK_SPEAKER_HEIGHT_FRONT_RIGHT) ///< Auro-222 setup channel mask 00065 #define AK_SPEAKER_SETUP_AURO_8 (AK_SPEAKER_SETUP_AURO_222 | AK_SPEAKER_HEIGHT_BACK_LEFT | AK_SPEAKER_HEIGHT_BACK_RIGHT) ///< Auro-8 setup channel mask 00066 #define AK_SPEAKER_SETUP_AURO_9 (AK_SPEAKER_SETUP_AURO_8 | AK_SPEAKER_FRONT_CENTER) ///< Auro-9.0 setup channel mask 00067 #define AK_SPEAKER_SETUP_AURO_9POINT1 (AK_SPEAKER_SETUP_AURO_9 | AK_SPEAKER_LOW_FREQUENCY) ///< Auro-9.1 setup channel mask 00068 #define AK_SPEAKER_SETUP_AURO_10 (AK_SPEAKER_SETUP_AURO_9 | AK_SPEAKER_TOP) ///< Auro-10.0 setup channel mask 00069 #define AK_SPEAKER_SETUP_AURO_10POINT1 (AK_SPEAKER_SETUP_AURO_10 | AK_SPEAKER_LOW_FREQUENCY) ///< Auro-10.1 setup channel mask 00070 #define AK_SPEAKER_SETUP_AURO_11 (AK_SPEAKER_SETUP_AURO_10 | AK_SPEAKER_HEIGHT_FRONT_CENTER) ///< Auro-11.0 setup channel mask 00071 #define AK_SPEAKER_SETUP_AURO_11POINT1 (AK_SPEAKER_SETUP_AURO_11 | AK_SPEAKER_LOW_FREQUENCY) ///< Auro-11.1 setup channel mask 00072 #define AK_SPEAKER_SETUP_AURO_11_740 (AK_SPEAKER_SETUP_7 | AK_SPEAKER_SETUP_HEIGHT_4) ///< Auro-11.0 (7+4) setup channel mask 00073 #define AK_SPEAKER_SETUP_AURO_11POINT1_740 (AK_SPEAKER_SETUP_AURO_11_740 | AK_SPEAKER_LOW_FREQUENCY) ///< Auro-11.1 (7+4) setup channel mask 00074 #define AK_SPEAKER_SETUP_AURO_13_751 (AK_SPEAKER_SETUP_7 | AK_SPEAKER_SETUP_HEIGHT_5 | AK_SPEAKER_TOP) ///< Auro-13.0 setup channel mask 00075 #define AK_SPEAKER_SETUP_AURO_13POINT1_751 (AK_SPEAKER_SETUP_AURO_13_751 | AK_SPEAKER_LOW_FREQUENCY) ///< Auro-13.1 setup channel mask 00076 00077 // Dolby speaker setups: in Dolby standard, [#plane].[lfe].[#height] 00078 #define AK_SPEAKER_SETUP_DOLBY_5_0_2 (AK_SPEAKER_SETUP_5 | AK_SPEAKER_HEIGHT_FRONT_LEFT | AK_SPEAKER_HEIGHT_FRONT_RIGHT ) ///< Dolby 5.0.2 setup channel mask 00079 #define AK_SPEAKER_SETUP_DOLBY_5_1_2 (AK_SPEAKER_SETUP_DOLBY_5_0_2 | AK_SPEAKER_LOW_FREQUENCY ) ///< Dolby 5.1.2 setup channel mask 00080 #define AK_SPEAKER_SETUP_DOLBY_7_0_2 (AK_SPEAKER_SETUP_7 | AK_SPEAKER_HEIGHT_FRONT_LEFT | AK_SPEAKER_HEIGHT_FRONT_RIGHT ) ///< Dolby 7.0.2 setup channel mask 00081 #define AK_SPEAKER_SETUP_DOLBY_7_1_2 (AK_SPEAKER_SETUP_DOLBY_7_0_2 | AK_SPEAKER_LOW_FREQUENCY ) ///< Dolby 7.1.2 setup channel mask 00082 00083 #define AK_SPEAKER_SETUP_ALL_SPEAKERS (AK_SPEAKER_SETUP_7POINT1 | AK_SPEAKER_BACK_CENTER | AK_SPEAKER_SETUP_HEIGHT_ALL | AK_SPEAKER_TOP) ///< All speakers. 00084 00085 // Channel indices. 00086 // ------------------------------------------------ 00087 00088 // Channel indices for standard setups on the plane. 00089 #define AK_IDX_SETUP_FRONT_LEFT (0) ///< Index of front-left channel in all configurations. 00090 #define AK_IDX_SETUP_FRONT_RIGHT (1) ///< Index of front-right channel in all configurations. 00091 #define AK_IDX_SETUP_CENTER (2) ///< Index of front-center channel in all configurations. 00092 00093 #define AK_IDX_SETUP_NOCENTER_BACK_LEFT (2) ///< Index of back-left channel in configurations with no front-center channel. 00094 #define AK_IDX_SETUP_NOCENTER_BACK_RIGHT (3) ///< Index of back-right channel in configurations with no front-center channel. 00095 #define AK_IDX_SETUP_NOCENTER_SIDE_LEFT (4) ///< Index of side-left channel in configurations with no front-center channel. 00096 #define AK_IDX_SETUP_NOCENTER_SIDE_RIGHT (5) ///< Index of side-right channel in configurations with no front-center channel. 00097 00098 #define AK_IDX_SETUP_WITHCENTER_BACK_LEFT (3) ///< Index of back-left channel in configurations with a front-center channel. 00099 #define AK_IDX_SETUP_WITHCENTER_BACK_RIGHT (4) ///< Index of back-right channel in configurations with a front-center channel. 00100 #define AK_IDX_SETUP_WITHCENTER_SIDE_LEFT (5) ///< Index of side-left channel in configurations with a front-center channel. 00101 #define AK_IDX_SETUP_WITHCENTER_SIDE_RIGHT (6) ///< Index of side-right channel in configurations with a front-center channel. 00102 00103 // Channel indices for specific setups. 00104 #define AK_IDX_SETUP_0_LFE (0) ///< Index of low-frequency channel in 0.1 setup (use with AkAudioBuffer::GetChannel()) 00105 00106 #define AK_IDX_SETUP_1_CENTER (0) ///< Index of center channel in 1.x setups (use with AkAudioBuffer::GetChannel()) 00107 #define AK_IDX_SETUP_1_LFE (1) ///< Index of low-frequency channel in 1.1 setup (use with AkAudioBuffer::GetChannel()) 00108 00109 #define AK_IDX_SETUP_2_LEFT (0) ///< Index of left channel in 2.x setups (use with AkAudioBuffer::GetChannel()) 00110 #define AK_IDX_SETUP_2_RIGHT (1) ///< Index of right channel in 2.x setups (use with AkAudioBuffer::GetChannel()) 00111 #define AK_IDX_SETUP_2_LFE (2) ///< Index of low-frequency channel in 2.1 setup (use with AkAudioBuffer::GetChannel()) 00112 00113 #define AK_IDX_SETUP_3_LEFT (0) ///< Index of left channel in 3.x setups (use with AkAudioBuffer::GetChannel()) 00114 #define AK_IDX_SETUP_3_RIGHT (1) ///< Index of right channel in 3.x setups (use with AkAudioBuffer::GetChannel()) 00115 #define AK_IDX_SETUP_3_CENTER (2) ///< Index of center channel in 3.x setups (use with AkAudioBuffer::GetChannel()) 00116 #define AK_IDX_SETUP_3_LFE (3) ///< Index of low-frequency channel in 3.1 setup (use with AkAudioBuffer::GetChannel()) 00117 00118 #define AK_IDX_SETUP_4_FRONTLEFT (0) ///< Index of front left channel in 4.x setups (use with AkAudioBuffer::GetChannel()) 00119 #define AK_IDX_SETUP_4_FRONTRIGHT (1) ///< Index of front right channel in 4.x setups (use with AkAudioBuffer::GetChannel()) 00120 #define AK_IDX_SETUP_4_REARLEFT (2) ///< Index of rear left channel in 4.x setups (use with AkAudioBuffer::GetChannel()) 00121 #define AK_IDX_SETUP_4_REARRIGHT (3) ///< Index of rear right channel in 4.x setups (use with AkAudioBuffer::GetChannel()) 00122 #define AK_IDX_SETUP_4_LFE (4) ///< Index of low-frequency channel in 4.1 setup (use with AkAudioBuffer::GetChannel()) 00123 00124 #define AK_IDX_SETUP_5_FRONTLEFT (0) ///< Index of front left channel in 5.x setups (use with AkAudioBuffer::GetChannel()) 00125 #define AK_IDX_SETUP_5_FRONTRIGHT (1) ///< Index of front right channel in 5.x setups (use with AkAudioBuffer::GetChannel()) 00126 #define AK_IDX_SETUP_5_CENTER (2) ///< Index of center channel in 5.x setups (use with AkAudioBuffer::GetChannel()) 00127 #define AK_IDX_SETUP_5_REARLEFT (3) ///< Index of rear left channel in 5.x setups (use with AkAudioBuffer::GetChannel()) 00128 #define AK_IDX_SETUP_5_REARRIGHT (4) ///< Index of rear right channel in 5.x setups (use with AkAudioBuffer::GetChannel()) 00129 #define AK_IDX_SETUP_5_LFE (5) ///< Index of low-frequency channel in 5.1 setup (use with AkAudioBuffer::GetChannel()) 00130 00131 #ifdef AK_71AUDIO 00132 #define AK_IDX_SETUP_6_FRONTLEFT (0) ///< Index of front left channel in 6.x setups (use with AkAudioBuffer::GetChannel()) 00133 #define AK_IDX_SETUP_6_FRONTRIGHT (1) ///< Index of fornt right channel in 6x setups (use with AkAudioBuffer::GetChannel()) 00134 #define AK_IDX_SETUP_6_REARLEFT (2) ///< Index of rear left channel in 6.x setups (use with AkAudioBuffer::GetChannel()) 00135 #define AK_IDX_SETUP_6_REARRIGHT (3) ///< Index of rear right channel in 6.x setups (use with AkAudioBuffer::GetChannel()) 00136 #define AK_IDX_SETUP_6_SIDELEFT (4) ///< Index of side left channel in 6.x setups (use with AkAudioBuffer::GetChannel()) 00137 #define AK_IDX_SETUP_6_SIDERIGHT (5) ///< Index of side right channel in 6.x setups (use with AkAudioBuffer::GetChannel()) 00138 #define AK_IDX_SETUP_6_LFE (6) ///< Index of low-frequency channel in 6.1 setup (use with AkAudioBuffer::GetChannel()) 00139 00140 #define AK_IDX_SETUP_7_FRONTLEFT (0) ///< Index of front left channel in 7.x setups (use with AkAudioBuffer::GetChannel()) 00141 #define AK_IDX_SETUP_7_FRONTRIGHT (1) ///< Index of fornt right channel in 7.x setups (use with AkAudioBuffer::GetChannel()) 00142 #define AK_IDX_SETUP_7_CENTER (2) ///< Index of center channel in 7.x setups (use with AkAudioBuffer::GetChannel()) 00143 #define AK_IDX_SETUP_7_REARLEFT (3) ///< Index of rear left channel in 7.x setups (use with AkAudioBuffer::GetChannel()) 00144 #define AK_IDX_SETUP_7_REARRIGHT (4) ///< Index of rear right channel in 7.x setups (use with AkAudioBuffer::GetChannel()) 00145 #define AK_IDX_SETUP_7_SIDELEFT (5) ///< Index of side left channel in 7.x setups (use with AkAudioBuffer::GetChannel()) 00146 #define AK_IDX_SETUP_7_SIDERIGHT (6) ///< Index of side right channel in 7.x setups (use with AkAudioBuffer::GetChannel()) 00147 #define AK_IDX_SETUP_7_LFE (7) ///< Index of low-frequency channel in 7.1 setup (use with AkAudioBuffer::GetChannel()) 00148 #endif 00149 00150 // 00151 // Extra speaker setups. This is a more exhaustive list of speaker setups, which might not all be supported 00152 // by the Wwise Sound Engine audio pipeline. 00153 // 00154 00155 #define AK_SPEAKER_SETUP_0_1 ( AK_SPEAKER_LOW_FREQUENCY ) //0.1 00156 #define AK_SPEAKER_SETUP_1_0 ( AK_SPEAKER_FRONT_LEFT ) //1.0 (L) 00157 #define AK_SPEAKER_SETUP_1_1 ( AK_SPEAKER_FRONT_LEFT | AK_SPEAKER_LOW_FREQUENCY ) //1.1 (L) 00158 00159 #define AK_SPEAKER_SETUP_1_0_CENTER ( AK_SPEAKER_FRONT_CENTER ) //1.0 (C) 00160 #define AK_SPEAKER_SETUP_1_1_CENTER ( AK_SPEAKER_FRONT_CENTER | AK_SPEAKER_LOW_FREQUENCY ) //1.1 (C) 00161 00162 #define AK_SPEAKER_SETUP_2_0 ( AK_SPEAKER_FRONT_LEFT | AK_SPEAKER_FRONT_RIGHT ) //2.0 00163 #define AK_SPEAKER_SETUP_2_1 ( AK_SPEAKER_FRONT_LEFT | AK_SPEAKER_FRONT_RIGHT | AK_SPEAKER_LOW_FREQUENCY ) //2.1 00164 00165 #define AK_SPEAKER_SETUP_3_0 ( AK_SPEAKER_FRONT_LEFT | AK_SPEAKER_FRONT_RIGHT | AK_SPEAKER_FRONT_CENTER ) //3.0 00166 #define AK_SPEAKER_SETUP_3_1 ( AK_SPEAKER_SETUP_3_0 | AK_SPEAKER_LOW_FREQUENCY ) //3.1 00167 00168 #define AK_SPEAKER_SETUP_FRONT ( AK_SPEAKER_SETUP_3_0 ) 00169 00170 #define AK_SPEAKER_SETUP_4_0 ( AK_SPEAKER_SETUP_4 ) 00171 #define AK_SPEAKER_SETUP_4_1 ( AK_SPEAKER_SETUP_4POINT1 ) 00172 #define AK_SPEAKER_SETUP_5_0 ( AK_SPEAKER_SETUP_5 ) 00173 #define AK_SPEAKER_SETUP_5_1 ( AK_SPEAKER_SETUP_5POINT1 ) 00174 00175 #define AK_SPEAKER_SETUP_6_0 ( AK_SPEAKER_SETUP_6 ) 00176 #define AK_SPEAKER_SETUP_6_1 ( AK_SPEAKER_SETUP_6POINT1 ) 00177 #define AK_SPEAKER_SETUP_7_0 ( AK_SPEAKER_SETUP_7 ) 00178 #define AK_SPEAKER_SETUP_7_1 ( AK_SPEAKER_SETUP_7POINT1 ) 00179 00180 inline void AK_SPEAKER_SETUP_FIX_LEFT_TO_CENTER( AkUInt32 &io_uChannelMask ) 00181 { 00182 if( !(io_uChannelMask & AK_SPEAKER_FRONT_CENTER) 00183 && !(io_uChannelMask & AK_SPEAKER_FRONT_RIGHT) 00184 && (io_uChannelMask & AK_SPEAKER_FRONT_LEFT) ) 00185 { 00186 io_uChannelMask &= ~AK_SPEAKER_FRONT_LEFT; // remove left 00187 io_uChannelMask |= AK_SPEAKER_FRONT_CENTER; // add center 00188 } 00189 } 00190 00191 inline void AK_SPEAKER_SETUP_FIX_REAR_TO_SIDE( AkUInt32 &io_uChannelMask ) 00192 { 00193 if( io_uChannelMask & ( AK_SPEAKER_BACK_LEFT ) && !( io_uChannelMask & AK_SPEAKER_SIDE_LEFT ) ) 00194 { 00195 io_uChannelMask &= ~( AK_SPEAKER_BACK_LEFT | AK_SPEAKER_BACK_RIGHT ); // remove rears 00196 io_uChannelMask |= ( AK_SPEAKER_SIDE_LEFT | AK_SPEAKER_SIDE_RIGHT ); // add sides 00197 } 00198 } 00199 00200 inline void AK_SPEAKER_SETUP_CONVERT_TO_SUPPORTED( AkUInt32 &io_uChannelMask ) 00201 { 00202 AK_SPEAKER_SETUP_FIX_LEFT_TO_CENTER( io_uChannelMask ); 00203 AK_SPEAKER_SETUP_FIX_REAR_TO_SIDE( io_uChannelMask ); 00204 } 00205 00206 namespace AK 00207 { 00208 00210 static inline unsigned int ChannelMaskToNumChannels( AkChannelMask in_uChannelMask ) 00211 { 00212 unsigned int num = 0; 00213 while( in_uChannelMask ){ ++num; in_uChannelMask &= in_uChannelMask-1; } // iterate max once per channel. 00214 return num; 00215 } 00216 00219 static inline AkChannelMask ChannelMaskFromNumChannels( unsigned int in_uNumChannels ) 00220 { 00221 AkChannelMask uChannelMask = 0; 00222 00223 switch ( in_uNumChannels ) 00224 { 00225 case 1: 00226 uChannelMask = AK_SPEAKER_SETUP_1_0_CENTER; 00227 break; 00228 case 2: 00229 uChannelMask = AK_SPEAKER_SETUP_2_0; 00230 break; 00231 case 3: 00232 uChannelMask = AK_SPEAKER_SETUP_2_1; 00233 break; 00234 case 4: 00235 uChannelMask = AK_SPEAKER_SETUP_4_0; 00236 break; 00237 case 5: 00238 uChannelMask = AK_SPEAKER_SETUP_5_0; 00239 break; 00240 case 6: 00241 uChannelMask = AK_SPEAKER_SETUP_5_1; 00242 break; 00243 case 7: 00244 uChannelMask = AK_SPEAKER_SETUP_7; 00245 break; 00246 case 8: 00247 uChannelMask = AK_SPEAKER_SETUP_7POINT1; 00248 break; 00249 } 00250 00251 return uChannelMask; 00252 } 00253 00255 enum AkChannelOrdering 00256 { 00257 ChannelOrdering_Standard, // L-R-C-Lfe-RL-RR-RC-SL-SR-HL-HR-HC-HRL-HRR-HRC-T 00258 ChannelOrdering_RunTime // L-R-C-RL-RR-RC-SL-SR-HL-HR-HC-HRL-HRR-HRC-T-Lfe 00259 }; 00260 00263 AkForceInline bool HasSurroundChannels( AkChannelMask in_uChannelMask ) 00264 { 00265 return ( in_uChannelMask & AK_SPEAKER_BACK_LEFT || in_uChannelMask & AK_SPEAKER_SIDE_LEFT ); 00266 } 00267 00271 AkForceInline bool HasStrictlyOnePairOfSurroundChannels( AkChannelMask in_uChannelMask ) 00272 { 00273 return ( ( ( in_uChannelMask & AK_SPEAKER_BACK_LEFT ) != 0 ) ^ ( ( in_uChannelMask & AK_SPEAKER_SIDE_LEFT ) != 0 ) ); 00274 } 00275 00279 AkForceInline bool HasSideAndRearChannels( AkChannelMask in_uChannelMask ) 00280 { 00281 return ( in_uChannelMask & AK_SPEAKER_BACK_LEFT && in_uChannelMask & AK_SPEAKER_SIDE_LEFT ); 00282 } 00283 00286 AkForceInline AkChannelMask BackToSideChannels( AkChannelMask in_uChannelMask ) 00287 { 00288 if ( HasStrictlyOnePairOfSurroundChannels( in_uChannelMask ) ) 00289 { 00290 in_uChannelMask &= ~( AK_SPEAKER_BACK_LEFT | AK_SPEAKER_BACK_RIGHT ); // remove rears 00291 in_uChannelMask |= ( AK_SPEAKER_SIDE_LEFT | AK_SPEAKER_SIDE_RIGHT ); // add sides 00292 } 00293 return in_uChannelMask; 00294 } 00295 00300 static inline unsigned int ChannelIndexToDisplayIndex( AkChannelOrdering in_eOrdering, unsigned int in_uChannelMask, unsigned int in_uChannelIdx ) 00301 { 00302 if ( in_eOrdering == ChannelOrdering_Standard ) 00303 { 00304 unsigned int uNumChannelsFront = ChannelMaskToNumChannels( in_uChannelMask & AK_SPEAKER_SETUP_FRONT ); 00305 if ( ( in_uChannelMask & AK_SPEAKER_LOW_FREQUENCY ) 00306 && ( in_uChannelIdx == uNumChannelsFront ) ) 00307 { 00308 // Lfe. Return penultimate channel. 00309 in_uChannelIdx = ChannelMaskToNumChannels( in_uChannelMask ) - 1; 00310 } 00311 else if ( in_uChannelIdx >= uNumChannelsFront ) // strictly greater than uNumChannelsFront (lfe index) if lfe is present, greater or equal otherwise. 00312 { 00313 // Back channel. Return index or index-1 if there is an LFE (uLfeOffset==1). 00314 unsigned int uLfeOffset = ( in_uChannelMask & AK_SPEAKER_LOW_FREQUENCY ) ? 1 : 0; 00315 00316 // 6-7.x: Need to swap back and sides. 00317 if ( HasSideAndRearChannels( in_uChannelMask ) ) 00318 { 00319 unsigned int uRearIdx = uNumChannelsFront + uLfeOffset; 00320 unsigned int uSideIdx = uRearIdx + 2; 00321 unsigned int uAfterSideIdx = uSideIdx + 2; 00322 if ( in_uChannelIdx < uAfterSideIdx ) 00323 { 00324 if ( in_uChannelIdx >= uSideIdx ) 00325 in_uChannelIdx -= 2; // input is side, swap it with back. 00326 else 00327 in_uChannelIdx += 2; // input is back, swap it with side. 00328 } 00329 } 00330 in_uChannelIdx -= uLfeOffset; // compensate for LFE if it was skipped above. 00331 } 00332 } 00333 else 00334 { 00335 // 6-7.x: Need to swap back and sides. 00336 if ( HasSideAndRearChannels( in_uChannelMask ) ) 00337 { 00338 unsigned int uRearIdx = ChannelMaskToNumChannels( in_uChannelMask & AK_SPEAKER_SETUP_FRONT ); 00339 unsigned int uMaxIdx = uRearIdx + 4; // Side and rear channels. 00340 00341 if ( in_uChannelIdx >= uRearIdx 00342 && in_uChannelIdx < uMaxIdx ) 00343 { 00344 // Surround channel (not LFE). 00345 unsigned int uSideIdx = uRearIdx + 2; 00346 if ( in_uChannelIdx >= uSideIdx ) 00347 in_uChannelIdx -= 2; // input is side, swap it with back. 00348 else 00349 in_uChannelIdx += 2; // input is back, swap it with side. 00350 } 00351 } 00352 } 00353 00354 return in_uChannelIdx; 00355 } 00356 00357 } // namespace AK 00358 00359 #endif //_AK_SPEAKERCONFIG_H_
Questions? Problems? Need more info? Contact us, and we can help!
Visit our Support pageRegister your project and we'll help you get started with no strings attached!
Get started with Wwise