X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsoundmgr_openal.cxx;h=97a1f05c4ff6e9c42606b9911f1a424b7721e0aa;hb=40fc2907a153093f830994519fc6ada40e21ae49;hp=16d9e7948f9c6ca8e08562d17430887ec688a0bd;hpb=da07871bc60569a02c1dd12aee754d5c85a55738;p=simgear.git diff --git a/simgear/sound/soundmgr_openal.cxx b/simgear/sound/soundmgr_openal.cxx index 16d9e794..97a1f05c 100644 --- a/simgear/sound/soundmgr_openal.cxx +++ b/simgear/sound/soundmgr_openal.cxx @@ -37,6 +37,7 @@ #include #include +#include #include "soundmgr_openal.hxx" @@ -46,6 +47,7 @@ #include using std::string; +using std::vector; extern bool isNaN(float *v); @@ -89,7 +91,7 @@ SGSoundMgr::SGSoundMgr() : } _alut_init++; #else - #error ALUT 1.1 required, ALUT 1.0 is no longer supported, please upgrade + //#error ALUT 1.1 required, ALUT 1.0 is no longer supported, please upgrade #endif } @@ -173,11 +175,11 @@ void SGSoundMgr::init(const char *devname) { _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")) - ) - { + + if (_vendor == "Creative Labs Inc.") { + _bad_doppler = true; + + } else if (_vendor == "OpenAL Community" && _renderer == "OpenAL Soft") { _bad_doppler = true; } @@ -437,11 +439,12 @@ void SGSoundMgr::release_source( unsigned int source ) ALint result; alGetSourcei( source, AL_SOURCE_STATE, &result ); - if ( result == AL_PLAYING ) + if ( result == AL_PLAYING ) { alSourceStop( source ); - testForALError("release source"); + } - alSourcei( source, AL_BUFFER, 0 ); + alSourcei( source, AL_BUFFER, 0 ); // detach the associated buffer + testForALError("release_source"); _free_sources.push_back( source ); _sources_in_use.erase( it ); } @@ -469,17 +472,23 @@ unsigned int SGSoundMgr::request_buffer(SGSoundSample *sample) if ( sample->is_file() ) { int freq, format; size_t size; - bool res; - - res = load(sample_name, &sample_data, &format, &size, &freq); - if (res == false) return buffer; + try { + bool res = load(sample_name, &sample_data, &format, &size, &freq); + if (res == false) return NO_BUFFER; + } catch (sg_exception& e) { + SG_LOG(SG_GENERAL, SG_ALERT, + "failed to load sound buffer:" << e.getFormattedMessage()); + return NO_BUFFER; + } + sample->set_frequency( freq ); sample->set_format( format ); sample->set_size( size ); - } - else + + } else { sample_data = sample->get_data(); + } // create an OpenAL buffer handle alGenBuffers(1, &buffer); @@ -491,37 +500,40 @@ unsigned int SGSoundMgr::request_buffer(SGSoundSample *sample) ALsizei freq = sample->get_frequency(); alBufferData( buffer, format, sample_data, size, freq ); - if ( sample->is_file() ) free(sample_data); - if ( !testForALError("buffer add data") ) { sample->set_buffer(buffer); _buffers[sample_name] = refUint(buffer); } } + + if ( sample->is_file() ) free(sample_data); } else { buffer = sample->get_buffer(); -} + } return buffer; } 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"); + } } } @@ -546,10 +558,7 @@ void SGSoundMgr::update_pos_and_orientation() { _at_up_vec[4] = sgv_up[1]; _at_up_vec[5] = sgv_up[2]; - // static const SGQuatd q(-0.5, -0.5, 0.5, 0.5); - // SGQuatd hlOr = SGQuatd::fromLonLat(SGGeod::fromCart(_base_pos)); - // SGQuatd ec2body = hlOr*_orientation; - _absolute_pos = _base_pos; // + ec2body.backTransform( _offset_pos ); + _absolute_pos = _base_pos; } bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt, @@ -605,6 +614,10 @@ bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt, } #endif + if (format == AL_FORMAT_STEREO8 || format == AL_FORMAT_STEREO16) { + throw sg_io_exception("Warning: STEREO files are not supported for 3D audio effects: " + samplepath); + } + *dbuf = (void *)data; *fmt = (int)format; *sz = (size_t)size;