From 4529449b83b6287891ec4416c19960d0b9c5d4fe Mon Sep 17 00:00:00 2001 From: curt Date: Mon, 10 Nov 2008 15:59:14 +0000 Subject: [PATCH] Incremental improvement of openal sound velocities. This should help stabilize some of the odd artifacts we were hearing, that were especially noticable in clean sound samples like the stall horn or the marker beacon codes. The change still preserves the doppler effect and maintains the good work of a previous developer figuring out how to align the model and listener velocity vectors correctly. --- src/Main/main.cxx | 66 +++++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/src/Main/main.cxx b/src/Main/main.cxx index 691996997..8d1baa707 100644 --- a/src/Main/main.cxx +++ b/src/Main/main.cxx @@ -208,6 +208,12 @@ static void fgMainLoop( void ) { = fgGetNode("/position/latitude-deg"); static SGConstPropertyNode_ptr altitude = fgGetNode("/position/altitude-ft"); + static SGConstPropertyNode_ptr vn_fps + = fgGetNode("/velocities/speed-north-fps"); + static SGConstPropertyNode_ptr ve_fps + = fgGetNode("/velocities/speed-east-fps"); + static SGConstPropertyNode_ptr vd_fps + = fgGetNode("/velocities/speed-down-fps"); static SGConstPropertyNode_ptr clock_freeze = fgGetNode("/sim/freeze/clock", true); static SGConstPropertyNode_ptr cur_time_override @@ -543,7 +549,7 @@ static void fgMainLoop( void ) { // aircraft is the source of all sounds and that all sounds are // positioned in the aircraft base - static sgdVec3 last_visitor_pos = {0, 0, 0}; + static sgdVec3 last_listener_pos = {0, 0, 0}; static sgdVec3 last_model_pos = {0, 0, 0}; // get the orientation @@ -574,20 +580,28 @@ static void fgMainLoop( void ) { acmodel_loc = (SGLocation *)globals-> get_aircraft_model()->get3DModel()->getSGLocation(); - // calculate speed of visitor and model + // Calculate speed of listener and model. This code assumes the + // listener is either tracking the model at the same speed or + // stationary. + sgVec3 listener_vel, model_vel; SGVec3d SGV3d_help; sgdVec3 sgdv3_help; sgdVec3 sgdv3_null = {0, 0, 0}; - sgdSubVec3( sgdv3_help, - last_visitor_pos, (double *)¤t_view->get_view_pos()); - sgdAddVec3( last_visitor_pos, sgdv3_null, (double *)¤t_view->get_view_pos()); - SGV3d_help = model_or.rotateBack( - surf_or.rotateBack(SGVec3d(sgdv3_help[0], - sgdv3_help[1], sgdv3_help[2]))); - sgSetVec3( listener_vel, SGV3d_help[0], SGV3d_help[1], SGV3d_help[2]); - + // the aircraft velocity as reported by the fdm (this will not + // vary or be affected by frame rates or timing jitter.) + sgVec3 fdm_vel_vec; + sgSetVec3( fdm_vel_vec, + vn_fps->getDoubleValue() * SG_FEET_TO_METER, + ve_fps->getDoubleValue() * SG_FEET_TO_METER, + vd_fps->getDoubleValue() * SG_FEET_TO_METER ); + double fdm_vel = sgLengthVec3(fdm_vel_vec); + + // compute the aircraft velocity vector and scale it to the length + // of the fdm velocity vector. This gives us a vector in the + // proper coordinate system, but also with the proper time + // invariant magnitude. sgdSubVec3( sgdv3_help, last_model_pos, acmodel_loc->get_absolute_view_pos()); sgdAddVec3( last_model_pos, sgdv3_null, acmodel_loc->get_absolute_view_pos()); @@ -596,24 +610,26 @@ static void fgMainLoop( void ) { sgdv3_help[1], sgdv3_help[2]))); sgSetVec3( model_vel, SGV3d_help[0], SGV3d_help[1], SGV3d_help[2]); - if (delta_time_sec > 0) { - sgScaleVec3( model_vel, 1 / delta_time_sec ); - sgScaleVec3( listener_vel, 1 / delta_time_sec ); + float vel = sgLengthVec3(model_vel); + if ( fabs(vel) > 0.0001 ) { + if ( fabs(fdm_vel / vel) > 0.0001 ) { + sgScaleVec3( model_vel, fdm_vel / vel ); + } } - // checking, if the listener pos has moved suddenly - if (sgLengthVec3(listener_vel) > 1000) - { - // check if the relative speed model vs listener has moved suddenly, too - sgVec3 delta_vel; - sgSubVec3(delta_vel, listener_vel, model_vel ); - if (sgLengthVec3(delta_vel) > 1000) - sgSetVec3(listener_vel, model_vel[0], model_vel[1], model_vel[2] ); // a sane value - else - globals->get_soundmgr()->set_listener_vel( listener_vel ); + // check for moving or stationary listener (view position) + sgdSubVec3( sgdv3_help, + last_listener_pos, (double *)¤t_view->get_view_pos()); + sgdAddVec3( last_listener_pos, + sgdv3_null, (double *)¤t_view->get_view_pos()); + + if ( sgdLengthVec3(sgdv3_help) > 0.00001 ) { + sgCopyVec3( listener_vel, model_vel ); + } else { + sgSetVec3( listener_vel, 0.0, 0.0, 0.0 ); } - else - globals->get_soundmgr()->set_listener_vel( listener_vel ); + + globals->get_soundmgr()->set_listener_vel( listener_vel ); // set positional offset for sources sgdVec3 dsource_pos_offset; -- 2.39.5