- FGSoundMgr * mgr = globals->get_soundmgr();
- int i;
-
- ////////////////////////////////////////////////////////////////////
- // Update the engine sound.
- ////////////////////////////////////////////////////////////////////
-
- for (i = 0; i < MAX_ENGINES; i++) {
-
- SGPropertyNode * node = fgGetNode("engines/engine", i, true);
-
- if (_engine_running_prop[i]->getBoolValue()) {
- // pitch corresponds to rpm
- // volume corresponds to manifold pressure
-
- double rpm_factor;
- rpm_factor = node->getDoubleValue("rpm") / 2500.0;
-
- double pitch = 0.3 + rpm_factor * 3.0;
-
- // don't run at absurdly slow rates -- not realistic
- // and sounds bad to boot. :-)
- if (pitch < 0.7)
- pitch = 0.7;
- if (pitch > 5.0)
- pitch = 5.0;
-
- double mp_factor;
- mp_factor = node->getDoubleValue("mp-osi") / 100;
-
- double volume = 0.15 + mp_factor / 2.0;
-
- if (volume < 0.15)
- volume = 0.15;
- if (volume > 0.5)
- volume = 0.5;
-
- _engine[i]->set_pitch( pitch );
- _engine[i]->set_volume( volume );
- set_playing(engine_names[i], true);
- } else {
- set_playing(engine_names[i], false);
- }
-
- // FIXME
- set_playing(crank_names[i], _engine_cranking_prop[i]->getBoolValue());
- }
-
-
- ////////////////////////////////////////////////////////////////////
- // Update the wind noise.
- ////////////////////////////////////////////////////////////////////
-
- // The wind sound is airspeed and altitude
- // dependent. The wind noise should become
- // silent at about 65000 feet, and is based
- // on a logarithmic scale.
- float rel_wind = cur_fdm_state->get_V_rel_wind(); // FPS
- float alt_vol = 1-log(cur_fdm_state->get_Altitude()/65000.0)/4.81;
- if ((rel_wind > 2.0) && (alt_vol > 0.2)) {
- float volume = rel_wind/937;
- double pitch = 1.0+(rel_wind/53.0);
- _wind->set_volume(volume*alt_vol/2);
- _wind->set_pitch(pitch);
- set_playing("wind", true);
- } else {
- set_playing("wind", false);
- }
-
-
- ////////////////////////////////////////////////////////////////////
- // Update the stall horn.
- ////////////////////////////////////////////////////////////////////
-
- double stall = _stall_warning_prop->getDoubleValue();
- double vc = _vc_prop->getDoubleValue();
- if (stall > 0.0 && vc > 30.0) {
- _stall->set_volume(stall);
- set_playing("stall", true);
- } else {
- set_playing("stall", false);
- }
-
-
- ////////////////////////////////////////////////////////////////////
- // Update the rumble.
- ////////////////////////////////////////////////////////////////////
-
- float gearOnGround = 0;
-
-
- // Calculate whether a squeal is
- // required, and set the volume.
- // Currently, the squeal volume is the
- // current local down velocity in feet
- // per second divided by 10.0, and
- // will not be played if under 0.1.
-
- // FIXME: take rotational velocities
- // into account as well.
- for (i = 0; i < MAX_GEAR; i++) {
- SGPropertyNode * node = fgGetNode("gear/gear", i, true);
- // cout << "air speed = " << cur_fdm_state->get_V_equiv_kts();
- // cout << " wheel " << i << " speed = " << _wheel_spin[i];
- if (node->getBoolValue("wow")) {
- gearOnGround++;
- if (!_gear_on_ground[i]) {
- // wheel just touched down
- // 3 parts horizontal velocity + 1 part vertical velocity
- double squeal_volume = 0.75 * cur_fdm_state->get_V_equiv_kts() / 90.0
- + 0.25 * cur_fdm_state->get_V_down() / 5.0;
-
- // scale volume by difference between wheel spin speed and
- // ground speed
- double diff = fabs( cur_fdm_state->get_V_equiv_kts()
- - _wheel_spin[i] );
- // cout << " speed diff = " << diff;
- double scale_factor = 0.0;
- if ( diff > 10 ) {
- scale_factor = ( diff - 10.0 ) / 30.0f;
- if ( scale_factor > 1.0 ) { scale_factor = 1.0; }
- }
- // cout << " scale_factor = " << scale_factor;
- squeal_volume *= scale_factor;
-
- if (squeal_volume > 0.1) {
- _squeal->set_volume(squeal_volume);
- _squeal->set_pitch(1.25);
- mgr->play_once("squeal");
- }
- _gear_on_ground[i] = true;
- }
- // cout << " wow";
- _wheel_spin[i] = cur_fdm_state->get_V_equiv_kts();
- } else {
- // cout << " airborn";
- _gear_on_ground[i] = false;
- /* fix me: wheel spindown is currently frame rate dependent which
- it shouldn't be */
- _wheel_spin[i] -= 0.2;
- if ( _wheel_spin[i] < 0.0 ) { _wheel_spin[i] = 0.0; }