00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef NL_SOUND_DRIVER_AL_H
00027 #define NL_SOUND_DRIVER_AL_H
00028
00029 #include "nel/misc/types_nl.h"
00030 #include "sound/driver/sound_driver.h"
00031 #include "sound/driver/openal/source_al.h"
00032 #include "sound/driver/openal/buffer_al.h"
00033 #include <AL/al.h>
00034 #ifdef NL_OS_WINDOWS
00035 #include <objbase.h>
00036 #define EAX_AVAILABLE
00037 #endif
00038
00039 #ifdef EAX_AVAILABLE
00040 #include <eax.h>
00041 #endif
00042
00043 #include <vector>
00044
00045
00046 namespace NLSOUND {
00047
00048
00049
00050
00051 typedef ALvoid (*TGenFunctionAL) ( ALsizei, ALuint* );
00052
00053
00054
00055 typedef ALboolean (*TTestFunctionAL) ( ALuint );
00056
00057
00058 #ifdef EAX_AVAILABLE
00059
00060 extern EAXSet EAXSetProp;
00061
00062
00063 extern EAXGet EAXGetProp;
00064 #endif
00065
00066
00067 #ifdef NL_DEBUG
00068 void TestALError();
00069 #else
00070 #define TestALError()
00071 #endif
00072
00073
00074
00087 class CSoundDriverAL : public ISoundDriver
00088 {
00089 public:
00090
00092 CSoundDriverAL();
00093
00095 static CSoundDriverAL *instance() { return _Instance; }
00096
00098 virtual bool init();
00099
00101 virtual IBuffer *createBuffer();
00102
00104 virtual IListener *createListener();
00105
00107 virtual uint countMaxSources() { return 32; }
00108
00110 virtual ISource *createSource();
00111
00113 void applyRolloffFactor( float f );
00114
00116 virtual bool loadWavFile( IBuffer *destbuffer, const char *filename );
00117
00119 virtual void commit3DChanges() {}
00120
00122 virtual void writeProfile(std::ostream& out) {}
00123
00124
00125
00126 public:
00127
00129 virtual ~CSoundDriverAL();
00130
00131 protected:
00132
00133 friend CBufferAL::~CBufferAL();
00134 friend CSourceAL::~CSourceAL();
00135
00137 void removeBuffer( IBuffer *buffer );
00138
00140 void removeSource( ISource *source );
00141
00142 protected:
00143
00145 void allocateNewItems( TGenFunctionAL algenfunc, TTestFunctionAL altestfunc,
00146 std::vector<ALuint>& names, uint index, uint nb );
00147
00149 void generateItems( TGenFunctionAL algenfunc, TTestFunctionAL altestfunc, uint nb, ALuint *array );
00150
00152 uint compactAliveNames( std::vector<ALuint>& names, TTestFunctionAL testfunc );
00153
00155 ALuint createItem( TGenFunctionAL algenfunc, TTestFunctionAL altestfunc,
00156 std::vector<ALuint>& names, uint& index, uint allocrate );
00157
00159 bool deleteItem( ALuint name, TGenFunctionAL aldeletefunc, std::vector<ALuint>& names );
00160
00161 private:
00162
00163
00164 static CSoundDriverAL *_Instance;
00165
00166
00167 std::vector<ALuint> _Buffers;
00168
00169
00170 std::vector<ALuint> _Sources;
00171
00172
00173 uint _NbExpBuffers;
00174
00175
00176 uint _NbExpSources;
00177
00178
00179 float _RolloffFactor;
00180
00181 };
00182
00183
00184 }
00185
00186
00187 #endif // NL_SOUND_DRIVER_AL_H
00188
00189