#include <sound_driver_al.h>
Inheritance diagram for NLSOUND::CSoundDriverAL:
The caller of the create methods is responsible for the deletion of the created objects These objects must be deleted before deleting the ISoundDriver instance.
Nevrax France
Definition at line 91 of file sound_driver_al.h.
Public Member Functions | |
void | applyRolloffFactor (float f) |
Change the rolloff factor and apply to all sources. | |
virtual void | commit3DChanges () |
Commit all the changes made to 3D settings of listener and sources. | |
virtual uint | countMaxSources () |
Return the maximum number of sources that can created. | |
virtual IBuffer * | createBuffer () |
Create a sound buffer. | |
virtual IListener * | createListener () |
Create the listener instance. | |
virtual ISource * | createSource () |
Create a source. | |
CSoundDriverAL () | |
Constructor. | |
virtual void | displayBench (NLMISC::CLog *log) |
virtual void | endBench () |
virtual bool | init () |
Initialization. | |
virtual bool | loadWavFile (IBuffer *destbuffer, const char *filename) |
Temp. | |
virtual bool | readRawBuffer (IBuffer *destbuffer, const std::string &name, uint8 *rawData, uint dataSize, TSampleFormat format, uint32 frequency) |
virtual bool | readWavBuffer (IBuffer *destbuffer, const std::string &name, uint8 *wavData, uint dataSize) |
Temp. | |
virtual void | startBench () |
virtual void | writeProfile (std::ostream &out) |
Write information about the driver to the output stream. | |
virtual | ~CSoundDriverAL () |
Destructor. | |
Static Public Member Functions | |
ISoundDriver * | createDriver (bool useEax, IStringMapperProvider *stringMapper) |
CSoundDriverAL * | instance () |
Return the instance of the singleton. | |
Static Public Attributes | |
const uint32 | InterfaceVersion = 0x08 |
Version of the driver interface. To increment when the interface change. | |
Protected Member Functions | |
void | allocateNewItems (TGenFunctionAL algenfunc, TTestFunctionAL altestfunc, std::vector< ALuint > &names, uint index, uint nb) |
Allocate nb new buffers or sources. | |
friend | CBufferAL::~CBufferAL () |
uint | compactAliveNames (std::vector< ALuint > &names, TTestFunctionAL testfunc) |
Remove names of deleted items and return the number of valid items. | |
ALuint | createItem (TGenFunctionAL algenfunc, TTestFunctionAL altestfunc, std::vector< ALuint > &names, uint &index, uint allocrate) |
Create a sound buffer or a sound source. | |
friend | CSourceAL::~CSourceAL () |
bool | deleteItem (ALuint name, TGenFunctionAL aldeletefunc, std::vector< ALuint > &names) |
Delete a buffer or a source. | |
void | generateItems (TGenFunctionAL algenfunc, TTestFunctionAL altestfunc, uint nb, ALuint *array) |
Generate nb buffers. | |
void | removeBuffer (IBuffer *buffer) |
Remove a buffer. | |
void | removeSource (ISource *source) |
Remove a source. | |
Private Attributes | |
std::vector< ALuint > | _Buffers |
uint | _NbExpBuffers |
uint | _NbExpSources |
float | _RolloffFactor |
std::vector< ALuint > | _Sources |
Static Private Attributes | |
CSoundDriverAL * | _Instance = NULL |
|
Constructor.
Definition at line 129 of file sound_driver_al.cpp. References nlerror.
00129 : 00130 ISoundDriver(), _NbExpBuffers( 0 ), _NbExpSources( 0 ), _RolloffFactor( 1.0f ) 00131 { 00132 if ( _Instance == NULL ) 00133 { 00134 _Instance = this; 00135 } 00136 else 00137 { 00138 nlerror( "Sound driver singleton instanciated twice" ); 00139 } 00140 } |
|
Destructor.
Definition at line 146 of file sound_driver_al.cpp. References _Buffers, and compactAliveNames().
00147 { 00148 // Remove the allocated (but not exported) source and buffer names 00149 alDeleteSources( compactAliveNames( _Sources, alIsSource ), &*_Sources.begin() ); 00150 alDeleteBuffers( compactAliveNames( _Buffers, alIsBuffer ), &*_Buffers.begin() ); 00151 00152 // OpenAL exit 00153 alutExit(); 00154 00155 _Instance = NULL; 00156 } |
|
|
|
|
|
Allocate nb new buffers or sources.
Definition at line 215 of file sound_driver_al.cpp. References generateItems(), index, nlassert, NLSOUND::TGenFunctionAL, NLSOUND::TTestFunctionAL, and uint. Referenced by createItem(), and init().
00217 { 00218 nlassert( index == names.size() ); 00219 names.resize( index + nb ); 00220 generateItems( algenfunc, altestfunc, nb, &(names[index]) ); 00221 } |
|
Change the rolloff factor and apply to all sources.
Definition at line 400 of file sound_driver_al.cpp. References _RolloffFactor, and TestALError.
00401 { 00402 _RolloffFactor = f; 00403 vector<ALuint>::iterator ibn; 00404 for ( ibn=_Sources.begin(); ibn!=_Sources.end(); ++ibn ) 00405 { 00406 alSourcef( *ibn, AL_ROLLOFF_FACTOR, _RolloffFactor ); 00407 } 00408 TestALError(); 00409 } |
|
Commit all the changes made to 3D settings of listener and sources.
Implements NLSOUND::ISoundDriver. Definition at line 132 of file sound_driver_al.h.
00132 {} |
|
Remove names of deleted items and return the number of valid items.
Definition at line 323 of file sound_driver_al.cpp. References nlassert, NLSOUND::TTestFunctionAL, and uint. Referenced by createItem(), and ~CSoundDriverAL().
00324 { 00325 vector<ALuint>::iterator iball, ibcompacted; 00326 for ( iball=names.begin(), ibcompacted=names.begin(); iball!=names.end(); ++iball ) 00327 { 00328 // iball is incremented every iteration 00329 // ibcompacted is not incremented if a buffer is not valid anymore 00330 if ( altestfunc( *iball ) ) 00331 { 00332 *ibcompacted = *iball; 00333 ++ibcompacted; 00334 } 00335 } 00336 nlassert( ibcompacted <= names.end() ); 00337 return ibcompacted - names.begin(); 00338 } |
|
Return the maximum number of sources that can created.
Implements NLSOUND::ISoundDriver. Definition at line 111 of file sound_driver_al.h. References uint.
00111 { return 32; }
|
|
Create a sound buffer.
Implements NLSOUND::ISoundDriver. Definition at line 264 of file sound_driver_al.cpp. References _Buffers, _NbExpBuffers, BUFFER_ALLOC_RATE, and createItem().
00265 { 00266 NL_ALLOC_CONTEXT(NLSOUND_CSoundDriverAL); 00267 return new CBufferAL( createItem( alGenBuffers, alIsBuffer, _Buffers, _NbExpBuffers, BUFFER_ALLOC_RATE ) ); 00268 } |
|
The static method which builds the sound driver instance In case of failure, can throw one of these ESoundDriver exception objects: ESoundDriverNotFound, ESoundDriverCorrupted, ESoundDriverOldVersion, ESoundDriverUnknownVersion You can request support for EAX. If EAX is requested and if there is enougth hardware buffer replay, then only hardware buffer are created when calling createBuffer. If the number of available hardware buffer is less than 10, then EAX is ignored. Definition at line 61 of file sound_driver.cpp. References buffer, NLSOUND::ISDRV_CREATE_PROC, NLSOUND::ISDRV_VERSION_PROC, nlinfo, and nlwarning.
00062 { 00063 ISDRV_CREATE_PROC createSoundDriver = NULL; 00064 ISDRV_VERSION_PROC versionDriver = NULL; 00065 00066 #ifdef NL_OS_WINDOWS 00067 00068 // WINDOWS code. 00069 HINSTANCE hInst; 00070 00071 hInst = LoadLibrary(NLSOUND_DLL_NAME); 00072 00073 if (!hInst) 00074 { 00075 throw ESoundDriverNotFound(); 00076 } 00077 00078 char buffer[1024], *ptr; 00079 SearchPath (NULL, NLSOUND_DLL_NAME, NULL, 1023, buffer, &ptr); 00080 nlinfo ("Using the library '"NLSOUND_DLL_NAME"' that is in the directory: '%s'", buffer); 00081 00082 createSoundDriver = (ISDRV_CREATE_PROC) GetProcAddress (hInst, IDRV_CREATE_PROC_NAME); 00083 if (createSoundDriver == NULL) 00084 { 00085 nlinfo( "Error: %u", GetLastError() ); 00086 throw ESoundDriverCorrupted(); 00087 } 00088 00089 versionDriver = (ISDRV_VERSION_PROC) GetProcAddress (hInst, IDRV_VERSION_PROC_NAME); 00090 if (versionDriver != NULL) 00091 { 00092 if (versionDriver()<ISoundDriver::InterfaceVersion) 00093 throw ESoundDriverOldVersion(); 00094 else if (versionDriver()>ISoundDriver::InterfaceVersion) 00095 throw ESoundDriverUnknownVersion(); 00096 } 00097 00098 #elif defined (NL_OS_UNIX) 00099 00100 // Unix code 00101 void *handle = dlopen(NLSOUND_DLL_NAME, RTLD_NOW); 00102 00103 if (handle == NULL) 00104 { 00105 nlwarning ("when loading dynamic library '%s': %s", NLSOUND_DLL_NAME, dlerror()); 00106 throw ESoundDriverNotFound(); 00107 } 00108 00109 /* Not ANSI. Might produce a warning */ 00110 createSoundDriver = (ISDRV_CREATE_PROC) dlsym (handle, IDRV_CREATE_PROC_NAME); 00111 if (createSoundDriver == NULL) 00112 { 00113 nlwarning ("when getting function in dynamic library '%s': %s", NLSOUND_DLL_NAME, dlerror()); 00114 throw ESoundDriverCorrupted(); 00115 } 00116 00117 versionDriver = (ISDRV_VERSION_PROC) dlsym (handle, IDRV_VERSION_PROC_NAME); 00118 if (versionDriver != NULL) 00119 { 00120 if (versionDriver()<ISoundDriver::InterfaceVersion) 00121 throw ESoundDriverOldVersion(); 00122 else if (versionDriver()>ISoundDriver::InterfaceVersion) 00123 throw ESoundDriverUnknownVersion(); 00124 } 00125 00126 #else // NL_OS_UNIX 00127 #error "Dynamic DLL loading not implemented!" 00128 #endif // NL_OS_UNIX 00129 00130 ISoundDriver *ret = createSoundDriver(useEax, stringMapper); 00131 if ( ret == NULL ) 00132 { 00133 throw ESoundDriverCantCreateDriver(); 00134 } 00135 return ret; 00136 } |
|
Create a sound buffer or a sound source.
Definition at line 289 of file sound_driver_al.cpp. References allocateNewItems(), compactAliveNames(), generateItems(), index, nlassert, NLSOUND::TGenFunctionAL, NLSOUND::TTestFunctionAL, and uint. Referenced by createBuffer(), and createSource().
00291 { 00292 NL_ALLOC_CONTEXT(NLSOUND_CSoundDriverAL); 00293 nlassert( index <= names.size() ); 00294 if ( index == names.size() ) 00295 { 00296 // Generate new items 00297 uint nbalive = compactAliveNames( names, altestfunc ); 00298 if ( nbalive == names.size() ) 00299 { 00300 // Extend vector of names 00301 allocateNewItems( algenfunc, altestfunc, names, index, allocrate ); 00302 } 00303 else 00304 { 00305 // Take the room of the deleted names 00306 nlassert( nbalive < names.size() ); 00307 index = nbalive; 00308 generateItems( algenfunc, altestfunc, names.size() - nbalive, &(names[nbalive]) ); 00309 } 00310 } 00311 00312 // Return the name of the item 00313 nlassert( index < names.size() ); 00314 ALuint itemname = names[index]; 00315 index++; 00316 return itemname; 00317 } |
|
Create the listener instance.
Implements NLSOUND::ISoundDriver. Definition at line 389 of file sound_driver_al.cpp. References nlassert.
00390 { 00391 NL_ALLOC_CONTEXT(NLSOUND_CSoundDriverAL); 00392 nlassert( CListenerAL::instance() == NULL ); 00393 return new CListenerAL(); 00394 } |
|
Create a source.
Implements NLSOUND::ISoundDriver. Definition at line 274 of file sound_driver_al.cpp. References _NbExpSources, _RolloffFactor, createItem(), ROLLOFF_FACTOR_DEFAULT, SOURCE_ALLOC_RATE, and NLSOUND::CSourceAL::sourceName().
00275 { 00276 NL_ALLOC_CONTEXT(NLSOUND_CSoundDriverAL); 00277 CSourceAL *sourceal = new CSourceAL( createItem( alGenSources, alIsSource, _Sources, _NbExpSources, SOURCE_ALLOC_RATE ) ); 00278 if ( _RolloffFactor != ROLLOFF_FACTOR_DEFAULT ) 00279 { 00280 alSourcef( sourceal->sourceName(), AL_ROLLOFF_FACTOR, _RolloffFactor ); 00281 } 00282 return sourceal; 00283 } |
|
Delete a buffer or a source.
Definition at line 372 of file sound_driver_al.cpp. References TestALError, and NLSOUND::TGenFunctionAL. Referenced by removeBuffer(), and removeSource().
00373 { 00374 vector<ALuint>::iterator ibn = find( names.begin(), names.end(), name ); 00375 if ( ibn == names.end() ) 00376 { 00377 return false; 00378 } 00379 aldeletefunc( 1, &*ibn ); 00380 *ibn = AL_NONE; 00381 TestALError(); 00382 return true; 00383 } |
|
Implements NLSOUND::ISoundDriver. Definition at line 122 of file sound_driver_al.h.
00122 { /* TODO */ }
|
|
Implements NLSOUND::ISoundDriver. Definition at line 121 of file sound_driver_al.h.
00121 { /* todo */ }
|
|
Generate nb buffers.
Definition at line 240 of file sound_driver_al.cpp. References NLSOUND::TGenFunctionAL, NLSOUND::ThrowGenException(), NLSOUND::TTestFunctionAL, and uint. Referenced by allocateNewItems(), and createItem().
00241 { 00242 algenfunc( nb, array ); 00243 00244 // Error handling 00245 if ( alGetError() != AL_NO_ERROR ) 00246 { 00247 ThrowGenException( algenfunc ); 00248 } 00249 00250 // Check buffers 00251 uint i; 00252 for ( i=0; i!=nb; i++ ) 00253 { 00254 if ( ! altestfunc( array[i] ) ) 00255 { 00256 ThrowGenException( algenfunc ); 00257 } 00258 } 00259 } |
|
Initialization.
Definition at line 162 of file sound_driver_al.cpp. References _Buffers, _NbExpBuffers, _NbExpSources, allocateNewItems(), INITIAL_BUFFERS, INITIAL_SOURCES, nlinfo, and TestALError.
00163 { 00164 // OpenAL initialization 00165 alutInit( NULL, NULL ); 00166 00167 // Display version information 00168 const ALubyte *alversion, *alrenderer, *alvendor, *alext; 00169 alversion = alGetString( AL_VERSION ); 00170 alrenderer = alGetString( AL_RENDERER ); 00171 alvendor = alGetString( AL_VENDOR ); 00172 alext = alGetString( AL_EXTENSIONS ); 00173 TestALError(); 00174 nlinfo( "Loading OpenAL lib: %s, %s, %s", alversion, alrenderer, alvendor ); 00175 nlinfo( "Listing extensions: %s", alext ); 00176 00177 #if EAX_AVAILABLE == 1 00178 // Set EAX environment if EAX is available 00179 if ( alIsExtensionPresent((ALubyte *)"EAX") == AL_TRUE ) // or EAX2.0 00180 { 00181 nlinfo( "Initializing EAX" ); 00182 EAXSetProp = (EAXSet)alGetProcAddress((ALubyte*)"EAXSet"); 00183 EAXGetProp = (EAXGet)alGetProcAddress((ALubyte*)"EAXGet"); 00184 if ( EAXSetProp != NULL ) 00185 { 00186 unsigned long ulEAXVal; 00187 long lGlobalReverb; 00188 lGlobalReverb = 0; 00189 EAXSetProp( &DSPROPSETID_EAX_ListenerProperties, DSPROPERTY_EAXLISTENER_ROOM, 0, &lGlobalReverb, sizeof(unsigned long) ); 00190 ulEAXVal = EAX_ENVIRONMENT_GENERIC; 00191 EAXSetProp( &DSPROPSETID_EAX_ListenerProperties, DSPROPERTY_EAXLISTENER_ENVIRONMENT, 0, &ulEAXVal, sizeof(unsigned long) ); 00192 } 00193 } 00194 else 00195 #endif 00196 { 00197 nlinfo( "EAX not available" ); 00198 } 00199 00200 // Choose the I3DL2 model (same as DirectSound3D) 00201 alDistanceModel( AL_INVERSE_DISTANCE_CLAMPED ); 00202 TestALError(); 00203 00204 // Initial buffers and sources allocation 00205 allocateNewItems( alGenBuffers, alIsBuffer, _Buffers, _NbExpBuffers, INITIAL_BUFFERS ); 00206 allocateNewItems( alGenSources, alIsSource, _Sources, _NbExpSources, INITIAL_SOURCES ); 00207 00208 return true; 00209 } |
|
Return the instance of the singleton.
Definition at line 99 of file sound_driver_al.h.
00099 { return _Instance; } |
|
Temp.
Definition at line 431 of file sound_driver_al.cpp. References NLSOUND::ALtoNLSoundFormat(), data, NLSOUND::IBuffer::fillBuffer(), format, NLSOUND::IBuffer::setFormat(), and size.
00432 { 00433 // Currently, the OpenAL UT headers are different between Windows and Linux versions 00434 #ifdef NL_OS_WINDOWS 00435 ALsizei size,freq; 00436 ALenum format; 00437 ALvoid *data; 00438 ALboolean loop; 00439 alutLoadWAVFile( const_cast<char*>(filename), &format, &data, &size, &freq, &loop ); // last arg in some al.h 00440 #else 00441 ALsizei bits; 00442 ALsizei size,freq; 00443 ALsizei format; 00444 ALvoid *data; 00445 alutLoadWAV( const_cast<char*>(filename), &data, &format, &size, &bits, &freq ); 00446 #endif 00447 if ( data == NULL ) 00448 { 00449 return false; 00450 } 00451 destbuffer->setFormat( ALtoNLSoundFormat(format), freq ); 00452 destbuffer->fillBuffer( data, size ); 00453 00454 string ext = CFile::getFilenameWithoutExtension(filename); 00455 // TODO static_cast<CBufferAL*>(destbuffer)->setName(ext); 00456 00457 #ifdef NL_OS_WINDOWS 00458 alutUnloadWAV(format,data,size,freq); // Where is it on Linux ?!? 00459 #endif 00460 return true; 00461 } |
|
Implements NLSOUND::ISoundDriver. Definition at line 118 of file sound_driver_al.h. References format, uint, uint32, and uint8.
00118 { /* todo */ return false; } |
|
Temp.
Implements NLSOUND::ISoundDriver. Definition at line 116 of file sound_driver_al.h.
00116 { /* todo*/ return false; } |
|
Remove a buffer.
Implements NLSOUND::ISoundDriver. Definition at line 344 of file sound_driver_al.cpp. References _Buffers, buffer, NLSOUND::CBufferAL::bufferName(), deleteItem(), nlassert, and nlwarning. Referenced by NLSOUND::CBufferAL::~CBufferAL().
00345 { 00346 nlassert( buffer != NULL ); 00347 CBufferAL *bufferAL = dynamic_cast<CBufferAL*>(buffer); 00348 if ( ! deleteItem( bufferAL->bufferName(), alDeleteBuffers, _Buffers ) ) 00349 { 00350 nlwarning( "Deleting buffer: name not found" ); 00351 } 00352 } |
|
Remove a source.
Implements NLSOUND::ISoundDriver. Definition at line 358 of file sound_driver_al.cpp. References deleteItem(), nlassert, nlwarning, and NLSOUND::CSourceAL::sourceName(). Referenced by NLSOUND::CSourceAL::~CSourceAL().
00359 { 00360 nlassert( source != NULL ); 00361 CSourceAL *sourceAL = dynamic_cast<CSourceAL*>(source); 00362 if ( ! deleteItem( sourceAL->sourceName(), alDeleteSources, _Sources ) ) 00363 { 00364 nlwarning( "Deleting source: name not found" ); 00365 } 00366 } |
|
Implements NLSOUND::ISoundDriver. Definition at line 120 of file sound_driver_al.h.
00120 { /* todo */ }
|
|
Write information about the driver to the output stream.
Implements NLSOUND::ISoundDriver. Definition at line 135 of file sound_driver_al.h.
00135 {} |
|
Definition at line 180 of file sound_driver_al.h. Referenced by createBuffer(), init(), removeBuffer(), and ~CSoundDriverAL(). |
|
Definition at line 123 of file sound_driver_al.cpp. |
|
Definition at line 186 of file sound_driver_al.h. Referenced by createBuffer(), and init(). |
|
Definition at line 189 of file sound_driver_al.h. Referenced by createSource(), and init(). |
|
Definition at line 192 of file sound_driver_al.h. Referenced by applyRolloffFactor(), and createSource(). |
|
Definition at line 183 of file sound_driver_al.h. |
|
Version of the driver interface. To increment when the interface change.
Definition at line 48 of file sound_driver.cpp. |