X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FSound%2Ffg_fx.cxx;h=abf3a2678668dbb997b896c3010f629b5266e15d;hb=2bc7dc685b35b489730ef36050a318b331c14977;hp=5c60801d0d69038afc5749f5d364106467fcd8aa;hpb=7172d31e719a4daba4284047886c7d79d5b49061;p=flightgear.git diff --git a/src/Sound/fg_fx.cxx b/src/Sound/fg_fx.cxx index 5c60801d0..abf3a2678 100644 --- a/src/Sound/fg_fx.cxx +++ b/src/Sound/fg_fx.cxx @@ -1,9 +1,9 @@ -// fgfx.cxx -- Sound effect management class implementation +// fg_fx.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 +// Copyright (C) 2001 Curtis L. Olson - http://www.flightgear.org/~curt // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -17,212 +17,128 @@ // // 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. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ +#ifdef _MSC_VER +#pragma warning (disable: 4786) +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + #include "fg_fx.hxx" -// FIXME: remove direct dependencies -#include -#include #include
+#include +#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 ( SGSoundMgr *smgr, const string &refname ) : + last_pause( false ), + last_volume( 0.0 ), + _pause( fgGetNode("/sim/sound/pause") ), + _volume( fgGetNode("/sim/sound/volume") ) { + SGSampleGroup::_smgr = smgr; + SGSampleGroup::_refname = refname; + SGSampleGroup::_smgr->add(this, refname); + _avionics = _smgr->find("avionics", true); } + 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; + for (unsigned int i = 0; i < _sound.size(); i++ ) { + delete _sound[i]; + } + _sound.clear(); } void -FGFX::init () +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"); -} + SGPropertyNode *node = fgGetNode("/sim/sound", true); -void -FGFX::bind () -{ -} + string path_str = node->getStringValue("path"); + SGPath path( globals->get_fg_root() ); + if (path_str.empty()) { + SG_LOG(SG_GENERAL, SG_ALERT, "No path in /sim/sound/path"); + return; + } -void -FGFX::unbind () -{ + path.append(path_str.c_str()); + SG_LOG(SG_GENERAL, SG_INFO, "Reading sound " << node->getName() + << " from " << path.str()); + + SGPropertyNode root; + try { + readProperties(path.str(), &root); + } catch (const sg_exception &) { + SG_LOG(SG_GENERAL, SG_ALERT, + "Error reading file '" << path.str() << '\''); + return; + } + + node = root.getNode("fx"); + if(node) { + for (int i = 0; i < node->nChildren(); ++i) { + SGXmlSound *sound = new SGXmlSound(); + + try { + sound->init(globals->get_props(), node->getChild(i), this, + _avionics, globals->get_fg_root()); + + _sound.push_back(sound); + } catch ( sg_exception &e ) { + SG_LOG(SG_GENERAL, SG_ALERT, e.getFormattedMessage()); + delete sound; + } + } + } } + void -FGFX::update () +FGFX::reinit() { - // 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_num_engines() > 0 ) - rpm_factor = cur_fdm_state->get_engine(0)->get_RPM() / 2500.0; - else - rpm_factor = 1.0; + _sound.clear(); + init(); +}; - 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(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; +void +FGFX::update (double dt) +{ + bool new_pause = _pause->getBoolValue(); + if ( new_pause != last_pause ) { + if ( new_pause ) { + suspend(); + } else { + resume(); + } + last_pause = new_pause; } - } - - - //////////////////////////////////////////////////////////////////// - // 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 + if ( !new_pause ) { + double volume = _volume->getDoubleValue(); + if ( volume != last_volume ) { + set_volume( volume ); + last_volume = volume; + } - // TODO: rumble - - // TODO: flaps - - // TODO: squeal - - // TODO: click + // update sound effects if not paused + for ( unsigned int i = 0; i < _sound.size(); i++ ) { + _sound[i]->update(dt); + } + SGSampleGroup::update(dt); + } } // end of fg_fx.cxx