X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FSound%2Ffg_fx.cxx;h=abf3a2678668dbb997b896c3010f629b5266e15d;hb=2bc7dc685b35b489730ef36050a318b331c14977;hp=9a8fe0a6fc9c78da2e6be1fc887fb5ec40c60ce1;hpb=311b85a11d01f4cd94fdb563ad111403fd0009f2;p=flightgear.git diff --git a/src/Sound/fg_fx.cxx b/src/Sound/fg_fx.cxx index 9a8fe0a6f..abf3a2678 100644 --- a/src/Sound/fg_fx.cxx +++ b/src/Sound/fg_fx.cxx @@ -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,165 +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
+ +#include +#include +#include +#include -FGFX::FGFX () : - _volume( fgGetNode("/sim/sound/volume") ), +FGFX::FGFX ( SGSoundMgr *smgr, const string &refname ) : + last_pause( false ), + last_volume( 0.0 ), _pause( fgGetNode("/sim/sound/pause") ), - last_pause( true ), - last_volume( 0.0 ) + _volume( fgGetNode("/sim/sound/volume") ) { + SGSampleGroup::_smgr = smgr; + SGSampleGroup::_refname = refname; + SGSampleGroup::_smgr->add(this, refname); + _avionics = _smgr->find("avionics", true); } + FGFX::~FGFX () { - unsigned int i; - for ( i = 0; i < _sound.size(); i++ ) { + for (unsigned int i = 0; i < _sound.size(); i++ ) { delete _sound[i]; } _sound.clear(); - - while ( _samplequeue.size() > 0 ) { - delete _samplequeue.front(); - _samplequeue.pop(); - } } + 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"); + 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::reinit() { - _sound.clear(); - init(); + _sound.clear(); + init(); }; -void -FGFX::bind () -{ -} - -void -FGFX::unbind () -{ -} void FGFX::update (double dt) { - SGSoundMgr *smgr = globals->get_soundmgr(); - - // command sound manger - bool pause = _pause->getBoolValue(); - if ( pause != last_pause ) { - if ( pause ) { - smgr->pause(); + bool new_pause = _pause->getBoolValue(); + if ( new_pause != last_pause ) { + if ( new_pause ) { + suspend(); } else { - smgr->resume(); + resume(); } - last_pause = pause; + last_pause = new_pause; } - // process mesage queue - const string msgid = "Sequential Audio Message"; - bool is_playing = false; - if ( smgr->exists( msgid ) ) { - if ( smgr->is_playing( msgid ) ) { - // still playing, do nothing - is_playing = true; - } else { - // current message finished, stop and remove - smgr->stop( msgid ); // removes source - smgr->remove( msgid ); // removes buffer + if ( !new_pause ) { + double volume = _volume->getDoubleValue(); + if ( volume != last_volume ) { + set_volume( volume ); + last_volume = volume; } - } - if ( !is_playing ) { - // message queue idle, add next sound if we have one - if ( _samplequeue.size() > 0 ) { - smgr->add( _samplequeue.front(), msgid ); - _samplequeue.pop(); - smgr->play_once( msgid ); - } - } - double volume = _volume->getDoubleValue(); - if ( volume != last_volume ) { - smgr->set_volume( volume ); - last_volume = volume; - } - - if ( !pause ) { // update sound effects if not paused for ( unsigned int i = 0; i < _sound.size(); i++ ) { _sound[i]->update(dt); } - } -} -/** - * add a sound sample to the message queue which is played sequentially - * in order. - */ -void -FGFX::play_message( SGSoundSample *_sample ) -{ - _sample->set_volume( 1.0 ); - _samplequeue.push( _sample ); -} -void -FGFX::play_message( const string path, const string fname ) -{ - SGSoundSample *sample; - sample = new SGSoundSample( path.c_str(), fname.c_str() ); - play_message( sample ); + SGSampleGroup::update(dt); + } } - // end of fg_fx.cxx