From 0051bea03492f49de46ed8d88a48bef1ad9a8748 Mon Sep 17 00:00:00 2001 From: ehofman Date: Tue, 27 Oct 2009 12:10:42 +0000 Subject: [PATCH] small code reorganization and addition of debugging tests. --- simgear/sound/sample_group.cxx | 29 +++++++++++++++++++------ simgear/sound/sample_openal.cxx | 38 ++++++--------------------------- simgear/sound/sample_openal.hxx | 20 ++++++++++++----- 3 files changed, 43 insertions(+), 44 deletions(-) diff --git a/simgear/sound/sample_group.cxx b/simgear/sound/sample_group.cxx index 8bd5eb9b..63ae7197 100644 --- a/simgear/sound/sample_group.cxx +++ b/simgear/sound/sample_group.cxx @@ -29,6 +29,10 @@ #include "soundmgr_openal.hxx" #include "sample_group.hxx" +bool isNaN(float *v) { + return (isnan(v[0]) || isnan(v[1]) || isnan(v[2])); +} + SGSampleGroup::SGSampleGroup () : _smgr(NULL), _refname(""), @@ -359,15 +363,26 @@ void SGSampleGroup::update_sample_config( SGSoundSample *sample ) { if ( sample->is_valid_source() ) { unsigned int source = sample->get_source(); - if ( _tied_to_listener && _smgr->has_changed() ) { - alSourcefv( source, AL_POSITION, _smgr->get_position().data() ); - alSourcefv( source, AL_VELOCITY, _smgr->get_velocity().data() ); - alSourcefv( source, AL_DIRECTION, _smgr->get_direction().data() ); + float *position, *orientation, *velocity; + if ( _tied_to_listener ) { + position = _smgr->get_position().data(); + orientation = _smgr->get_velocity().data(); + velocity = _smgr->get_direction().data(); } else { - alSourcefv( source, AL_POSITION, sample->get_position() ); - alSourcefv( source, AL_VELOCITY, sample->get_velocity() ); - alSourcefv( source, AL_DIRECTION, sample->get_orientation() ); + sample->update_absolute_position(); + position = sample->get_position(); + orientation = sample->get_velocity(); + velocity = sample->get_orientation(); } + if (dist(_smgr->get_position(), sample->get_position_vec()) > 50000) + printf("source and listener distance greater than 50km!\n"); + if (isNaN(position)) printf("NaN in source position\n"); + if (isNaN(orientation)) printf("NaN in source orientation\n"); + if (isNaN(velocity)) printf("NaN in source velocity\n"); + + alSourcefv( source, AL_POSITION, position ); + alSourcefv( source, AL_VELOCITY, velocity ); + alSourcefv( source, AL_DIRECTION, orientation ); testForALError("position and orientation"); alSourcef( source, AL_PITCH, sample->get_pitch() ); diff --git a/simgear/sound/sample_openal.cxx b/simgear/sound/sample_openal.cxx index 451ece25..21f81a39 100644 --- a/simgear/sound/sample_openal.cxx +++ b/simgear/sound/sample_openal.cxx @@ -195,51 +195,24 @@ SGSoundSample::~SGSoundSample() { _data = NULL; } -void SGSoundSample::set_orientation( const SGQuatd& ori ) { - _orientation = ori; - update_absolute_position(); - _changed = true; -} - -void SGSoundSample::set_direction( const SGVec3d& dir ) { - _direction = dir; - update_absolute_position(); - _changed = true; -} - -void SGSoundSample::set_relative_position( const SGVec3f& pos ) { - _relative_pos = toVec3d(pos); - update_absolute_position(); - _changed = true; -} - -void SGSoundSample::set_position( const SGGeod& pos ) { - _base_pos = pos; - update_absolute_position(); - _changed = true; -} - void SGSoundSample::update_absolute_position() { - // SGQuatd orient = SGQuatd::fromLonLat(_base_pos) * _orientation; - // _orivec = -toVec3f(orient.rotate(-SGVec3d::e1())); - // The rotation rotating from the earth centerd frame to // the horizontal local frame SGQuatd hlOr = SGQuatd::fromLonLat(_base_pos); - // Compute the eyepoints orientation and position + // Compute the sounds orientation and position // wrt the earth centered frame - that is global coorinates - SGQuatd ec2body = hlOr*_orientation; + SGQuatd sc2body = _orientation*hlOr; // This is rotates the x-forward, y-right, z-down coordinate system where // simulation runs into the OpenGL camera system with x-right, y-up, z-back. SGQuatd q(-0.5, -0.5, 0.5, 0.5); - // The cartesian position of the basic view coordinate + // The cartesian position of the base sound coordinate SGVec3d position = SGVec3d::fromGeod(_base_pos); - _absolute_pos = position + (ec2body*q).backTransform(_relative_pos); - _orivec = toVec3f( (ec2body*q).backTransform(_direction) ); + _absolute_pos = position + (sc2body*q).backTransform(_relative_pos); + _orivec = toVec3f( (sc2body*q).backTransform(_direction) ); } string SGSoundSample::random_string() { @@ -252,3 +225,4 @@ string SGSoundSample::random_string() { return rstr; } + diff --git a/simgear/sound/sample_openal.hxx b/simgear/sound/sample_openal.hxx index 7042a70a..abef4c7b 100644 --- a/simgear/sound/sample_openal.hxx +++ b/simgear/sound/sample_openal.hxx @@ -303,13 +303,17 @@ public: * This is in the same coordinate system as OpenGL; y=up, z=back, x=right. * @param pos Relative position of this sound */ - void set_relative_position( const SGVec3f& pos ); + inline void set_relative_position( const SGVec3f& pos ) { + _relative_pos = toVec3d(pos); _changed = true; + } /** * Set the base position of this sound in Geodetic coordinates. * @param pos Geodetic position */ - void set_position( const SGGeod& pos ); + inline void set_position( const SGGeod& pos ) { + _base_pos = pos; _changed = true; + } /** * Get the absolute position of this sound. @@ -317,19 +321,24 @@ public: * @return Absolute position */ float *get_position() const { return toVec3f(_absolute_pos).data(); } + SGVec3f get_position_vec() const { return toVec3f(_absolute_pos); } /** * Set the orientation of this sound. * @param ori Quaternation containing the orientation information */ - void set_orientation( const SGQuatd& ori ); + inline void set_orientation( const SGQuatd& ori ) { + _orientation = ori; _changed = true; + } /** * Set direction of this sound relative to the orientation. * This is in the same coordinate system as OpenGL; y=up, z=back, x=right * @param dir Sound emission direction */ - void set_direction( const SGVec3d& dir ); + inline void set_direction( const SGVec3d& dir ) { + _direction = dir; _changed = true; + } /** * Define the audio cone parameters for directional audio. @@ -426,6 +435,8 @@ public: */ inline std::string get_sample_name() const { return _refname; } + void update_absolute_position(); + private: // Position of the source sound. @@ -472,7 +483,6 @@ private: bool _static_changed; bool _is_file; - void update_absolute_position(); string random_string(); }; -- 2.39.5