From 695616a8f272a050822e7d23d7920dd433aa21d6 Mon Sep 17 00:00:00 2001 From: Erik Hofman Date: Sun, 12 Apr 2020 14:50:12 +0200 Subject: [PATCH] Switch from doing the calculations ourselves in case of a bad_doppler implementation to using alDopplerFactor --- simgear/sound/CMakeLists.txt | 1 - simgear/sound/sample_group.cxx | 31 ++++---- simgear/sound/soundmgr.hxx | 15 +--- simgear/sound/soundmgr_aeonwave.cxx | 2 + simgear/sound/soundmgr_openal.cxx | 86 ++++++++++++++--------- simgear/sound/soundmgr_openal_private.hxx | 75 -------------------- 6 files changed, 71 insertions(+), 139 deletions(-) delete mode 100644 simgear/sound/soundmgr_openal_private.hxx diff --git a/simgear/sound/CMakeLists.txt b/simgear/sound/CMakeLists.txt index c63556bb..9fe490c5 100644 --- a/simgear/sound/CMakeLists.txt +++ b/simgear/sound/CMakeLists.txt @@ -24,7 +24,6 @@ if (USE_AEONWAVE) else() set(SOURCES ${SOURCES} soundmgr_openal.cxx - soundmgr_openal_private.hxx ) endif() diff --git a/simgear/sound/sample_group.cxx b/simgear/sound/sample_group.cxx index 0681e40e..3696f8b6 100644 --- a/simgear/sound/sample_group.cxx +++ b/simgear/sound/sample_group.cxx @@ -49,7 +49,7 @@ SGSampleGroup::~SGSampleGroup () { _active = false; stop(); - _smgr = 0; + _smgr = nullptr; } #include @@ -121,8 +121,8 @@ void SGSampleGroup::update( double dt ) { _changed = false; } - for (auto current =_samples.begin(); current !=_samples.end(); ++current) { - SGSoundSample *sample = current->second; + for (auto current : _samples) { + SGSoundSample *sample = current.second; if ( !sample->is_valid_source() && sample->is_playing() && !sample->test_out_of_range()) { start_playing_sample(sample); @@ -196,9 +196,8 @@ void SGSampleGroup::stop () { _pause = true; - for (auto current =_samples.begin(); current !=_samples.end(); ++current) { - SGSoundSample *sample = current->second; - _smgr->sample_destroy( sample ); + for (auto current : _samples) { + _smgr->sample_destroy( current.second ); } } @@ -208,12 +207,11 @@ SGSampleGroup::suspend () { if (_active && _pause == false) { _pause = true; - for (auto current =_samples.begin(); current !=_samples.end(); ++current) { #ifdef ENABLE_SOUND - SGSoundSample *sample = current->second; - _smgr->sample_suspend( sample ); -#endif + for (auto current : _samples) { + _smgr->sample_suspend( current.second ); } +#endif testForMgrError("suspend"); } } @@ -224,9 +222,8 @@ SGSampleGroup::resume () { if (_active && _pause == true) { #ifdef ENABLE_SOUND - for (auto current =_samples.begin(); current !=_samples.end(); ++current) { - SGSoundSample *sample = current->second; - _smgr->sample_resume( sample ); + for (auto current : _samples) { + _smgr->sample_resume( current.second ); } testForMgrError("resume"); #endif @@ -295,8 +292,8 @@ void SGSampleGroup::update_pos_and_orientation() { velocity = toVec3f( hlOr.backTransform(_velocity*SG_FEET_TO_METER) ); } - for (auto current =_samples.begin(); current !=_samples.end(); ++current ) { - SGSoundSample *sample = current->second; + for (auto current : _samples ) { + SGSoundSample *sample = current.second; sample->set_master_volume( _volume ); sample->set_orientation( _orientation ); sample->set_rotation( ec2body ); @@ -338,10 +335,6 @@ void SGSampleGroup::update_sample_config( SGSoundSample *sample ) velocity = sample->get_velocity(); } - if (_smgr->bad_doppler_effect()) { - velocity *= 100.0f; - } - #if 0 if (length(position) > 20000) printf("%s source and listener distance greater than 20km!\n", diff --git a/simgear/sound/soundmgr.hxx b/simgear/sound/soundmgr.hxx index 33fc9e2c..501e6270 100644 --- a/simgear/sound/soundmgr.hxx +++ b/simgear/sound/soundmgr.hxx @@ -41,7 +41,7 @@ // Speed of sound in meters per second -#define SPEED_OF_SOUND 340.3f +#define SPEED_OF_SOUND 340.3 // forward decls class SGSampleGroup; @@ -202,7 +202,7 @@ public: * * @param vel Sound velocity */ - void set_sound_velocity( float vel ) { _sound_velocity = vel; } + void set_sound_velocity( double vel ) { _sound_velocity = vel; } /** * Get a free OpenAL source-id @@ -299,14 +299,6 @@ public: */ inline bool has_changed() { return _changed; } - /** - * Some implementations seem to need the velocity multiplied by a - * factor of 100 to make them distinct. I've not found if this is - * a problem in the implementation or in out code. Until then - * this function is used to detect the problematic implementations. - */ - inline bool bad_doppler_effect() { return _bad_doppler; } - /** * Load a sample file and return it's configuration and data. * @@ -347,7 +339,7 @@ private: bool _changed = true; float _volume = 0.0f; - float _sound_velocity = SPEED_OF_SOUND; + double _sound_velocity = SPEED_OF_SOUND; // Position of the listener. SGGeod _geod_pos; @@ -355,7 +347,6 @@ private: // Velocity of the listener. SGVec3d _velocity = SGVec3d::zeros(); - bool _bad_doppler = false; std::string _renderer = "unknown"; std::string _vendor = "unknown"; std::string _device_name; diff --git a/simgear/sound/soundmgr_aeonwave.cxx b/simgear/sound/soundmgr_aeonwave.cxx index ae0ef3d0..6af3ffbb 100644 --- a/simgear/sound/soundmgr_aeonwave.cxx +++ b/simgear/sound/soundmgr_aeonwave.cxx @@ -298,6 +298,7 @@ void SGSoundMgr::update( double dt ) SGVec3d velocity = SGVec3d::zeros(); if ( _velocity[0] || _velocity[1] || _velocity[2] ) { velocity = hlOr.backTransform(_velocity*SG_FEET_TO_METER); +printf("lst vel: %f\n", length(velocity)); } aax::Vector vel( toVec3f(velocity).data() ); TRY( d->_aax.sensor_velocity(vel) ); @@ -619,6 +620,7 @@ void SGSoundMgr::update_sample_config( SGSoundSample *sample, SGVec3d& position, aax::Vector64 pos = position.data(); aax::Vector ori = orientation.data(); aax::Vector vel = velocity.data(); +printf("src vel: %f\n", length(velocity)); aax::Matrix64 mtx(pos, ori); TRY( emitter.matrix(mtx) ); diff --git a/simgear/sound/soundmgr_openal.cxx b/simgear/sound/soundmgr_openal.cxx index a9b43408..e7dd1abd 100644 --- a/simgear/sound/soundmgr_openal.cxx +++ b/simgear/sound/soundmgr_openal.cxx @@ -38,7 +38,6 @@ #include "soundmgr.hxx" #include "readwav.hxx" -#include "soundmgr_openal_private.hxx" #include "sample_group.hxx" #include @@ -46,6 +45,17 @@ #include #include +#if defined(__APPLE__) +# include +# include +#elif defined(OPENALSDK) +# include +# include +#else +# include +# include +#endif + using std::vector; @@ -64,10 +74,29 @@ using std::vector; # define AL_UNPACK_BLOCK_ALIGNMENT_SOFT 0x200C #endif + +struct refUint { + unsigned int refctr; + ALuint id; + + refUint() { refctr = 0; id = (ALuint)-1; }; + refUint(ALuint i) { refctr = 1; id = i; }; + ~refUint() {}; +}; + +using buffer_map = std::map < std::string, refUint >; +using sample_group_map = std::map < std::string, SGSharedPtr >; + +inline bool isNaN(float *v) { + return (SGMisc::isNaN(v[0]) || SGMisc::isNaN(v[1]) || SGMisc::isNaN(v[2])); +} + + class SGSoundMgr::SoundManagerPrivate { public: SoundManagerPrivate() = default; + ~SoundManagerPrivate() = default; void init() { @@ -112,6 +141,8 @@ public: // Orientation of the listener. // first 3 elements are "at" vector, second 3 are "up" vector ALfloat _at_up_vec[6]; + + bool _bad_doppler = false; sample_group_map _sample_groups; buffer_map _buffers; @@ -201,7 +232,7 @@ void SGSoundMgr::init() alListenerfv( AL_POSITION, SGVec3f::zeros().data() ); alListenerfv( AL_VELOCITY, SGVec3f::zeros().data() ); - alDopplerFactor(1.0); + alDopplerFactor(1.0f); alDopplerVelocity(_sound_velocity); // gain = AL_REFERENCE_DISTANCE / (AL_REFERENCE_DISTANCE + @@ -231,9 +262,11 @@ void SGSoundMgr::init() _renderer = (const char *)alGetString(AL_RENDERER); if (_vendor == "Creative Labs Inc.") { - _bad_doppler = true; + alDopplerFactor(100.0f); + d->_bad_doppler = true; } else if (_vendor == "OpenAL Community" && _renderer == "OpenAL Soft") { - _bad_doppler = true; + alDopplerFactor(100.0f); + d->_bad_doppler = true; } if (d->_free_sources.empty()) { @@ -264,10 +297,8 @@ void SGSoundMgr::activate() if ( is_working() ) { _active = true; - for ( auto current = d->_sample_groups.begin(); - current != d->_sample_groups.end(); ++current ) { - SGSampleGroup *sgrp = current->second; - sgrp->activate(); + for ( auto current : d->_sample_groups ) { + current.second->activate(); } } #endif @@ -278,10 +309,8 @@ void SGSoundMgr::stop() { #ifdef ENABLE_SOUND // first stop all sample groups - for ( auto current = d->_sample_groups.begin(); - current != d->_sample_groups.end(); ++current ) { - SGSampleGroup *sgrp = current->second; - sgrp->stop(); + for ( auto current : d->_sample_groups ) { + current.second->stop(); } // clear all OpenAL sources @@ -292,9 +321,8 @@ void SGSoundMgr::stop() d->_free_sources.clear(); // clear any OpenAL buffers before shutting down - for ( auto current = d->_buffers.begin(); - current != d->_buffers.begin(); ++current ) { - refUint ref = current->second; + for ( auto current : d->_buffers ) { + refUint ref = current.second; ALuint buffer = ref.id; alDeleteBuffers(1, &buffer); testForError("SGSoundMgr::stop: delete buffers"); @@ -320,10 +348,8 @@ void SGSoundMgr::suspend() { #ifdef ENABLE_SOUND if (is_working()) { - for ( auto current = d->_sample_groups.begin(); - current != d->_sample_groups.end(); ++current ) { - SGSampleGroup *sgrp = current->second; - sgrp->suspend(); + for ( auto current : d->_sample_groups ) { + current.second->suspend(); } _active = false; } @@ -334,10 +360,8 @@ void SGSoundMgr::resume() { #ifdef ENABLE_SOUND if (is_working()) { - for ( auto current = d->_sample_groups.begin(); - current != d->_sample_groups.end(); ++current ) { - SGSampleGroup *sgrp = current->second; - sgrp->resume(); + for ( auto current : d->_sample_groups ) { + current.second->resume(); } _active = true; } @@ -355,10 +379,8 @@ void SGSoundMgr::update( double dt ) d->update_pos_and_orientation(); } - for ( auto current = d->_sample_groups.begin(); - current != d->_sample_groups.end(); ++current ) { - SGSampleGroup *sgrp = current->second; - sgrp->update(dt); + for ( auto current : d->_sample_groups ) { + current.second->update(dt); } if (_changed) { @@ -376,19 +398,19 @@ if (isNaN(toVec3f(_velocity).data())) printf("NaN in listener velocity\n"); if ( _velocity[0] || _velocity[1] || _velocity[2] ) { velocity = hlOr.backTransform(_velocity*SG_FEET_TO_METER); - if ( _bad_doppler ) { - double fact = 100.0; - double mag = length( velocity*fact ); + if ( d->_bad_doppler ) { + float fact = 100.0f; + float mag = length( velocity ); if (mag > _sound_velocity) { fact *= _sound_velocity / mag; } - velocity *= fact; + alDopplerFactor(fact); } } alListenerfv( AL_VELOCITY, toVec3f(velocity).data() ); - alDopplerVelocity(_sound_velocity); +// alDopplerVelocity(_sound_velocity); testForError("update"); _changed = false; } diff --git a/simgear/sound/soundmgr_openal_private.hxx b/simgear/sound/soundmgr_openal_private.hxx deleted file mode 100644 index 81f4cef1..00000000 --- a/simgear/sound/soundmgr_openal_private.hxx +++ /dev/null @@ -1,75 +0,0 @@ -// soundmgr_openal_prviate.hxx -- Implementation details of the soung manager -// -// Sound manager initially written by David Findlay -// 2001 -// -// C++-ified by Curtis Olson, started March 2001. -// Modified for the new SoundSystem by Erik Hofman, October 2009 -// -// Copyright (C) 2001 Curtis L. Olson - http://www.flightgear.org/~curt -// Copyright (C) 2009 Erik Hofman -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software Foundation, -// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -// $Id$ - - -#ifndef _SG_SOUNDMGR_OPENAL_PRIVATE_HXX -#define _SG_SOUNDMGR_OPENAL_PRIVATE_HXX 1 - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include -#include - -#if defined(__APPLE__) -# include -# include -#elif defined(OPENALSDK) -# include -# include -#else -# include -# include -#endif - -#include -#include - -class SGSampleGroup; - -struct refUint { - unsigned int refctr; - ALuint id; - - refUint() { refctr = 0; id = (ALuint)-1; }; - refUint(ALuint i) { refctr = 1; id = i; }; - ~refUint() {}; -}; - -using buffer_map = std::map < std::string, refUint >; -using sample_group_map = std::map < std::string, SGSharedPtr >; - -inline bool isNaN(float *v) { - return (SGMisc::isNaN(v[0]) || SGMisc::isNaN(v[1]) || SGMisc::isNaN(v[2])); -} - -#endif // _SG_SOUNDMGR_OPENAL_PRIVATE_HXX - -