From 250bab50893b0e0929521aa48779dbc382319bb1 Mon Sep 17 00:00:00 2001 From: curt Date: Sun, 28 Oct 2001 16:27:16 +0000 Subject: [PATCH] Initial revision of fg_fx.[ch]xx --- src/Sound/Makefile.am | 1 + src/Sound/fg_fx.cxx | 228 ++++++++++++++++++++++++++++++++++++++++++ src/Sound/fg_fx.hxx | 80 +++++++++++++++ 3 files changed, 309 insertions(+) create mode 100644 src/Sound/fg_fx.cxx create mode 100644 src/Sound/fg_fx.hxx diff --git a/src/Sound/Makefile.am b/src/Sound/Makefile.am index bbb3a7258..005885006 100644 --- a/src/Sound/Makefile.am +++ b/src/Sound/Makefile.am @@ -2,6 +2,7 @@ noinst_LIBRARIES = libSound.a libSound_a_SOURCES = \ beacon.cxx beacon.hxx \ + fg_fx.cxx fg_fx.hxx \ morse.cxx morse.hxx \ soundmgr.cxx soundmgr.hxx diff --git a/src/Sound/fg_fx.cxx b/src/Sound/fg_fx.cxx new file mode 100644 index 000000000..a060b311d --- /dev/null +++ b/src/Sound/fg_fx.cxx @@ -0,0 +1,228 @@ +// fgfx.cxx -- Sound effect management class implementation +// +// Started by David Megginson, October 2001 +// (Reuses some code from main.cxx, probably by Curtis Olson) +// +// Copyright (C) 2001 Curtis L. Olson - curt@flightgear.org +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ + +#include "fg_fx.hxx" + +// FIXME: remove direct dependencies +#include +#include +#include
+ + +FGFX::FGFX () + : _is_cranking(false), + _is_stalling(false), + _is_rumbling(false), + _engine(0), + _crank(0), + _wind(0), + _stall(0), + _rumble(0), + _flaps(0), + _squeal(0), + _click(0) +{ +} + +FGFX::~FGFX () +{ + // FIXME: is this right, or does the + // sound manager assume pointer ownership? + delete _engine; + delete _crank; + delete _wind; + delete _stall; + delete _rumble; + + delete _flaps; + delete _squeal; + delete _click; +} + + +void +FGFX::init () +{ + FGSoundMgr * mgr = globals->get_soundmgr(); + + // + // Create and add the engine sound + // + _engine = + new FGSimpleSound(fgGetString("/sim/sounds/engine", "Sounds/wasp.wav")); + mgr->add(_engine, "engine loop"); + 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. + // + _crank = + new FGSimpleSound(fgGetString("/sim/sounds/cranking", + "Sounds/cranking.wav")); + mgr->add(_crank, "crank"); + _crank->set_pitch(1.5); + _crank->set_volume(0.25); + + + // + // Create and add the wind noise. + // + _wind = + new FGSimpleSound(fgGetString("/sim/sounds/wind", "Sounds/wind.wav")); + mgr->add(_wind, "wind"); + mgr->play_looped("wind"); + + + // + // Create and add the stall noise. + // + _stall = new FGSimpleSound(fgGetString("/sim/sounds/stall", + "Sounds/stall.wav")); + mgr->add(_stall, "stall"); + + // + // Create and add the rumble noise. + // + _rumble = new FGSimpleSound(fgGetString("/sim/sounds/rumble", + "Sounds/rumble.wav")); + mgr->add(_rumble, "rumble"); + + // + // Create and add the squeal noise. + // + _squeal = new FGSimpleSound(fgGetString("/sim/sounds/squeal", + "Sounds/squeal.wav")); + mgr->add(_squeal, "squeal"); + + // + // Create and add the click noise. + _click = new FGSimpleSound(fgGetString("/sim/sounds/click", + "Sounds/click.wav")); + mgr->add(_click, "click"); +} + +void +FGFX::bind () +{ +} + +void +FGFX::unbind () +{ +} + +void +FGFX::update () +{ + FGSoundMgr * mgr = globals->get_soundmgr(); + + + //////////////////////////////////////////////////////////////////// + // Update the engine sound. + //////////////////////////////////////////////////////////////////// + + if (fgGetBool("/engines/engine[0]/running")) { // FIXME + // pitch corresponds to rpm + // volume corresponds to manifold pressure + + double rpm_factor; + if (cur_fdm_state->get_engine(0) != NULL) + rpm_factor = cur_fdm_state->get_engine(0)->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_engine(0) != NULL) + mp_factor = cur_fdm_state->get_engine(0)->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->set_pitch( pitch ); + _engine->set_volume( volume ); + } else { + _engine->set_pitch(0.0); + _engine->set_volume(0.0); + } + + + //////////////////////////////////////////////////////////////////// + // Update the cranking sound. + //////////////////////////////////////////////////////////////////// + + if (fgGetBool("/engines/engine[0]/cranking")) { // FIXME + if(!_is_cranking) { + 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. + //////////////////////////////////////////////////////////////////// + + float rel_wind = cur_fdm_state->get_V_rel_wind(); + float volume = rel_wind/300.0; // FIXME!!! + _wind->set_volume(volume); + + + // TODO: stall + + // TODO: rumble + + // TODO: flaps + + // TODO: squeal + + // TODO: click + +} + +// end of fg_fx.cxx diff --git a/src/Sound/fg_fx.hxx b/src/Sound/fg_fx.hxx new file mode 100644 index 000000000..b24825fcf --- /dev/null +++ b/src/Sound/fg_fx.hxx @@ -0,0 +1,80 @@ +// fgfx.hxx -- Sound effect management class +// +// Started by David Megginson, October 2001 +// (Reuses some code from main.cxx, probably by Curtis Olson) +// +// Copyright (C) 2001 Curtis L. Olson - curt@flightgear.org +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ + +#ifndef __FGFX_HXX +#define __FGFX_HXX 1 + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include
+#include
+ +#include "soundmgr.hxx" + + +/** + * Generator for FlightGear sound effects. + * + * This module uses FGSoundMgr to generate sound effects based + * on current flight conditions. The sound manager must be initialized + * before this object is. + */ +class FGFX : public FGSubsystem +{ + +public: + + FGFX (); + virtual ~FGFX (); + + virtual void init (); + virtual void bind (); + virtual void unbind (); + virtual void update (); + +private: + bool _is_cranking; + bool _is_stalling; + bool _is_rumbling; + + // looped sounds + FGSimpleSound * _engine; + FGSimpleSound * _crank; + FGSimpleSound * _wind; + FGSimpleSound * _stall; + FGSimpleSound * _rumble; + + // one-off sounds + FGSimpleSound * _flaps; + FGSimpleSound * _squeal; + FGSimpleSound * _click; + +}; + + +#endif + +// end of fgfx.hxx