X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FSound%2Ffg_fx.cxx;h=d2addc66deaeed7b10bae1b2b725819b82218e94;hb=934ce52a235cda3827866f64a9af492f2ea1e63e;hp=2636bc011a43a1fa7a39ed210b7a604b1fcfbc05;hpb=bb2371dbd1091aca73327a27c8f05057a1dc562f;p=flightgear.git diff --git a/src/Sound/fg_fx.cxx b/src/Sound/fg_fx.cxx index 2636bc011..d2addc66d 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,83 +25,121 @@ #pragma warning (disable: 4786) #endif -#include -#include -#include -#include -#ifdef __BORLANDC__ -# define exception c_exception +#ifdef HAVE_CONFIG_H +# include #endif -#include
- #include "fg_fx.hxx" -#include "fg_sound.hxx" +#include
-FGFX::FGFX () +#include +#include +#include +#include + +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); + _avionics->tie_to_listener(); } + FGFX::~FGFX () { - for (unsigned int i = 0; i < _sound.size(); i++ ) - delete _sound[i]; + for (unsigned int i = 0; i < _sound.size(); i++ ) { + delete _sound[i]; + } + _sound.clear(); } + void FGFX::init() { - const 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 Instrument " << 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++) { - FGSound * sound; - sound = new FGSound(node->getChild(i)); - _sound.push_back(sound); - } - - for (i = 0; i < (int)_sound.size(); i++ ) { - _sound[i]->init(); - } + SGPropertyNode *node = fgGetNode("/sim/sound", true); + + 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; + } + + 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::bind () -{ -} void -FGFX::unbind () +FGFX::reinit() { -} + _sound.clear(); + init(); +}; + void -FGFX::update (int dt) +FGFX::update (double dt) { - for (unsigned int i = 0; i < _sound.size(); i++ ) - _sound[i]->update(dt); + bool new_pause = _pause->getBoolValue(); + if ( new_pause != last_pause ) { + if ( new_pause ) { + suspend(); + } else { + resume(); + } + last_pause = new_pause; + } + + if ( !new_pause ) { + double volume = _volume->getDoubleValue(); + if ( volume != last_volume ) { + set_volume( volume ); + last_volume = volume; + } + + // 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