X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsoundmgr_openal.cxx;h=6066a560c32d1d22cc49679b387171fe0a8807d9;hb=afb18ca75b90e5a2e0bf791ba2e38812128ab0a8;hp=9a49d547b5c285bd31b56c2a7d3537657aacbfc5;hpb=796427092998420fc2dd9dab8a12724479f27aab;p=simgear.git diff --git a/simgear/sound/soundmgr_openal.cxx b/simgear/sound/soundmgr_openal.cxx index 9a49d547..6066a560 100644 --- a/simgear/sound/soundmgr_openal.cxx +++ b/simgear/sound/soundmgr_openal.cxx @@ -45,6 +45,7 @@ #include #include +extern bool isNaN(float *v); #define MAX_SOURCES 128 @@ -62,7 +63,9 @@ SGSoundMgr::SGSoundMgr() : _volume(0.0), _device(NULL), _context(NULL), - _position(SGVec3d::zeros()), + _absolute_pos(SGVec3d::zeros()), + _offset_pos(SGVec3d::zeros()), + _base_pos(SGVec3d::zeros()), _velocity(SGVec3d::zeros()), _orientation(SGQuatd::zeros()), _devname(NULL) @@ -94,7 +97,6 @@ SGSoundMgr::~SGSoundMgr() { // initialize the sound manager void SGSoundMgr::init() { -printf("Initializing OpenAL sound manager\n"); SG_LOG( SG_GENERAL, SG_INFO, "Initializing OpenAL sound manager" ); ALCdevice *device = alcOpenDevice(_devname); @@ -131,11 +133,9 @@ printf("Initializing OpenAL sound manager\n"); alDopplerFactor(1.0); alDopplerVelocity(340.3); // speed of sound in meters per second. - if ( alIsExtensionPresent((const ALchar*)"EXT_exponent_distance") ) { - alDistanceModel(AL_EXPONENT_DISTANCE); - } else { - alDistanceModel(AL_INVERSE_DISTANCE); - } + // gain = AL_REFERENCE_DISTANCE / (AL_REFERENCE_DISTANCE + + // AL_ROLLOFF_FACTOR * (distance - AL_REFERENCE_DISTANCE)); + alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED); testForALError("listener initialization"); @@ -174,7 +174,6 @@ void SGSoundMgr::activate() { // stop the sound manager void SGSoundMgr::stop() { if (_working) { -printf("Stopping Sound Manager\n"); _working = false; _active = false; @@ -197,7 +196,6 @@ printf("Stopping Sound Manager\n"); void SGSoundMgr::suspend() { if (_working) { -printf("SoundManager suspend\n"); sample_group_map_iterator sample_grp_current = _sample_groups.begin(); sample_group_map_iterator sample_grp_end = _sample_groups.end(); for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) { @@ -210,7 +208,6 @@ printf("SoundManager suspend\n"); void SGSoundMgr::resume() { if (_working) { -printf("SoundManager resume\n"); sample_group_map_iterator sample_grp_current = _sample_groups.begin(); sample_group_map_iterator sample_grp_end = _sample_groups.end(); for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) { @@ -223,7 +220,6 @@ printf("SoundManager resume\n"); void SGSoundMgr::bind () { -printf("SoundManager bind\n"); _free_sources.clear(); _free_sources.reserve( MAX_SOURCES ); _sources_in_use.clear(); @@ -233,7 +229,6 @@ printf("SoundManager bind\n"); void SGSoundMgr::unbind () { -printf("SoundManager unbind\n"); _sample_groups.clear(); // delete free sources @@ -247,8 +242,12 @@ printf("SoundManager unbind\n"); } // run the audio scheduler -void SGSoundMgr::update_late( double dt ) { +void SGSoundMgr::update( double dt ) { if (_active) { + if (_changed) { + update_pos_and_orientation(); + } + sample_group_map_iterator sample_grp_current = _sample_groups.begin(); sample_group_map_iterator sample_grp_end = _sample_groups.end(); for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) { @@ -257,10 +256,15 @@ void SGSoundMgr::update_late( double dt ) { } if (_changed) { +#if 0 +if (isNaN(_at_up_vec)) printf("NaN in listener orientation\n"); +if (isNaN(toVec3f(_absolute_pos).data())) printf("NaN in listener position\n"); +if (isNaN(_velocity.data())) printf("NaN in listener velocity\n"); +#endif alListenerf( AL_GAIN, _volume ); alListenerfv( AL_ORIENTATION, _at_up_vec ); - alListenerfv( AL_POSITION, toVec3f(_position).data() ); - alListenerfv( AL_VELOCITY, toVec3f(_velocity).data() ); + // alListenerfv( AL_POSITION, toVec3f(_absolute_pos).data() ); + alListenerfv( AL_VELOCITY, _velocity.data() ); // alDopplerVelocity(340.3); // TODO: altitude dependent testForALError("update"); _changed = false; @@ -319,6 +323,7 @@ SGSampleGroup *SGSoundMgr::find( const string &refname, bool create ) { // sample group was not found. if (create) { SGSampleGroup* sgrp = new SGSampleGroup(this, refname); + add( sgrp, refname ); return sgrp; } else @@ -337,32 +342,6 @@ void SGSoundMgr::set_volume( float v ) _changed = true; } -/** - * set the orientation of the listener (in opengl coordinates) - * - * Description: ORIENTATION is a pair of 3-tuples representing the - * 'at' direction vector and 'up' direction of the Object in - * Cartesian space. AL expects two vectors that are orthogonal to - * each other. These vectors are not expected to be normalized. If - * one or more vectors have zero length, implementation behavior - * is undefined. If the two vectors are linearly dependent, - * behavior is undefined. - */ -void SGSoundMgr::set_orientation( SGQuatd ori ) -{ - _orientation = ori; - - SGVec3d sgv_up = ori.rotate(SGVec3d::e2()); - SGVec3d sgv_at = ori.rotate(SGVec3d::e3()); - _at_up_vec[0] = sgv_at[0]; - _at_up_vec[1] = sgv_at[1]; - _at_up_vec[2] = sgv_at[2]; - _at_up_vec[3] = sgv_up[0]; - _at_up_vec[4] = sgv_up[1]; - _at_up_vec[5] = sgv_up[2]; - _changed = true; -} - // Get an unused source id // // The Sound Manager should keep track of the sources in use, the distance @@ -381,6 +360,8 @@ unsigned int SGSoundMgr::request_source() _free_sources.pop_back(); _sources_in_use.push_back(source); } + else + SG_LOG( SG_GENERAL, SG_INFO, "No more free sources available\n"); return source; } @@ -429,10 +410,7 @@ unsigned int SGSoundMgr::request_buffer(SGSoundSample *sample) void *data; load(sample_name, &data, &format, &size, &freq); - std::auto_ptr ptr; - ptr.reset((unsigned char *)data); - - sample->set_data( ptr ); + sample->set_data( &data ); sample->set_frequency( freq ); sample->set_format( format ); sample->set_size( size ); @@ -460,8 +438,9 @@ unsigned int SGSoundMgr::request_buffer(SGSoundSample *sample) } } } - else + else { buffer = sample->get_buffer(); +} return buffer; } @@ -485,6 +464,33 @@ void SGSoundMgr::release_buffer(SGSoundSample *sample) } } +void SGSoundMgr::update_pos_and_orientation() { + /** + * Description: ORIENTATION is a pair of 3-tuples representing the + * 'at' direction vector and 'up' direction of the Object in + * Cartesian space. AL expects two vectors that are orthogonal to + * each other. These vectors are not expected to be normalized. If + * one or more vectors have zero length, implementation behavior + * is undefined. If the two vectors are linearly dependent, + * behavior is undefined. + * + * This is in the same coordinate system as OpenGL; y=up, z=back, x=right. + */ + SGVec3d sgv_at = _orientation.backTransform(-SGVec3d::e3()); + SGVec3d sgv_up = _orientation.backTransform(SGVec3d::e2()); + _at_up_vec[0] = sgv_at[0]; + _at_up_vec[1] = sgv_at[1]; + _at_up_vec[2] = sgv_at[2]; + _at_up_vec[3] = sgv_up[0]; + _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 ); +} + bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt, size_t *sz, int *frq ) {