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_
프로젝트를 등록하세요. 아무런 조건이나 의무 사항 없이 빠른 시작을 도와드리겠습니다.
Wwise를 시작해 보세요