1
0
Fork 0

Add the Sound Manager before any other subsystem that uses it. This makes sure the SoundMgr is available at construction time which makes the code much cleaner. Call the update_last() after any other class

This commit is contained in:
ehofman 2009-10-05 09:12:50 +00:00 committed by Tim Moore
parent 86f462933d
commit 446b200edc
9 changed files with 60 additions and 64 deletions

View file

@ -29,6 +29,8 @@ using std::string;
#include "AIPlane.hxx"
SGSampleGroup *FGAIPlane::_sgr = 0;
FGAIPlane::FGAIPlane() {
leg = LEG_UNKNOWN;
tuned_station = NULL;
@ -47,18 +49,18 @@ FGAIPlane::FGAIPlane() {
_trackSet = false;
_tgtRoll = 0.0;
_rollSuspended = false;
_sgr = 0;
if ( !_sgr ) {
SGSoundMgr *smgr;
smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr");
_sgr = smgr->find("atc", true);
}
}
FGAIPlane::~FGAIPlane() {
}
void FGAIPlane::Update(double dt) {
if (!_sgr) {
SGSoundMgr *smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr");
if (smgr) _sgr = smgr->find("atc", true);
}
if(_pending) {
if(tuned_station) {
if(tuned_station->GetFreqClear()) {

View file

@ -160,7 +160,7 @@ private:
double _tgtRoll;
bool _rollSuspended; // Set true when a derived class has suspended AIPlane's roll control
SGSampleGroup *_sgr;
static SGSampleGroup *_sgr;
};
#endif // _FG_AI_PLANE_HXX

View file

@ -56,6 +56,9 @@ FGATC::FGATC() :
_counter(0.0),
_max_count(5.0)
{
SGSoundMgr *smgr;
smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr");
_sgr = smgr->find("atc", true);
}
FGATC::~FGATC() {
@ -238,11 +241,6 @@ void FGATC::Render(string& msg, const float volume,
new SGSoundSample((unsigned char*) buf.c_str(), buf.length(), 8000);
// TODO - at the moment the volume can't be changed
// after the transmission has started.
if (!_sgr) {
SGSoundMgr *smgr;
smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr");
_sgr = smgr->find("atc", true);
}
simple->set_volume(volume);
_sgr->add(simple, refname);
_sgr->play(refname, repeating);

View file

@ -57,6 +57,7 @@
#include <simgear/misc/interpolator.hxx>
#include <simgear/scene/material/matlib.hxx>
#include <simgear/scene/model/particles.hxx>
#include <simgear/sound/soundmgr_openal.hxx>
#include <simgear/timing/sg_time.hxx>
#include <simgear/timing/lowleveltime.h>
@ -103,9 +104,6 @@
#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
#include <Scripting/NasalSys.hxx>
#include <Sound/fg_fx.hxx>
#include <Sound/beacon.hxx>
#include <Sound/morse.hxx>
#include <Sound/voice.hxx>
#include <Systems/system_mgr.hxx>
#include <Time/light.hxx>
@ -135,8 +133,6 @@
using std::string;
class Sound;
class SGSoundMgr;
extern const char *default_root;
float init_volume;
@ -1668,18 +1664,6 @@ bool fgInitSubsystems() {
globals->add_subsystem("replay", new FGReplay);
////////////////////////////////////////////////////////////////////
// Add Sound Manager.
// Put 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
init_volume = fgGetFloat("/sim/sound/volume");
fgSetFloat("/sim/sound/volume", 0.0f);
globals->add_subsystem("soundmgr", new SGSoundMgr);
#endif
////////////////////////////////////////////////////////////////////
// Bind and initialize subsystems.
////////////////////////////////////////////////////////////////////

View file

@ -221,7 +221,6 @@ setFreeze (bool f)
{
frozen = f;
#if 0
// Stop sound on a pause
SGSoundMgr *smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr");
if ( smgr != NULL ) {
@ -231,7 +230,6 @@ setFreeze (bool f)
smgr->resume();
}
}
#endif
}

View file

@ -478,14 +478,24 @@ static void fgMainLoop( void ) {
// 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);
#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);
SGSoundMgr *smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr");
#ifdef ENABLE_AUDIO_SUPPORT
smgr->set_volume(init_volume);
#endif
}
fgRequestRedraw();
@ -623,6 +633,16 @@ static void fgIdleFunction ( void ) {
} 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
// the scenery subsystem.)

View file

@ -43,6 +43,7 @@ FGViewMgr::FGViewMgr( void ) :
config_list(fgGetNode("/sim", true)->getChildren("view")),
current(0)
{
smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr");
}
// Destructor
@ -296,15 +297,10 @@ FGViewMgr::update (double dt)
abs_viewer_position = loop_view->getViewPosition();
// update audio listener values
static SGSoundMgr *smgr = 0;
if (!smgr) smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr");
if (smgr) {
// set the viewer posotion in Cartesian coordinates in meters
smgr->set_position(abs_viewer_position);
smgr->set_orientation(loop_view->getViewOrientation());
//TODO: should be in meters per second
// smr->set_veloicty(SGVec3f(0,0,0));
}
// set the viewer posotion in Cartesian coordinates in meters
smgr->set_position(abs_viewer_position);
smgr->set_orientation(loop_view->getViewOrientation());
smgr->set_velocity(SGVec3f(0,0,0)); // TODO: in meters per second
}
void

View file

@ -32,6 +32,7 @@
// forward decls
class FGViewer;
class SGSoundMgr;
typedef SGSharedPtr<FGViewer> FGViewerPtr;
// Define a structure containing view information
@ -124,6 +125,8 @@ private:
int current;
SGSoundMgr *smgr;
};

View file

@ -47,6 +47,10 @@ FGAircraftModel::FGAircraftModel ()
_speed_east(0),
_speed_up(0)
{
SGSoundMgr *smgr;
smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr");
_fx = new FGFX(smgr, "fx");
_fx->init();
}
FGAircraftModel::~FGAircraftModel ()
@ -119,33 +123,24 @@ FGAircraftModel::update (double dt)
_heading->getDoubleValue());
_aircraft->update();
if ( !_fx) {
SGSoundMgr *smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr");
if (smgr) {
_fx = new FGFX(smgr, "fx");
_fx->init();
}
}
// update model's sample group values
// Get the Cartesian coordinates in meters
SGVec3d pos = SGVec3d::fromGeod(_aircraft->getPosition());
_fx->set_position( pos );
if (_fx) {
// Get the Cartesian coordinates in meters
SGVec3d pos = SGVec3d::fromGeod(_aircraft->getPosition());
_fx->set_position( pos );
SGQuatd orient_m = SGQuatd::fromLonLat(_aircraft->getPosition());
orient_m *= SGQuatd::fromYawPitchRollDeg(_heading->getDoubleValue(),
_pitch->getDoubleValue(),
_roll->getDoubleValue());
SGVec3d orient = orient_m.rotateBack(SGVec3d::e1());
_fx->set_orientation( toVec3f(orient) );
SGQuatd orient_m = SGQuatd::fromLonLat(_aircraft->getPosition());
orient_m *= SGQuatd::fromYawPitchRollDeg(_heading->getDoubleValue(),
_pitch->getDoubleValue(),
_roll->getDoubleValue());
SGVec3d orient = orient_m.rotateBack(SGVec3d::e1());
_fx->set_orientation( toVec3f(orient) );
SGVec3f vel = SGVec3f( _speed_north->getFloatValue(),
_speed_east->getFloatValue(),
_speed_up->getFloatValue());
SGVec3f vel = SGVec3f( _speed_north->getFloatValue(),
_speed_east->getFloatValue(),
_speed_up->getFloatValue());
// TODO: rotate to properly align with the model orientation
_fx->set_velocity( vel*SG_FEET_TO_METER );
}
_fx->set_velocity( vel*SG_FEET_TO_METER );
}