#include <simgear/scene/model/animation.hxx>
#include <simgear/scene/sky/sky.hxx>
#include <simgear/structure/event_mgr.hxx>
+#include <simgear/props/AtomicChangeListener.hxx>
#include <simgear/props/props.hxx>
#include <simgear/timing/sg_time.hxx>
#include <simgear/math/sg_random.h>
static double real_delta_time_sec = 0.0;
double delta_time_sec = 0.0;
-extern float init_volume;
using namespace flightgear;
SGTimeStamp last_time_stamp;
SGTimeStamp current_time_stamp;
+void fgInitSoundManager();
+void fgSetNewSoundDevice(const char *);
+
// The atexit() function handler should know when the graphical subsystem
// is initialized.
extern int _bootstrap_OSInit;
// normal playback
replay_time->setDoubleValue( replay_time->getDoubleValue()
+ ( delta_time_sec
- * fgGetInt("/sim/speed-up") ) );
+ * fgGetInt("/sim/speed-up") ) );
} else if ( replay_state->getIntValue() == 2 ) {
// paused playback (don't advance replay time)
}
// probably move eventually
/* printf("Before - ground = %.2f runway = %.2f alt = %.2f\n",
- scenery.get_cur_elev(),
- cur_fdm_state->get_Runway_altitude() * SG_FEET_TO_METER,
- cur_fdm_state->get_Altitude() * SG_FEET_TO_METER); */
+ scenery.get_cur_elev(),
+ cur_fdm_state->get_Runway_altitude() * SG_FEET_TO_METER,
+ cur_fdm_state->get_Altitude() * SG_FEET_TO_METER); */
/* printf("Adjustment - ground = %.2f runway = %.2f alt = %.2f\n",
- scenery.get_cur_elev(),
- cur_fdm_state->get_Runway_altitude() * SG_FEET_TO_METER,
- cur_fdm_state->get_Altitude() * SG_FEET_TO_METER); */
+ scenery.get_cur_elev(),
+ cur_fdm_state->get_Runway_altitude() * SG_FEET_TO_METER,
+ cur_fdm_state->get_Altitude() * SG_FEET_TO_METER); */
// cout << "Warp = " << globals->get_warp() << endl;
general.set_frame_rate( frames );
fgSetInt("/sim/frame-rate", frames);
SG_LOG( SG_ALL, SG_DEBUG,
- "--> Frame rate is = " << general.get_frame_rate() );
+ "--> Frame rate is = " << general.get_frame_rate() );
frames = 0;
}
last_time = t->get_cur_time();
fgUpdateTimeDepCalcs();
} else {
SG_LOG( SG_ALL, SG_DEBUG,
- "Elapsed time is zero ... we're zinging" );
+ "Elapsed time is zero ... we're zinging" );
}
globals->get_subsystem_mgr()->update(delta_time_sec);
// we may want to move this to its own class at some point
//
double visibility_meters = fgGetDouble("/environment/visibility-m");
-
globals->get_tile_mgr()->prep_ssg_nodes( visibility_meters );
+
// update tile manager for view...
SGVec3d viewPos = globals->get_current_view()->get_view_pos();
SGGeod geodViewPos = SGGeod::fromCart(viewPos);
// update the view angle as late as possible, but before sound calculations
globals->get_viewmgr()->update(real_delta_time_sec);
- ////////////////////////////////////////////////////////////////////
// Update the sound manager last so it can use the CPU while the GPU
// is processing the scenery (doubled the frame-rate for me) -EMH-
- ////////////////////////////////////////////////////////////////////
#ifdef ENABLE_AUDIO_SUPPORT
- static SGSoundMgr *smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr");
- smgr->update_late(delta_time_sec);
+ static bool smgr_init = true;
+ if (smgr_init == true) {
+ static SGPropertyNode *sound_working = fgGetNode("/sim/sound/working");
+ if (sound_working->getBoolValue() == true) {
+ fgInitSoundManager();
+ smgr_init = false;
+ }
+ } else {
+ static SGPropertyNode *sound_enabled = fgGetNode("/sim/sound/enabled");
+ static SGSoundMgr *smgr = globals->get_soundmgr();
+ static bool smgr_enabled = true;
+
+ if (smgr_enabled != sound_enabled->getBoolValue()) {
+ if (smgr_enabled == true) { // request to suspend
+ smgr->suspend();
+ smgr_enabled = false;
+ } else {
+ smgr->resume();
+ smgr_enabled = true;
+ }
+ }
+
+ if (smgr_enabled == true) {
+ static SGPropertyNode *volume = fgGetNode("/sim/sound/volume");
+ smgr->set_volume(volume->getFloatValue());
+ smgr->update(delta_time_sec);
+ }
+ }
#endif
// END Tile Manager udpates
if (!scenery_loaded && globals->get_tile_mgr()->isSceneryLoaded()
&& cur_fdm_state->get_inited()) {
fgSetBool("sim/sceneryloaded",true);
- fgSetFloat("/sim/sound/volume", init_volume);
-#ifdef ENABLE_AUDIO_SUPPORT
- smgr->set_volume(init_volume);
-#endif
+ if (fgGetBool("/sim/sound/working")) {
+ globals->get_soundmgr()->activate();
+ }
+ globals->get_props()->tie("/sim/sound/devices/name",
+ SGRawValueFunctions<const char *>(0, fgSetNewSoundDevice), false);
}
-
+ simgear::AtomicChangeListener::fireChangeListeners();
fgRequestRedraw();
SG_LOG( SG_ALL, SG_DEBUG, "" );
}
+void fgInitSoundManager()
+{
+ SGSoundMgr *smgr = globals->get_soundmgr();
+
+ smgr->bind();
+ smgr->init(fgGetString("/sim/sound/device-name", NULL));
+
+ vector <const char*>devices = smgr->get_available_devices();
+ for (unsigned int i=0; i<devices.size(); i++) {
+ SGPropertyNode *p = fgGetNode("/sim/sound/devices/device", i, true);
+ p->setStringValue(devices[i]);
+ }
+ devices.clear();
+}
+
+void fgSetNewSoundDevice(const char *device)
+{
+ globals->get_soundmgr()->suspend();
+ globals->get_soundmgr()->stop();
+ globals->get_soundmgr()->init(device);
+ globals->get_soundmgr()->resume();
+}
+
// Operation for querying OpenGL parameters. This must be done in a
// valid OpenGL context, potentially in another thread.
namespace
} else if ( idle_state == 5 ) {
idle_state++;
-#ifdef ENABLE_AUDIO_SUPPORT
- ////////////////////////////////////////////////////////////////////
- // Add the Sound Manager before any other subsystem that uses it.
- // This makes sure the SoundMgr is available at construction time.
- ////////////////////////////////////////////////////////////////////
- init_volume = fgGetFloat("/sim/sound/volume");
- fgSetFloat("/sim/sound/volume", 0.0f);
- globals->add_subsystem("soundmgr", new SGSoundMgr);
-#endif
////////////////////////////////////////////////////////////////////
// Initialize the 3D aircraft model subsystem (has a dependency on
# if defined( __CYGWIN__ )
string command = "start /m `cygpath -w " + mp3file.str() + "`";
-# elif defined( WIN32 )
+# elif defined( _WIN32 )
string command = "start /m " + mp3file.str();
# else
string command = "mpg123 " + mp3file.str() + "> /dev/null 2>&1";
fgGetInt("/sim/startup/ysize") );
fgSplashProgress("loading scenery objects");
-
+ int session = fgGetInt("/sim/session",0);
+ session++;
+ fgSetInt("/sim/session",session);
}
if ( idle_state == 1000 ) {
fgInitFGRoot(argc, argv);
// Check for the correct base package version
- static char required_version[] = "1.9.0";
+ static char required_version[] = "2.0.0";
string base_version = fgBasePackageVersion();
if ( !(base_version == required_version) ) {
// tell the operator how to use this application