1
0
Fork 0

- added support for new sounds: flaps, wheel rumble, squeal

- cache property nodes to avoid hash lookups
This commit is contained in:
curt 2001-11-06 22:32:26 +00:00
parent 19a8dacdb4
commit bc20e9b490
2 changed files with 139 additions and 46 deletions

View file

@ -22,17 +22,14 @@
// $Id$ // $Id$
#include "fg_fx.hxx" #include "fg_fx.hxx"
#include <Main/fg_props.hxx>
// FIXME: remove direct dependencies // FIXME: remove direct dependencies
#include <Controls/controls.hxx>
#include <FDM/flight.hxx> #include <FDM/flight.hxx>
#include <Main/fg_props.hxx>
FGFX::FGFX () FGFX::FGFX ()
: _is_cranking(false), : _old_flap_position(0),
_is_stalling(false),
_is_rumbling(false),
_engine(0), _engine(0),
_crank(0), _crank(0),
_wind(0), _wind(0),
@ -40,7 +37,11 @@ FGFX::FGFX ()
_rumble(0), _rumble(0),
_flaps(0), _flaps(0),
_squeal(0), _squeal(0),
_click(0) _click(0),
_engine_running_prop(0),
_engine_cranking_prop(0),
_stall_warning_prop(0),
_flaps_prop(0)
{ {
} }
@ -70,33 +71,24 @@ FGFX::init ()
// //
_engine = _engine =
new FGSimpleSound(fgGetString("/sim/sounds/engine", "Sounds/wasp.wav")); new FGSimpleSound(fgGetString("/sim/sounds/engine", "Sounds/wasp.wav"));
mgr->add(_engine, "engine loop"); mgr->add(_engine, "engine");
mgr->play_looped("engine loop");
SG_LOG( SG_GENERAL, SG_INFO,
"Rate = " << _engine->get_sample()->getRate()
<< " Bps = " << _engine->get_sample()->getBps()
<< " Stereo = " << _engine->get_sample()->getStereo() );
// //
// Create and add the cranking sound. // Create and add the cranking sound.
// //
_crank = _crank = new FGSimpleSound(fgGetString("/sim/sounds/cranking",
new FGSimpleSound(fgGetString("/sim/sounds/cranking", "Sounds/cranking.wav"));
"Sounds/cranking.wav"));
mgr->add(_crank, "crank");
_crank->set_pitch(1.5); _crank->set_pitch(1.5);
_crank->set_volume(0.25); _crank->set_volume(0.25);
mgr->add(_crank, "crank");
// //
// Create and add the wind noise. // Create and add the wind noise.
// //
_wind = _wind = new FGSimpleSound(fgGetString("/sim/sounds/wind",
new FGSimpleSound(fgGetString("/sim/sounds/wind", "Sounds/wind.wav")); "Sounds/wind.wav"));
mgr->add(_wind, "wind"); mgr->add(_wind, "wind");
mgr->play_looped("wind");
// //
@ -113,6 +105,14 @@ FGFX::init ()
"Sounds/rumble.wav")); "Sounds/rumble.wav"));
mgr->add(_rumble, "rumble"); mgr->add(_rumble, "rumble");
//
// Create and add the flaps noise
//
_flaps = new FGSimpleSound(fgGetString("/sim/sounds/flaps",
"Sounds/flaps.wav"));
mgr->add(_flaps, "flaps");
// //
// Create and add the squeal noise. // Create and add the squeal noise.
// //
@ -125,6 +125,16 @@ FGFX::init ()
_click = new FGSimpleSound(fgGetString("/sim/sounds/click", _click = new FGSimpleSound(fgGetString("/sim/sounds/click",
"Sounds/click.wav")); "Sounds/click.wav"));
mgr->add(_click, "click"); mgr->add(_click, "click");
////////////////////////////////////////////////////////////////////
// Grab some properties.
////////////////////////////////////////////////////////////////////
_engine_running_prop = fgGetNode("/engines/engine[0]/running", true);
_engine_cranking_prop = fgGetNode("/engines/engine[0]/cranking", true);
_stall_warning_prop = fgGetNode("/sim/aircraft/alarms/stall-warning", true);
_flaps_prop = fgGetNode("/controls/flaps", true);
} }
void void
@ -140,14 +150,14 @@ FGFX::unbind ()
void void
FGFX::update () FGFX::update ()
{ {
// FGSoundMgr * mgr = globals->get_soundmgr(); FGSoundMgr * mgr = globals->get_soundmgr();
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Update the engine sound. // Update the engine sound.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
if (fgGetBool("/engines/engine[0]/running")) { // FIXME if (_engine_running_prop->getBoolValue()) {
// pitch corresponds to rpm // pitch corresponds to rpm
// volume corresponds to manifold pressure // volume corresponds to manifold pressure
@ -181,9 +191,9 @@ FGFX::update ()
_engine->set_pitch( pitch ); _engine->set_pitch( pitch );
_engine->set_volume( volume ); _engine->set_volume( volume );
set_playing("engine", true);
} else { } else {
_engine->set_pitch(0.0); set_playing("engine", false);
_engine->set_volume(0.0);
} }
@ -191,38 +201,110 @@ FGFX::update ()
// Update the cranking sound. // Update the cranking sound.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
if (fgGetBool("/engines/engine[0]/cranking")) { // FIXME // FIXME
if(!_is_cranking) { set_playing("crank", _engine_cranking_prop->getBoolValue());
globals->get_soundmgr()->play_looped("crank");
_is_cranking = true;
}
} else {
if(_is_cranking) {
globals->get_soundmgr()->stop("crank");
_is_cranking = false;
}
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Update the wind noise. // Update the wind noise.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
float rel_wind = cur_fdm_state->get_V_rel_wind(); float rel_wind = cur_fdm_state->get_V_rel_wind(); // FPS
float volume = rel_wind/300.0; // FIXME!!! if (rel_wind > 60.0) { // a little off 30kt
_wind->set_volume(volume); float volume = rel_wind/1200.0; // FIXME!!!
_wind->set_volume(volume);
set_playing("wind", true);
} else {
set_playing("wind", false);
}
// TODO: stall ////////////////////////////////////////////////////////////////////
// Update the stall horn.
////////////////////////////////////////////////////////////////////
// TODO: rumble double stall = _stall_warning_prop->getDoubleValue();
if (stall > 0.0) {
_stall->set_volume(stall);
set_playing("stall", true);
} else {
set_playing("stall", false);
}
// TODO: flaps
// TODO: squeal ////////////////////////////////////////////////////////////////////
// Update the rumble.
////////////////////////////////////////////////////////////////////
float totalGear = min(cur_fdm_state->get_num_gear(), 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 (int i = 0; i < totalGear; i++) {
if (cur_fdm_state->get_gear_unit(i)->GetWoW()) {
gearOnGround++;
if (!_gear_on_ground[i]) {
double squeal_volume = cur_fdm_state->get_V_down() / 5.0;
if (squeal_volume > 0.1) {
_squeal->set_volume(squeal_volume);
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 = (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;
}
// TODO: click // 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);
}
// end of fg_fx.cxx // end of fg_fx.cxx

View file

@ -56,9 +56,14 @@ public:
virtual void update (); virtual void update ();
private: private:
bool _is_cranking;
bool _is_stalling; void set_playing (const char * soundName, bool state = true);
bool _is_rumbling;
static const int MAX_GEAR = 20;
double _old_flap_position;
bool _gear_on_ground[MAX_GEAR];
// looped sounds // looped sounds
FGSimpleSound * _engine; FGSimpleSound * _engine;
@ -72,6 +77,12 @@ private:
FGSimpleSound * _squeal; FGSimpleSound * _squeal;
FGSimpleSound * _click; FGSimpleSound * _click;
// Cached property nodes.
const SGPropertyNode * _engine_running_prop;
const SGPropertyNode * _engine_cranking_prop;
const SGPropertyNode * _stall_warning_prop;
const SGPropertyNode * _flaps_prop;
}; };