-
- // 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; }
- }
- // cout << endl;
- }
-
- // Now, if any of the gear is in
- // contact with the ground play the
- // rumble sound. The volume is a
- // logarthmic scale of the absolute
- // velocity in knots divided by 12.0.
- // No rumble will be played if the
- // velocity is under ~0.25 kt.
- double speed = cur_fdm_state->get_V_equiv_kts();
- if (gearOnGround > 0 && speed > 0.5) {
- double volume = 2.0 * (gearOnGround/MAX_GEAR) * log(speed)/12; //(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
-
-}
-
-
-void
-FGFX::set_playing (const char * soundName, bool state)
-{
- FGSoundMgr * mgr = globals->get_soundmgr();
- bool playing = mgr->is_playing(soundName);
- if (state && !playing)
- mgr->play_looped(soundName);
- else if (!state && playing)
- mgr->stop(soundName);