X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FSound%2Ffg_fx.cxx;h=5537bb1195b80743a59005658aa6499ed1829383;hb=db89cf202adc795b27e1bbf85162e8ec137a760d;hp=a060b311df804da537f71d0c7399bb854ac75ebc;hpb=250bab50893b0e0929521aa48779dbc382319bb1;p=flightgear.git diff --git a/src/Sound/fg_fx.cxx b/src/Sound/fg_fx.cxx index a060b311d..5537bb119 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 @@ -21,112 +21,99 @@ // // $Id$ -#include "fg_fx.hxx" +#ifdef _MSC_VER +#pragma warning (disable: 4786) +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#ifdef __BORLANDC__ +# define exception c_exception +#endif +#include +#include +#include -// FIXME: remove direct dependencies -#include -#include #include
+#include "fg_fx.hxx" + -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 () : + last_pause( true ), + last_volume( 0.0 ), + _pause( fgGetNode("/sim/sound/pause") ), + _volume( fgGetNode("/sim/sound/volume") ) { } 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; -} + unsigned int i; + for ( i = 0; i < _sound.size(); i++ ) { + delete _sound[i]; + } + _sound.clear(); + while ( _samplequeue.size() > 0 ) { + delete _samplequeue.front(); + _samplequeue.pop(); + } +} 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); + 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 &) { + 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(); + + try { + sound->init(globals->get_props(), node->getChild(i), + globals->get_soundmgr(), globals->get_fg_root()); + + _sound.push_back(sound); + } catch ( sg_io_exception &e ) { + SG_LOG(SG_GENERAL, SG_ALERT, e.getFormattedMessage()); + delete sound; + } + } } +void +FGFX::reinit() +{ + _sound.clear(); + init(); +}; + void FGFX::bind () { @@ -138,91 +125,74 @@ FGFX::unbind () } void -FGFX::update () +FGFX::update (double dt) { - 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_engine(0) != NULL) - rpm_factor = cur_fdm_state->get_engine(0)->get_RPM() / 2500.0; - else - rpm_factor = 1.0; - - 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_engine(0) != NULL) - 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. - //////////////////////////////////////////////////////////////////// + SGSoundMgr *smgr = globals->get_soundmgr(); + + // command sound manger + bool pause = _pause->getBoolValue(); + if ( pause != last_pause ) { + if ( pause ) { + smgr->pause(); + } else { + smgr->resume(); + } + last_pause = pause; + } - if (fgGetBool("/engines/engine[0]/cranking")) { // FIXME - if(!_is_cranking) { - globals->get_soundmgr()->play_looped("crank"); - _is_cranking = true; + // 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 + } } - } else { - if(_is_cranking) { - globals->get_soundmgr()->stop("crank"); - _is_cranking = false; + 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 ); + } } - } - - - //////////////////////////////////////////////////////////////////// - // 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 - - // TODO: rumble - // TODO: flaps - - // TODO: squeal + double volume = _volume->getDoubleValue(); + if ( volume != last_volume ) { + smgr->set_volume( volume ); + last_volume = volume; + } - // TODO: click + 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 ); +} + // end of fg_fx.cxx