X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsoundmgr_openal.cxx;h=369adede161aa2852d3b544a2882958a730bcfa2;hb=c4b4c0ce59602a0b749e22b29d6ce5db6f654eae;hp=a9db312ea9a5dd5e2c8957df21f0e04af17f6f53;hpb=430c60ed1ac8d1c1ee79cdd45f6540d6dc8a5996;p=simgear.git diff --git a/simgear/sound/soundmgr_openal.cxx b/simgear/sound/soundmgr_openal.cxx index a9db312e..369adede 100644 --- a/simgear/sound/soundmgr_openal.cxx +++ b/simgear/sound/soundmgr_openal.cxx @@ -30,13 +30,14 @@ #endif #if defined( __APPLE__ ) -# include +# include #else # include #endif #include #include +#include #include "soundmgr_openal.hxx" @@ -45,10 +46,17 @@ #include #include +using std::string; + extern bool isNaN(float *v); #define MAX_SOURCES 128 + +#ifndef ALC_ALL_DEVICES_SPECIFIER +# define ALC_ALL_DEVICES_SPECIFIER 0x1013 +#endif + // // Sound Manager // @@ -81,6 +89,8 @@ SGSoundMgr::SGSoundMgr() : } } _alut_init++; +#else + //#error ALUT 1.1 required, ALUT 1.0 is no longer supported, please upgrade #endif } @@ -110,7 +120,9 @@ void SGSoundMgr::init(const char *devname) { } } + _device = device; ALCcontext *context = alcCreateContext(device, NULL); + testForALCError("context creation."); if ( testForError(context, "Unable to create a valid context.") ) { alcCloseDevice (device); return; @@ -162,8 +174,9 @@ void SGSoundMgr::init(const char *devname) { _vendor = (const char *)alGetString(AL_VENDOR); _renderer = (const char *)alGetString(AL_RENDERER); - if ( _vendor != "OpenAL Community" || - (_renderer != "Software" && _renderer != "OpenAL Sample Implementation") + if ( (_vendor != "Adalin" && _vendor != "Apple Computer Inc.") && + (_vendor != "OpenAL Community" || (_renderer != "Software" && + _renderer != "OpenAL Sample Implementation")) ) { _bad_doppler = true; @@ -496,20 +509,23 @@ unsigned int SGSoundMgr::request_buffer(SGSoundSample *sample) void SGSoundMgr::release_buffer(SGSoundSample *sample) { - string sample_name = sample->get_sample_name(); - buffer_map_iterator buffer_it = _buffers.find( sample_name ); - if ( buffer_it == _buffers.end() ) { - // buffer was not found - return; - } + if ( !sample->is_queue() ) + { + string sample_name = sample->get_sample_name(); + buffer_map_iterator buffer_it = _buffers.find( sample_name ); + if ( buffer_it == _buffers.end() ) { + // buffer was not found + return; + } - sample->no_valid_buffer(); - buffer_it->second.refctr--; - if (buffer_it->second.refctr == 0) { - ALuint buffer = buffer_it->second.id; - alDeleteBuffers(1, &buffer); - _buffers.erase( buffer_it ); - testForALError("release buffer"); + sample->no_valid_buffer(); + buffer_it->second.refctr--; + if (buffer_it->second.refctr == 0) { + ALuint buffer = buffer_it->second.id; + alDeleteBuffers(1, &buffer); + _buffers.erase( buffer_it ); + testForALError("release buffer"); + } } } @@ -552,12 +568,15 @@ bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt, #if defined(ALUT_API_MAJOR_VERSION) && ALUT_API_MAJOR_VERSION >= 1 ALfloat freqf; + // ignore previous errors to prevent the system from halting on silly errors + alGetError(); + alcGetError(_device); data = alutLoadMemoryFromFile(samplepath.c_str(), &format, &size, &freqf ); freq = (ALsizei)freqf; int error = alutGetError(); if (data == NULL || error != ALUT_ERROR_NO_ERROR) { string msg = "Failed to load wav file: "; - msg.append(alutGetErrorString(error)); + msg.append(alutGetErrorString(error)); throw sg_io_exception(msg.c_str(), sg_location(samplepath)); return false; }