FGSoundManager::FGSoundManager()
: _is_initialized(false),
+ _enabled(false),
_listener(new Listener(this))
{
SGPropertyNode_ptr scenery_loaded = fgGetNode("sim/sceneryloaded", true);
_volume = fgGetNode("/sim/sound/volume");
_device_name = fgGetNode("/sim/sound/device-name");
+ _currentView = fgGetNode("sim/current-view");
+ _viewPosLon = fgGetNode("sim/current-view/viewer-lon-deg");
+ _viewPosLat = fgGetNode("sim/current-view/viewer-lat-deg");
+ _viewPosElev = fgGetNode("sim/current-view/viewer-elev-ft");
+
+ _velocityNorthFPS = fgGetNode("velocities/speed-north-fps", true);
+ _velocityEastFPS = fgGetNode("velocities/speed-east-fps", true);
+ _velocityDownFPS = fgGetNode("velocities/speed-down-fps", true);
+
+ _viewXoffset = _currentView->getNode("x-offset-m", true);
+ _viewYoffset = _currentView->getNode("y-offset-m", true);
+ _viewZoffset = _currentView->getNode("z-offset-m", true);
+
reinit();
}
devices.clear();
}
+bool FGSoundManager::stationaryView() const
+{
+ // this is an ugly hack to decide if the *viewer* is stationary,
+ // since we don't model the viewer velocity directly.
+ return (_viewXoffset->getDoubleValue() == 0.0) &&
+ (_viewYoffset->getDoubleValue() == 0.0) &&
+ (_viewZoffset->getDoubleValue() == 0.0);
+}
+
// Update sound manager and propagate property values,
// since the sound manager doesn't read any properties itself.
// Actual sound update is triggered by the subsystem manager.
void FGSoundManager::update(double dt)
{
- if (_is_initialized && _sound_working->getBoolValue() && _sound_enabled->getBoolValue())
+ if (_is_initialized && _sound_working->getBoolValue())
{
- set_volume(_volume->getFloatValue());
- SGSoundMgr::update(dt);
+ bool enabled = _sound_enabled->getBoolValue();
+ if (enabled != _enabled)
+ {
+ if (enabled)
+ resume();
+ else
+ suspend();
+ _enabled = enabled;
+ }
+ if (enabled)
+ {
+ SGGeod viewPosGeod(SGGeod::fromDegFt(_viewPosLon->getDoubleValue(),
+ _viewPosLat->getDoubleValue(),
+ _viewPosElev->getDoubleValue()));
+ SGVec3d cartPos = SGVec3d::fromGeod(viewPosGeod);
+
+ set_position(cartPos, viewPosGeod);
+
+ SGQuatd viewOrientation;
+ for (int i=0; i<4; ++i) {
+ viewOrientation[i] = _currentView->getChild("raw-orientation", i, true)->getDoubleValue();
+ }
+
+ set_orientation( viewOrientation );
+
+ SGVec3d velocity(SGVec3d::zeros());
+ if (!stationaryView()) {
+ velocity = SGVec3d(_velocityNorthFPS->getDoubleValue(),
+ _velocityEastFPS->getDoubleValue(),
+ _velocityDownFPS->getDoubleValue() );
+ }
+
+ set_velocity( velocity );
+
+ set_volume(_volume->getFloatValue());
+ SGSoundMgr::update(dt);
+ }
}
}