#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. |
1.3.6