From 4cc17a7f6e84c4635f33f343175adc46f2afe507 Mon Sep 17 00:00:00 2001 From: ehofman Date: Sat, 26 Dec 2009 10:07:37 +0000 Subject: [PATCH 1/3] keep a pointer to the OpenAL vendor and renderer for reference --- simgear/sound/soundmgr_openal.cxx | 15 ++++++++++----- simgear/sound/soundmgr_openal.hxx | 8 ++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/simgear/sound/soundmgr_openal.cxx b/simgear/sound/soundmgr_openal.cxx index 05651b75..7b18d61f 100644 --- a/simgear/sound/soundmgr_openal.cxx +++ b/simgear/sound/soundmgr_openal.cxx @@ -69,7 +69,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) { @@ -158,10 +160,10 @@ 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 != "OpenAL Community" || + (_renderer != "Software" && _renderer != "OpenAL Sample Implementation") ) { _bad_doppler = true; @@ -220,6 +222,9 @@ void SGSoundMgr::stop() { alcDestroyContext(_context); alcCloseDevice(_device); _context = NULL; + + _renderer = "unknown"; + _vendor = "unknown"; } } diff --git a/simgear/sound/soundmgr_openal.hxx b/simgear/sound/soundmgr_openal.hxx index 2aa78bc5..9b9e0a12 100644 --- a/simgear/sound/soundmgr_openal.hxx +++ b/simgear/sound/soundmgr_openal.hxx @@ -289,6 +289,12 @@ public: */ vector get_available_devices(); + /** + * Get the current OpenAL vendor or rendering backend. + */ + const string& get_vendor() { return _vendor; } + const string& get_renderer() { return _renderer; } + private: static int _alut_init; @@ -321,6 +327,8 @@ private: vector _sources_in_use; bool _bad_doppler; + string _renderer; + string _vendor; bool testForALError(string s); bool testForALCError(string s); From 4950c96f1ce4888aac4382905201e35314b0ae83 Mon Sep 17 00:00:00 2001 From: ehofman Date: Tue, 29 Dec 2009 09:47:04 +0000 Subject: [PATCH 2/3] Rearrange alut error checking a bit --- simgear/sound/soundmgr_openal.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/simgear/sound/soundmgr_openal.cxx b/simgear/sound/soundmgr_openal.cxx index 7b18d61f..47b43748 100644 --- a/simgear/sound/soundmgr_openal.cxx +++ b/simgear/sound/soundmgr_openal.cxx @@ -554,8 +554,8 @@ bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt, ALfloat freqf; 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)); throw sg_io_exception(msg.c_str(), sg_location(samplepath)); From 56919ae45f300e1eebe231fa105547130360db98 Mon Sep 17 00:00:00 2001 From: ehofman Date: Mon, 4 Jan 2010 14:53:26 +0000 Subject: [PATCH 3/3] MacOS returns an unsopported AL error when a file is not found, work around this. --- simgear/sound/soundmgr_openal.cxx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/simgear/sound/soundmgr_openal.cxx b/simgear/sound/soundmgr_openal.cxx index 47b43748..a9db312e 100644 --- a/simgear/sound/soundmgr_openal.cxx +++ b/simgear/sound/soundmgr_openal.cxx @@ -573,7 +573,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; }