"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSSoundLib/Src/SoundCore/LSSSoundManager.h

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__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator