X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsoundmgr_openal.cxx;h=369adede161aa2852d3b544a2882958a730bcfa2;hb=c4b4c0ce59602a0b749e22b29d6ce5db6f654eae;hp=05651b75964f706b1e2ce6bab031f4cdbd0dc54c;hpb=3cd4c5566f8c418bc9bbb6026072eb0192027993;p=simgear.git diff --git a/simgear/sound/soundmgr_openal.cxx b/simgear/sound/soundmgr_openal.cxx index 05651b75..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 // @@ -69,7 +77,9 @@ SGSoundMgr::SGSoundMgr() : _geod_pos(SGGeod::fromCart(SGVec3d::zeros())), _velocity(SGVec3d::zeros()), _orientation(SGQuatd::zeros()), - _bad_doppler(false) + _bad_doppler(false), + _renderer("unknown"), + _vendor("unknown") { #if defined(ALUT_API_MAJOR_VERSION) && ALUT_API_MAJOR_VERSION >= 1 if (_alut_init == 0) { @@ -79,6 +89,8 @@ SGSoundMgr::SGSoundMgr() : } } _alut_init++; +#else + //#error ALUT 1.1 required, ALUT 1.0 is no longer supported, please upgrade #endif } @@ -108,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; @@ -158,10 +172,11 @@ void SGSoundMgr::init(const char *devname) { else break; } - string vendor = (const char *)alGetString(AL_VENDOR); - string renderer = (const char *)alGetString(AL_RENDERER); - if ( vendor != "OpenAL Community" || - (renderer != "Software" && renderer != "OpenAL Sample Implementation") + _vendor = (const char *)alGetString(AL_VENDOR); + _renderer = (const char *)alGetString(AL_RENDERER); + if ( (_vendor != "Adalin" && _vendor != "Apple Computer Inc.") && + (_vendor != "OpenAL Community" || (_renderer != "Software" && + _renderer != "OpenAL Sample Implementation")) ) { _bad_doppler = true; @@ -220,6 +235,9 @@ void SGSoundMgr::stop() { alcDestroyContext(_context); alcCloseDevice(_device); _context = NULL; + + _renderer = "unknown"; + _vendor = "unknown"; } } @@ -491,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"); + } } } @@ -547,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; - if (data == NULL) { - int error = alutGetError(); + 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; } @@ -568,7 +592,18 @@ bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt, ALenum error = alGetError(); if ( error != AL_NO_ERROR ) { string msg = "Failed to load wav file: "; - msg.append(alGetString(error)); + const ALchar *errorString = alGetString(error); + if (errorString) { + msg.append(errorString); + } else { + // alGetString returns NULL when an unexpected or OS specific error + // occurs: e.g. -43 on Mac when file is not found. + // In this case, alGetString() sets 'Invalid Enum' error, so + // showing with the original error number is helpful. + stringstream ss; + ss << alGetString(alGetError()) << "(" << error << ")"; + msg.append(ss.str()); + } throw sg_io_exception(msg.c_str(), sg_location(samplepath)); return false; }