"L. Spiro Engine"
|
00001 00019 #ifndef __LSS_SOUNDMANAGER_H__ 00020 #define __LSS_SOUNDMANAGER_H__ 00021 00022 #include "../LSSSoundLib.h" 00023 #include "../SoundComponents/LSSSoundBuffer.h" 00024 #include "../SoundComponents/LSSSoundListener.h" 00025 #include "../SoundComponents/LSSSoundSource.h" 00026 #include "../SoundComponents/LSSSoundSourceLoadParms.h" 00027 #include "../SoundComponents/LSSSoundSourceTypes.h" 00028 #include "../SoundComponents/LSSStaticSoundSource2d.h" 00029 #include "../SoundComponents/LSSStaticSoundSource3d.h" 00030 #include "../SoundComponents/LSSStreamingSoundSource2d.h" 00031 #include "../SoundComponents/LSSStreamingSoundSourceStreamer.h" 00032 #include "CriticalSection/LSHCriticalSection.h" 00033 #include "Map/LSTLMap.h" 00034 #include "Search/LSSTDSearch.h" 00035 #include "String/LSTLString.h" 00036 #include "Time/LSSTDTime.h" 00037 #include "Vector/LSTLVectorPoD.h" 00038 #include <cassert> 00039 00040 namespace lss { 00041 00047 class CSoundManager { 00048 friend class CSoundLib; 00049 00050 public : 00051 // == Various constructors. 00052 LSE_CALLCTOR CSoundManager(); 00053 virtual LSE_CALLCTOR ~CSoundManager(); 00054 00055 00056 // == Enumerations. 00060 enum LSS_ERRORS { 00061 LSS_E_INVALID_BUFFER = 0, 00062 }; 00063 00067 enum LSS_EVENT_TYPES { 00068 LSS_ET_SOUND_JUST_STARTED, 00069 LSS_ET_SOUND_JUST_ENDED, 00070 }; 00071 00072 00073 // == Types. 00082 typedef LSVOID (LSE_CALL * PfSoundEventHandler)( LSUINTPTR _uiptrUserPtr, CSoundSource * _pssSource, 00083 LSUINT32 _ui32EventType, CSoundManager * _psmManager ); 00084 00085 00086 // == Functions. 00094 virtual LSVOID LSE_CALL SetAllocator( CAllocator * _paAllocator ); 00095 00101 CAllocator * LSE_CALL GetAllocator(); 00102 00112 virtual LSBOOL LSE_CALL SetDevice( const LSCHAR * _pcDevice, CString * _pstrError = NULL ); 00113 00121 LSVOID LSE_CALL Run(); 00122 00126 LSVOID LSE_CALL Stop(); 00127 00131 LSVOID LSE_CALL Tick(); 00132 00140 LSVOID LSE_CALL SynchronousUpdate( LSUINTPTR _uiptrUserPtr, 00141 PfSoundEventHandler _pfHandler ); 00142 00146 virtual LSVOID LSE_CALL ResetAllSounds(); 00147 00152 virtual LSVOID LSE_CALL SoftReset(); 00153 00173 LSUINT32 LSE_CALL AddBuffer( const LSUINT8 * _pui8Data, LSUINT32 _ui32Length, 00174 LSUINT32 _ui32Freq, LSUINT32 _ui32Bits, LSUINT32 _ui32Channels, LSBOOL _bRetain = true, LSUINTPTR _uiptrUserData = 0, CString * _pstrError = NULL ); 00175 00182 LSVOID LSE_CALL RemBuffer( LSUINT32 _ui32Id ); 00183 00190 LSUINT32 LSE_CALL RemAllUnreferencedBuffers(); 00191 00198 LSBOOL LSE_CALL AllReferencesToBufferAreStreaming( LSUINT32 _ui32BufferId ) const; 00199 00207 const CSoundBuffer * LSE_CALL FindBufferById( LSUINT32 _ui32Id ) const; 00208 00216 const CSoundBuffer * LSE_CALL FindBufferByIdAndLock( LSUINT32 _ui32Id ) const; 00217 00222 LSVOID LSE_CALL Lock() const; 00223 00227 LSVOID LSE_CALL UnLock() const; 00228 00236 CSoundListener & LSE_CALL GetListener(); 00237 00252 CSoundSource * LSE_CALL AddSourceAndLock( LSS_SOUND_SOURCE _ssType, 00253 const LSS_SOUND_SOURCE_LOAD_PARMS &_sslpParms, CString * _pstrError = NULL ); 00254 00261 LSVOID LSE_CALL RemSource( LSUINT32 _ui32Id ); 00262 00271 CSoundSource * LSE_CALL FindSourceById( LSUINT32 _ui32Id ); 00272 00281 CSoundSource * LSE_CALL FindSourceByIdAndLock( LSUINT32 _ui32Id ); 00282 00291 LSBOOL LSE_CALL AttachBufferToStaticSource( LSUINT32 _ui32SrcId, 00292 LSUINT32 _ui32BufferId ); 00293 00303 LSBOOL LSE_CALL AttachBufferToStaticSource( CSoundSource * _pssSource, 00304 LSUINT32 _ui32BufferId ); 00305 00310 LSVOID LSE_CALL StopAndDeleteAllStaticSources(); 00311 00319 LSVOID LSE_CALL SetListenerPos( const CVector3 &_svPos ); 00320 00327 LSVOID LSE_CALL SetListenerVel( const CVector3 &_svVel ); 00328 00336 LSVOID LSE_CALL SetListenerPosAndVel( const CVector3 &_svPos, const CVector3 &_svVel ); 00337 00344 LSVOID LSE_CALL SetMasterVolume( LSSREAL _fVolume ); 00345 00351 const CSoundListener & LSE_CALL GetListenerAndLock() const; 00352 00358 CSoundListener & LSE_CALL GetListenerAndLock(); 00359 00365 static LSS_SOUND_SOURCE_LOAD_PARMS LSE_CALL DefaultSourceLoad(); 00366 00367 00368 protected : 00369 // == Members. 00370 // Our critical section for thread safety. 00371 mutable CCriticalSection m_csCriticalSection; 00372 00373 // Allocator we use. May not be NULL. 00374 CAllocator * m_paAllocator; 00375 00376 // Is our allocator private? 00377 LSBOOL m_bAllocatorIsPrivate; 00378 00379 // Lock count. 00380 mutable LSINT32 m_i32LockCount; 00381 00382 // Our time manager. 00383 CTime m_tTime; 00384 00385 // Flag to tell us to stop ticking in our loop. 00386 volatile LSBOOL m_bRun; 00387 00388 // The thread on which the sound manager is running. 00389 LSH_THREAD m_hThread; 00390 00391 #ifdef LSS_USEOPENAL 00392 // The current device. 00393 ALCdevice * m_pdDevice; 00394 00395 // The current context. 00396 ALCcontext * m_pcContext; 00397 #endif // #ifdef LSS_USEOPENAL 00398 00399 // List of buffers. 00400 CVectorPoD<CSoundBuffer *, LSUINT32> m_psbBuffers; 00401 00402 // List of sources. 00403 CMap<LSUINT32, CSoundSource *> m_pssSources; 00404 00405 // List of streamers. 00406 CVectorPoD<IStreamingSoundSourceStreamer *> m_pssssStreamers; 00407 00408 // The listener. There is only one. 00409 CSoundListener m_slListener; 00410 00411 00412 // == Functions. 00417 virtual LSVOID LSE_CALL ResetDevice(); 00418 00422 virtual LSVOID LSE_CALL ShutDown(); 00423 00439 virtual CSoundBuffer * LSE_CALL NewBuffer( const LSUINT8 * _pui8Data, LSUINT32 _ui32Length, 00440 LSUINT32 _ui32Freq, LSUINT32 _ui32Bits, LSUINT32 _ui32Channels, LSBOOL _bRetain, LSUINTPTR _uiptrUserData ) const; 00441 00447 virtual LSVOID LSE_CALL DeleteBuffer( CSoundBuffer * &_psbBuffer ) const; 00448 00458 virtual CSoundSource * LSE_CALL NewSoundSource( LSS_SOUND_SOURCE _ssType, LSUINT32 _ui32Id ) const; 00459 00465 virtual LSVOID LSE_CALL DeleteSource( CSoundSource * &_pssSource ) const; 00466 00474 virtual LSBOOL LSE_CALL AddStreamer( IStreamingSoundSourceStreamer * _pssssSteamer ); 00475 00482 LSUINT32 LSE_CALL GetStreamerIndex( const LSCHAR * _pcStreamerName ) const; 00483 00490 LSUINT32 LSE_CALL FindStreamerByName( const LSCHAR * _pcStreamerName ) const; 00491 00497 virtual LSVOID LSE_CALL DeleteStreamer( IStreamingSoundSourceStreamer * _pssssSteamer ) = 0; 00498 00504 LSVOID LSE_CALL FindUniqueSourceId( CSoundSource * &_pssSource ) const; 00505 00506 00507 private : 00516 static LSINT32 LSE_CCALL BufferCompare( LSVOID * _pvContext, 00517 const LSUINT32 * _pui32Left, const CSoundBuffer ** _ppsbRight ); 00518 00527 static LSINT32 LSE_CCALL SourceCompare( LSVOID * _pvContext, 00528 const LSUINT32 * _pui32Left, const CSoundSource ** _ppssRight ); 00529 00538 static LSINT32 LSE_CCALL StreamerCompare( LSVOID * _pvContext, 00539 const LSCHAR * _pcName, const IStreamingSoundSourceStreamer ** _ppssssRight ); 00540 00547 static LSUINT32 LSE_CALL RunThread( LSVOID * _lpParameter ); 00548 00549 }; 00550 00551 } // namespace lss 00552 00553 #endif // __LSS_SOUNDMANAGER_H__