"L. Spiro Engine"
|
00001 00017 #ifndef __LSS_WAVELOADER_H__ 00018 #define __LSS_WAVELOADER_H__ 00019 00020 #include "../LSSSoundLib.h" 00021 #include "Allocator/LSTLAllocator.h" 00022 #include "HighLevel/LSFFileMap.h" 00023 #include "HighLevel/LSFFilesEx.h" 00024 00025 namespace lss { 00026 00032 class CWaveLoader { 00033 public : 00034 // == Enumerations. 00038 enum LSE_WAVE_EXTENSIBLE { 00039 LSE_WE_PCM = 1, 00040 LSE_WE_EXTENSIBLE = 0xFFFE, 00041 LSE_WE_EXTPERIMENTAL = 0xFFFF, 00042 }; 00043 00044 // == Types. 00048 typedef struct LSE_WAVE_FILE_INFO { 00052 LSUINTPTR uiptrOffsetToWaveData; 00053 00057 LSUINT32 ui32WaveLength; 00058 00062 LSUINT32 ui32Freq; 00063 00067 LSUINT32 ui32Bits; 00068 00072 LSUINT32 ui32Channels; 00073 00077 LSE_WAVE_EXTENSIBLE weCompression; 00078 00082 LSUINT32 ui32ChannelMask; 00083 } * LPLSE_WAVE_FILE_INFO, * const LPCLSE_WAVE_FILE_INFO; 00084 00085 00086 // == Functions. 00095 static LSBOOL LSE_CALL GetWaveInfo( const LSUINT8 * _pui8File, LSUINT32 _ui32FileLen, 00096 LSE_WAVE_FILE_INFO &_wfiInfo ); 00097 00105 static LSBOOL LSE_CALL GetWaveInfo( const CFileMap &_fmMap, 00106 LSE_WAVE_FILE_INFO &_wfiInfo ); 00107 00123 static LSBOOL LSE_CALL LoadWavFile( const LSCHAR * _pcFile, 00124 LSUINT8 * &_pui8Data, LSUINT32 &_ui32Length, 00125 LSUINT32 &_ui32Freq, LSUINT32 &_ui32Bits, LSUINT32 &_ui32Channels, CAllocator * _paAllocator ); 00126 00141 static LSBOOL LSE_CALL LoadWavFile( const LSUINT8 * _pui8File, LSUINT32 _ui32FileLen, 00142 LSUINT8 * &_pui8Data, LSUINT32 &_ui32Length, 00143 LSUINT32 &_ui32Freq, LSUINT32 &_ui32Bits, LSUINT32 &_ui32Channels, CAllocator * _paAllocator ); 00144 00145 00146 protected : 00147 // == Enumerations. 00152 enum LSS_WAVE_SPEAKERS { 00153 LSS_SPEAKER_FRONT_LEFT = (1 << 0), 00154 LSS_SPEAKER_FRONT_RIGHT = (1 << 1), 00155 LSS_SPEAKER_FRONT_CENTER = (1 << 2), 00156 LSS_SPEAKER_LOW_FREQUENCY = (1 << 3), 00157 LSS_SPEAKER_BACK_LEFT = (1 << 4), 00158 LSS_SPEAKER_BACK_RIGHT = (1 << 5), 00159 LSS_SPEAKER_FRONT_LEFT_OF_CENTER = (1 << 6), 00160 LSS_SPEAKER_FRONT_RIGHT_OF_CENTER = (1 << 7), 00161 LSS_SPEAKER_BACK_CENTER = (1 << 8), 00162 LSS_SPEAKER_SIDE_LEFT = (1 << 9), 00163 LSS_SPEAKER_SIDE_RIGHT = (1 << 10), 00164 LSS_SPEAKER_TOP_CENTER = (1 << 11), 00165 LSS_SPEAKER_TOP_FRONT_LEFT = (1 << 12), 00166 LSS_SPEAKER_TOP_FRONT_CENTER = (1 << 13), 00167 LSS_SPEAKER_TOP_FRONT_RIGHT = (1 << 14), 00168 LSS_SPEAKER_TOP_BACK_LEFT = (1 << 15), 00169 LSS_SPEAKER_TOP_BACK_CENTER = (1 << 16), 00170 LSS_SPEAKER_TOP_BACK_RIGHT = (1 << 17), 00171 LSS_SPEAKER_ANY = 0x80000000, 00172 }; 00173 00174 00175 // == Types. 00176 00177 #pragma pack( push, 1 ) 00178 00181 typedef struct LSE_WAVE_FILE_HEADER { 00185 LSUINT8 ui8Header[4]; 00186 00190 LSUINT32 ui32Size; 00191 00195 LSUINT8 ui8Wave[4]; 00196 } * LPLSE_WAVE_FILE_HEADER, * const LPCLSE_WAVE_FILE_HEADER; 00197 00201 typedef struct LSE_WAVE_FILE_CHUNK_HEADER { 00205 LSUINT8 ui8Name[4]; 00206 00210 LSUINT32 ui32Size; 00211 00215 LSUINT8 ui8Data[1]; 00216 } * LPLSE_WAVE_FILE_CHUNK_HEADER, * const LPCLSE_WAVE_FILE_CHUNK_HEADER; 00217 00221 typedef struct LSE_WAVE_FILE_FMT_DATA { 00225 LSUINT16 ui16Compression; 00226 00230 LSUINT16 ui16Channels; 00231 00235 LSUINT32 ui32Frequency; 00236 00240 LSUINT32 ui32BytesPerSecond; 00241 00245 LSUINT16 ui16Align; 00246 00250 LSUINT16 ui16BitsPerSample; 00251 00255 union { 00256 LSUINT16 ui16ValidBitsPerSample; 00257 LSUINT16 ui16SamplesPerBlock; 00258 LSUINT16 ui16Reserved; 00259 } uSamples; 00260 LSUINT16 ui16Pad; 00261 00265 LSUINT32 ui32ChannelMask; 00266 } * LPLSE_WAVE_FILE_FMT_DATA, * const LPCLSE_WAVE_FILE_FMT_DATA; 00267 #pragma pack( pop ) 00268 00269 00270 // == Functions. 00280 static const LPLSE_WAVE_FILE_CHUNK_HEADER LSE_CALL FindChunk( const LSCHAR * _pcName, const LSUINT8 * _pui8Data, LSUINT32 _ui32Len ); 00281 00290 static const LSUINT64 LSE_CALL FindChunk( const LSCHAR * _pcName, const CFileMap &_fmMap ); 00291 00300 static CSoundLib::LSS_CHANNELS LSE_CALL FindSoundLibraryFormat( LSUINT32 _ui32Channels, LSUINT32 _ui32Bits ); 00301 00312 static LSBOOL LSE_CALL GetWaveInfo( const LSE_WAVE_FILE_HEADER &_wfhHeader, 00313 const LSE_WAVE_FILE_FMT_DATA &_wffdFmt, 00314 const LSE_WAVE_FILE_CHUNK_HEADER &_wfchData, 00315 LSUINT64 _ui64FileLen, 00316 LSE_WAVE_FILE_INFO &_wfiInfo ); 00317 }; 00318 00319 } // namespace lss 00320 00321 #endif // __LSS_WAVELOADER_H__