- FGSoundMgr * mgr = globals->get_soundmgr();
- int i;
-
- ////////////////////////////////////////////////////////////////////
- // Update the engine sound.
- ////////////////////////////////////////////////////////////////////
-
- for (i = 0; i < MAX_ENGINES; i++) {
-
- if (cur_fdm_state->get_num_engines() > 0 &&
- _engine_running_prop[i]->getBoolValue()) {
- // pitch corresponds to rpm
- // volume corresponds to manifold pressure
-
- double rpm_factor;
- if ( cur_fdm_state->get_num_engines() > 0 )
- rpm_factor = cur_fdm_state->get_engine(i)->get_RPM() / 2500.0;
- else
- rpm_factor = 1.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;
- if ( cur_fdm_state->get_num_engines() > 0 )
- mp_factor =
- cur_fdm_state->get_engine(i)->get_Manifold_Pressure() / 100;
- else
- mp_factor = 0.3;
-
- 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.
- ////////////////////////////////////////////////////////////////////
-
- float rel_wind = cur_fdm_state->get_V_rel_wind(); // FPS
- float airspeed_kt = cur_fdm_state->get_V_equiv_kts();
- if (rel_wind > 60.0) { // a little off 30kt
- // float volume = rel_wind/600.0; // FIXME!!!
- float volume = rel_wind/937.0; // FIXME!!!
- double pitch = 1.0+(airspeed_kt/113.0);
- _wind->set_volume(volume);
- _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 totalGear = min(cur_fdm_state->get_num_gear(), int(MAX_GEAR));
- 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 < totalGear; i++) {
- if (cur_fdm_state->get_gear_unit(i)->GetWoW()) {
- gearOnGround++;
- if (!_gear_on_ground[i]) {
- // 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;
- if (squeal_volume > 0.1) {
- _squeal->set_volume(squeal_volume);
- _squeal->set_pitch(1.25);
- mgr->play_once("squeal");
- }
- _gear_on_ground[i] = true;
- }
- } else {
- _gear_on_ground[i] = false;
- }
- }
-
- // Now, if any of the gear is in
- // contact with the ground play the
- // rumble sound. The volume is the
- // absolute velocity in knots divided
- // by 120.0. No rumble will be played
- // if the velocity is under 6kt.
- double speed = cur_fdm_state->get_V_equiv_kts();
- if (gearOnGround > 0 && speed >= 6.0) {
- double volume = 2.0 * (gearOnGround/totalGear) * (speed/60.0);
- _rumble->set_volume(volume);
- set_playing("rumble", true);
- } else {
- set_playing("rumble", false);
- }
-
-
- ////////////////////////////////////////////////////////////////////
- // Check for flap movement.
- ////////////////////////////////////////////////////////////////////
-
- double flap_position = _flaps_prop->getDoubleValue();
- if (fabs(flap_position - _old_flap_position) > 0.1) {
- mgr->play_once("flaps");
- _old_flap_position = flap_position;
- }
-
-
- ////////////////////////////////////////////////////////////////////
- // Check for gear movement.
- ////////////////////////////////////////////////////////////////////
-
- double gear_position = _gear_prop->getDoubleValue();
- if (gear_position != _old_gear_position) {
- if (gear_position < _old_gear_position) {
- mgr->play_once("gear-up");
- } else {
- mgr->play_once("gear-down");
- }
- _old_gear_position = gear_position;
- }
-
- // TODO: click
-