X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Fmain.cxx;h=e1a50d6c3798cdfffe813a1afaad1fe46b1ad478;hb=dee0b6459e41f7c08e74321c51f3149f955262a0;hp=cbdc0ba60f1ece4c3d3cae8a07e1ee5e7ace94da;hpb=9a94b266093e056aff3cca74f7e64b215322dada;p=flightgear.git diff --git a/src/Main/main.cxx b/src/Main/main.cxx index cbdc0ba60..e1a50d6c3 100644 --- a/src/Main/main.cxx +++ b/src/Main/main.cxx @@ -62,6 +62,7 @@ #include #include #include +#include #include #include #include @@ -87,7 +88,6 @@ static double real_delta_time_sec = 0.0; double delta_time_sec = 0.0; -extern float init_volume; using namespace flightgear; @@ -105,6 +105,9 @@ long global_multi_loop; 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; @@ -461,8 +464,8 @@ static void fgMainLoop( void ) { // 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); @@ -478,10 +481,43 @@ static void fgMainLoop( void ) { // update the view angle as late as possible, but before sound calculations globals->get_viewmgr()->update(real_delta_time_sec); - // Run audio scheduler + // 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 - FGFX* fx = (FGFX*) globals->get_subsystem("fx"); - fx->update_fx_late(delta_time_sec); + static bool smgr_init = true; + static SGPropertyNode *sound_working = fgGetNode("/sim/sound/working"); + if (smgr_init == true) { + 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 (sound_working->getBoolValue() == false) { // request to reinit + smgr->reinit(); + smgr->resume(); + sound_working->setBoolValue(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 @@ -489,8 +525,11 @@ static void fgMainLoop( void ) { if (!scenery_loaded && globals->get_tile_mgr()->isSceneryLoaded() && cur_fdm_state->get_inited()) { fgSetBool("sim/sceneryloaded",true); - fgSetFloat("/sim/sound/volume", init_volume); - globals->get_soundmgr()->set_volume(init_volume); + if (fgGetBool("/sim/sound/working")) { + globals->get_soundmgr()->activate(); + } + globals->get_props()->tie("/sim/sound/devices/name", + SGRawValueFunctions(0, fgSetNewSoundDevice), false); } simgear::AtomicChangeListener::fireChangeListeners(); fgRequestRedraw(); @@ -498,6 +537,29 @@ static void fgMainLoop( void ) { SG_LOG( SG_ALL, SG_DEBUG, "" ); } +void fgInitSoundManager() +{ + SGSoundMgr *smgr = globals->get_soundmgr(); + + smgr->bind(); + smgr->init(fgGetString("/sim/sound/device-name", NULL)); + + vector devices = smgr->get_available_devices(); + for (unsigned int i=0; isetStringValue(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 @@ -628,6 +690,7 @@ static void fgIdleFunction ( void ) { } else if ( idle_state == 5 ) { idle_state++; + //////////////////////////////////////////////////////////////////// // Initialize the 3D aircraft model subsystem (has a dependency on // the scenery subsystem.) @@ -724,13 +787,13 @@ static void fgIdleFunction ( void ) { SG_LOG( SG_GENERAL, SG_INFO, "Starting intro music: " << mp3file.str() ); -#if defined( __CYGWIN__ ) +# if defined( __CYGWIN__ ) string command = "start /m `cygpath -w " + mp3file.str() + "`"; -#elif defined( WIN32 ) +# elif defined( _WIN32 ) string command = "start /m " + mp3file.str(); -#else +# else string command = "mpg123 " + mp3file.str() + "> /dev/null 2>&1"; -#endif +# endif system ( command.c_str() ); } @@ -834,7 +897,7 @@ bool fgMainInit( int argc, char **argv ) { 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