X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FSound%2Ffg_fx.cxx;h=d3a050426b62c903b35a230c72520b2f493ebbc3;hb=e88e821567cc6bb6214fa0b9ee13b52e74b24ffa;hp=c8c6b49f383173f27de8d02005c6e0ab30cea742;hpb=ebcc6359b97a64321226a8ed37cf1fce9d1c14d9;p=flightgear.git diff --git a/src/Sound/fg_fx.cxx b/src/Sound/fg_fx.cxx index c8c6b49f3..d3a050426 100644 --- a/src/Sound/fg_fx.cxx +++ b/src/Sound/fg_fx.cxx @@ -32,6 +32,7 @@ #include "fg_fx.hxx" #include
+#include
#include #include @@ -39,29 +40,49 @@ #include #include -FGFX::FGFX ( SGSoundMgr *smgr, const string &refname, SGPropertyNode *props ) : - _props( props ), - _enabled( fgGetNode("/sim/sound/effects/enabled", true) ), - _volume( fgGetNode("/sim/sound/effects/volume", true) ) +FGFX::FGFX ( const std::string &refname, SGPropertyNode *props ) : + _props( props ) { - if (!props) _props = globals->get_props(); + if (!props) { + _is_aimodel = false; + _props = globals->get_props(); + _enabled = fgGetNode("/sim/sound/effects/enabled", true); + _volume = fgGetNode("/sim/sound/effects/volume", true); + } else { + _is_aimodel = true; + _enabled = _props->getNode("/sim/sound/aimodels/enabled", true); + _enabled->setBoolValue(fgGetBool("/sim/sound/effects/enabled")); + _volume = _props->getNode("/sim/sound/aimodels/volume", true); + _volume->setFloatValue(fgGetFloat("/sim/sound/effects/volume")); + } _avionics_enabled = _props->getNode("sim/sound/avionics/enabled", true); _avionics_volume = _props->getNode("sim/sound/avionics/volume", true); _avionics_ext = _props->getNode("sim/sound/avionics/external-view", true); _internal = _props->getNode("sim/current-view/internal", true); - SGSampleGroup::_smgr = smgr; - SGSampleGroup::_refname = refname; - SGSampleGroup::_smgr->add(this, refname); + _smgr = globals->get_soundmgr(); + if (!_smgr) { + return; + } + + _refname = refname; + _smgr->add(this, refname); - if (_avionics_enabled->getBoolValue()) + if (!_is_aimodel) { _avionics = _smgr->find("avionics", true); _avionics->tie_to_listener(); } } +void FGFX::unbind() +{ + if (_smgr) + { + _smgr->remove(_refname); + } +} FGFX::~FGFX () { @@ -75,15 +96,25 @@ FGFX::~FGFX () void FGFX::init() { + if (!_smgr) { + return; + } + SGPropertyNode *node = _props->getNode("sim/sound", true); - string path_str = node->getStringValue("path"); + std::string path_str = node->getStringValue("path"); if (path_str.empty()) { SG_LOG(SG_SOUND, SG_ALERT, "No path in sim/sound/path"); return; } SGPath path = globals->resolve_aircraft_path(path_str); + if (path.isNull()) + { + SG_LOG(SG_SOUND, SG_ALERT, + "File not found: '" << path_str); + return; + } SG_LOG(SG_SOUND, SG_INFO, "Reading sound " << node->getName() << " from " << path.str()); @@ -99,16 +130,15 @@ FGFX::init() node = root.getNode("fx"); if(node) { for (int i = 0; i < node->nChildren(); ++i) { - SGXmlSound *sound = new SGXmlSound(); + SGXmlSound *soundfx = new SGXmlSound(); try { - sound->init(globals->get_props(), node->getChild(i), this, - _avionics, path.dir()); - - _sound.push_back(sound); + soundfx->init( _props, node->getChild(i), this, _avionics, + path.dir() ); + _sound.push_back( soundfx ); } catch ( sg_exception &e ) { SG_LOG(SG_SOUND, SG_ALERT, e.getFormattedMessage()); - delete sound; + delete soundfx; } } } @@ -123,29 +153,28 @@ FGFX::reinit() } _sound.clear(); init(); -}; +} void FGFX::update (double dt) { - bool active = _avionics_ext->getBoolValue() || - _internal->getBoolValue(); - - if (_avionics_enabled->getBoolValue()) { - if (!_avionics) { - _avionics = _smgr->find("avionics", true); - _avionics->tie_to_listener(); - } - - if ( active ) - _avionics->resume(); // no-op if already in resumed state - else - _avionics->suspend(); - _avionics->set_volume( _avionics_volume->getFloatValue() ); + if (!_smgr) { + return; } - + if ( _enabled->getBoolValue() ) { + if ( _avionics_enabled->getBoolValue()) + { + if (_avionics_ext->getBoolValue() || _internal->getBoolValue()) { + // avionics sound is enabled + _avionics->resume(); // no-op if already in resumed state + _avionics->set_volume( _avionics_volume->getFloatValue() ); + } + else + _avionics->suspend(); + } + set_volume( _volume->getDoubleValue() ); resume();