X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FSound%2Ffg_fx.cxx;h=ab0ace0a94d059f693996f9e43599904babd21aa;hb=438e365aadc321f70941a31a0b9462b4b0155fd6;hp=6b1a16eb3e897410b9d415926a4f6f0eba0892c5;hpb=df472fe0f5542d570feab42ce9ac1076a07419eb;p=flightgear.git diff --git a/src/Sound/fg_fx.cxx b/src/Sound/fg_fx.cxx index 6b1a16eb3..ab0ace0a9 100644 --- a/src/Sound/fg_fx.cxx +++ b/src/Sound/fg_fx.cxx @@ -3,7 +3,7 @@ // 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,7 +17,7 @@ // // 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$ @@ -25,90 +25,120 @@ #pragma warning (disable: 4786) #endif -#include -#include -#ifdef __BORLANDC__ -# define exception c_exception +#ifdef HAVE_CONFIG_H +# include #endif -#include -#include -#include - -#include
#include "fg_fx.hxx" +#include
-FGFX::FGFX () +#include +#include +#include +#include + +FGFX::FGFX ( SGSoundMgr *smgr, const string &refname ) : + _enabled( fgGetNode("/sim/sound/effects/enabled", true) ), + _volume( fgGetNode("/sim/sound/effects/volume", true) ), + _avionics_enabled( fgGetNode("/sim/sound/avionics/enabled", true) ), + _avionics_volume( fgGetNode("/sim/sound/avionics/volume", true) ), + _avionics_external( fgGetNode("/sim/sound/avionics/external-view", true) ), + _internal( fgGetNode("/sim/current-view/internal", true) ) { + SGSampleGroup::_smgr = smgr; + SGSampleGroup::_refname = refname; + SGSampleGroup::_smgr->add(this, refname); + _avionics = _smgr->find("avionics", true); + _avionics->tie_to_listener(); } + FGFX::~FGFX () { - _sound.clear(); + for (unsigned int i = 0; i < _sound.size(); i++ ) { + delete _sound[i]; + } + _sound.clear(); } + void FGFX::init() { - SGPropertyNode * node = fgGetNode("/sim/sound", true); - int i; - - string path_str = node->getStringValue("path"); - SGPath path( globals->get_fg_root() ); - if (path_str.empty()) { - SG_LOG(SG_GENERAL, SG_ALERT, "Incorrect path in configuration file."); - return; - } - - 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 &e) { - SG_LOG(SG_GENERAL, SG_ALERT, - "Incorrect path specified in configuration file"); - return; - } - - node = root.getNode("fx"); - for (i = 0; i < node->nChildren(); i++) { - SGXmlSound *sound = new SGXmlSound(); - - sound->init(globals->get_props(), node->getChild(i), - globals->get_soundmgr(), globals->get_fg_root()); - - _sound.push_back(sound); - } + SGPropertyNode *node = fgGetNode("/sim/sound", true); + + string path_str = node->getStringValue("path"); + if (path_str.empty()) { + SG_LOG(SG_GENERAL, SG_ALERT, "No path in /sim/sound/path"); + return; + } + + SGPath path = globals->resolve_aircraft_path(path_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, path.dir()); + + _sound.push_back(sound); + } catch ( sg_exception &e ) { + SG_LOG(SG_GENERAL, SG_ALERT, e.getFormattedMessage()); + delete sound; + } + } + } } + void FGFX::reinit() { - _sound.clear(); - init(); + _sound.clear(); + init(); }; -void -FGFX::bind () -{ -} - -void -FGFX::unbind () -{ -} void FGFX::update (double dt) { - if (fgGetBool("/sim/sound/audible")) { - for (unsigned int i = 0; i < _sound.size(); i++ ) + bool active = _avionics_external->getBoolValue() || + _internal->getBoolValue(); + + if ( active && _avionics_enabled->getBoolValue() ) + _avionics->resume(); // no-op if already in resumed state + else + _avionics->suspend(); + _avionics->set_volume( _avionics_volume->getFloatValue() ); + + if ( _enabled->getBoolValue() ) { + set_volume( _volume->getDoubleValue() ); + resume(); + + // update sound effects if not paused + for ( unsigned int i = 0; i < _sound.size(); i++ ) { _sound[i]->update(dt); + } + + SGSampleGroup::update(dt); } + else + suspend(); } // end of fg_fx.cxx