Version

menu_open

include/AK/SoundEngine/Common/AkSpeakerConfig.h

Go to the documentation of this file.
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_

Was this page helpful?

Need Support?

Questions? Problems? Need more info? Contact us, and we can help!

Visit our Support page

Tell us about your project. We're here to help.

Register your project and we'll help you get started with no strings attached!

Get started with Wwise