]> git.mxchange.org Git - flightgear.git/commitdiff
Incremental improvement of openal sound velocities. This should help
authorcurt <curt>
Mon, 10 Nov 2008 15:59:14 +0000 (15:59 +0000)
committercurt <curt>
Mon, 10 Nov 2008 15:59:14 +0000 (15:59 +0000)
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

index 691996997fceaca52841988d887337ef90881b73..8d1baa707cb01db5ac1332157e3c02cc36668d15 100644 (file)
@@ -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 *)&current_view->get_view_pos());
-    sgdAddVec3( last_visitor_pos, sgdv3_null, (double *)&current_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 *)&current_view->get_view_pos());
+    sgdAddVec3( last_listener_pos,
+               sgdv3_null, (double *)&current_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;