00001 00002 // 00003 // Copyright (c) 2006 Audiokinetic Inc. / All Rights Reserved 00004 // 00006 00007 #ifndef _AK_BANKREADHELPERS_H_ 00008 #define _AK_BANKREADHELPERS_H_ 00009 00010 #ifdef AK_WIIU 00011 #pragma ghs nowarning 1518 00012 #endif 00013 00015 template< typename T > 00016 inline T ReadBankData( 00017 AkUInt8*& in_rptr 00018 #ifdef _DEBUG 00019 ,AkUInt32& in_rSize 00020 #endif 00021 ) 00022 { 00023 T l_Value; 00024 #if defined(AK_IOS) || defined(AK_3DS) || defined(AK_ANDROID) || defined(AK_VITA) || defined(AK_LINUX) 00025 typedef struct {T t;} __attribute__((__packed__)) packedStruct; 00026 l_Value = ((packedStruct *)in_rptr)->t; 00027 #else 00028 l_Value = *( ( T* )in_rptr ); 00029 #endif 00030 00031 in_rptr += sizeof( T ); 00032 #ifdef _DEBUG 00033 in_rSize -= sizeof( T ); 00034 #endif 00035 return l_Value; 00036 } 00037 00038 inline char * ReadBankStringUtf8( 00039 AkUInt8*& in_rptr 00040 #ifdef _DEBUG 00041 ,AkUInt32& in_rSize 00042 #endif 00043 ,AkUInt32& out_uStringSize ) 00044 { 00045 out_uStringSize = ReadBankData<AkUInt32>( in_rptr 00046 #ifdef _DEBUG 00047 ,in_rSize 00048 #endif 00049 ); 00050 00051 char * pString = 0; 00052 if ( out_uStringSize > 0 ) 00053 { 00054 pString = reinterpret_cast<char*>( in_rptr ); 00055 in_rptr += out_uStringSize; 00056 #ifdef _DEBUG 00057 in_rSize -= out_uStringSize; 00058 #endif 00059 } 00060 return pString; 00061 } 00062 00064 template< typename T > 00065 inline T ReadUnaligned( const AkUInt8* in_rptr, AkUInt32 in_bytesToSkip = 0 ) 00066 { 00067 #ifdef _DEBUG 00068 AkUInt32 size = sizeof(T); 00069 #endif 00070 AkUInt8* ptr = const_cast<AkUInt8*>(in_rptr) + in_bytesToSkip; 00071 return ReadBankData<T>(ptr 00072 #ifdef _DEBUG 00073 , size 00074 #endif 00075 ); 00076 } 00077 00078 00079 #ifdef AK_XBOX360 00080 00081 inline AkReal32 AlignFloat( AkReal32* __unaligned ptr ) 00082 { 00083 return *ptr; 00084 } 00085 00087 template<> 00088 inline AkReal32 ReadBankData<AkReal32>( 00089 AkUInt8*& in_rptr 00090 #ifdef _DEBUG 00091 ,AkUInt32& in_rSize 00092 #endif 00093 ) 00094 { 00095 AkReal32 l_Value = AlignFloat( ( AkReal32* )in_rptr ); 00096 in_rptr += sizeof( AkReal32 ); 00097 #ifdef _DEBUG 00098 in_rSize -= sizeof( AkReal32 ); 00099 #endif 00100 return l_Value; 00101 } 00102 00104 inline AkReal64 AlignFloat( AkReal64* __unaligned ptr ) 00105 { 00106 return *ptr; 00107 } 00108 00110 template<> 00111 inline AkReal64 ReadBankData<AkReal64>( 00112 AkUInt8*& in_rptr 00113 #ifdef _DEBUG 00114 ,AkUInt32& in_rSize 00115 #endif 00116 ) 00117 { 00118 AkReal64 l_Value = AlignFloat( ( AkReal64* )in_rptr ); 00119 in_rptr += sizeof( AkReal64 ); 00120 #ifdef _DEBUG 00121 in_rSize -= sizeof( AkReal64 ); 00122 #endif 00123 return l_Value; 00124 } 00125 00126 #endif //AK_XBOX360 00127 00128 #if defined( __SNC__ ) // Valid for both Vita and PS3 (w/SN Compiler) 00129 00130 inline AkReal32 AlignFloat( AkReal32 __unaligned * ptr ) 00131 { 00132 return *ptr; 00133 } 00134 00136 template<> 00137 inline AkReal32 ReadBankData<AkReal32>( 00138 AkUInt8*& in_rptr 00139 #ifdef _DEBUG 00140 ,AkUInt32& in_rSize 00141 #endif 00142 ) 00143 { 00144 AkReal32 l_Value = AlignFloat( ( AkReal32* )in_rptr ); 00145 in_rptr += sizeof( AkReal32 ); 00146 #ifdef _DEBUG 00147 in_rSize -= sizeof( AkReal32 ); 00148 #endif 00149 return l_Value; 00150 } 00151 00153 inline AkReal64 AlignFloat( AkReal64 __unaligned * ptr ) 00154 { 00155 return *ptr; 00156 } 00157 00159 template<> 00160 inline AkReal64 ReadBankData<AkReal64>( 00161 AkUInt8*& in_rptr 00162 #ifdef _DEBUG 00163 ,AkUInt32& in_rSize 00164 #endif 00165 ) 00166 { 00167 AkReal64 l_Value = AlignFloat( ( AkReal64* )in_rptr ); 00168 in_rptr += sizeof( AkReal64 ); 00169 #ifdef _DEBUG 00170 in_rSize -= sizeof( AkReal64 ); 00171 #endif 00172 return l_Value; 00173 } 00174 00175 #elif defined (AK_PS3) || defined(AK_WII) || defined (AK_WIIU) || (defined(AK_IOS) && defined(_DEBUG)) // bug with iOS SDK 4.3 in Debug only 00176 00178 template < typename TO, typename FROM > 00179 inline TO union_cast( FROM value ) 00180 { 00181 union { FROM from; TO to; } convert; 00182 convert.from = value; 00183 return convert.to; 00184 } 00185 00187 inline AkReal32 AlignFloat( AkReal32* ptr ) 00188 { 00189 AkUInt32 *puint = reinterpret_cast<AkUInt32 *>( ptr ); 00190 volatile AkUInt32 uint = *puint; 00191 return union_cast<AkReal32>( uint ); 00192 } 00193 00195 template<> 00196 inline AkReal32 ReadBankData<AkReal32>( 00197 AkUInt8*& in_rptr 00198 #ifdef _DEBUG 00199 ,AkUInt32& in_rSize 00200 #endif 00201 ) 00202 { 00203 AkReal32 l_Value = AlignFloat( ( AkReal32* )in_rptr ); 00204 in_rptr += sizeof( AkReal32 ); 00205 #ifdef _DEBUG 00206 in_rSize -= sizeof( AkReal32 ); 00207 #endif 00208 return l_Value; 00209 } 00210 00212 inline AkReal64 AlignFloat( AkReal64* ptr ) 00213 { 00214 AkUInt64 *puint = reinterpret_cast<AkUInt64 *>( ptr ); 00215 volatile AkUInt64 uint = *puint; 00216 return union_cast<AkReal64>( uint ); 00217 } 00218 00220 template<> 00221 inline AkReal64 ReadBankData<AkReal64>( 00222 AkUInt8*& in_rptr 00223 #ifdef _DEBUG 00224 ,AkUInt32& in_rSize 00225 #endif 00226 ) 00227 { 00228 AkReal64 l_Value = AlignFloat( ( AkReal64* )in_rptr ); 00229 in_rptr += sizeof( AkReal64 ); 00230 #ifdef _DEBUG 00231 in_rSize -= sizeof( AkReal64 ); 00232 #endif 00233 return l_Value; 00234 } 00235 #endif // AK_PS3 || AK_WII 00236 00237 #ifdef _DEBUG 00238 00240 #define READBANKDATA( _Type, _Ptr, _Size ) \ 00241 ReadBankData<_Type>( _Ptr, _Size ) 00242 00244 #define READBANKSTRING_UTF8( _Ptr, _Size, _out_StringSize ) \ 00245 ReadBankStringUtf8( _Ptr, _Size, _out_StringSize ) 00246 00248 #define READBANKSTRING( _Ptr, _Size, _out_StringSize ) \ 00249 ReadBankStringUtf8( _Ptr, _Size, _out_StringSize ) //same as UTF-8 for now. 00250 00252 #define SKIPBANKDATA( _Type, _Ptr, _Size ) \ 00253 ( _Ptr ) += sizeof( _Type ); \ 00254 ( _Size ) -= sizeof( _Type ) 00255 00257 #define SKIPBANKBYTES( _NumBytes, _Ptr, _Size ) \ 00258 ( _Ptr ) += _NumBytes; \ 00259 ( _Size ) -= _NumBytes 00260 00261 #else 00262 00264 #define READBANKDATA( _Type, _Ptr, _Size ) \ 00265 ReadBankData<_Type>( _Ptr ) 00266 00267 #define READBANKSTRING_UTF8( _Ptr, _Size, _out_StringSize ) \ 00268 ReadBankStringUtf8( _Ptr, _out_StringSize ) 00269 00270 #define READBANKSTRING( _Ptr, _Size, _out_StringSize ) \ 00271 ReadBankStringUtf8( _Ptr, _out_StringSize ) 00272 00274 #define SKIPBANKDATA( _Type, _Ptr, _Size ) \ 00275 ( _Ptr ) += sizeof( _Type ) 00276 00278 #define SKIPBANKBYTES( _NumBytes, _Ptr, _Size ) \ 00279 ( _Ptr ) += _NumBytes; 00280 00281 #endif 00282 00283 #define GETBANKDATABIT( _Data, _Shift ) \ 00284 (((_Data) >> (_Shift)) & 0x1) 00285 00287 #ifdef _DEBUG 00288 #define CHECKBANKDATASIZE( _DATASIZE_, _ERESULT_ ) AKASSERT( _DATASIZE_ == 0 || _ERESULT_ != AK_Success ); 00289 #else 00290 #define CHECKBANKDATASIZE(_DATASIZE_, _ERESULT_ ) 00291 #endif 00292 00293 #ifdef AK_WIIU 00294 #pragma ghs endnowarning 1518 00295 #endif 00296 00297 #endif //_AK_BANKREADHELPERS_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