X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FSound%2Fsoundmanager.cxx;h=9ae7e3aed8aed49f121a8ee021f8af0f5d2df81a;hb=e88e821567cc6bb6214fa0b9ee13b52e74b24ffa;hp=2a41ade13b61570f2a171514a04b9459fafc8877;hpb=4456f42e673330238a341e9be079e0d57222dbf9;p=flightgear.git diff --git a/src/Sound/soundmanager.cxx b/src/Sound/soundmanager.cxx index 2a41ade13..9ae7e3aed 100644 --- a/src/Sound/soundmanager.cxx +++ b/src/Sound/soundmanager.cxx @@ -47,6 +47,7 @@ void Listener::valueChanged(SGPropertyNode * node) FGSoundManager::FGSoundManager() : _is_initialized(false), + _enabled(false), _listener(new Listener(this)) { SGPropertyNode_ptr scenery_loaded = fgGetNode("sim/sceneryloaded", true); @@ -64,15 +65,19 @@ void FGSoundManager::init() _volume = fgGetNode("/sim/sound/volume"); _device_name = fgGetNode("/sim/sound/device-name"); - _currentView = fgGetNode("sim/current-view"); + _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); + _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(); } @@ -122,13 +127,13 @@ void FGSoundManager::update_device_list() devices.clear(); } -bool FGSoundManager::stationary() const +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 (_currentView->getDoubleValue("x-offset-m") == 0.0) && - (_currentView->getDoubleValue("y-offset-m") == 0.0) && - (_currentView->getDoubleValue("z-offset-m") == 0.0); + return (_viewXoffset->getDoubleValue() == 0.0) && + (_viewYoffset->getDoubleValue() == 0.0) && + (_viewZoffset->getDoubleValue() == 0.0); } // Update sound manager and propagate property values, @@ -136,33 +141,45 @@ bool FGSoundManager::stationary() const // 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()) { - 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(); + bool enabled = _sound_enabled->getBoolValue(); + if (enabled != _enabled) + { + if (enabled) + resume(); + else + suspend(); + _enabled = enabled; } - - set_orientation( viewOrientation ); - - SGVec3d velocity(SGVec3d::zeros()); - if (!stationary()) { - velocity = SGVec3d(_velocityNorthFPS->getDoubleValue(), - _velocityEastFPS->getDoubleValue(), - _velocityDownFPS->getDoubleValue() ); + 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); } - - set_velocity( velocity ); - - set_volume(_volume->getFloatValue()); - SGSoundMgr::update(dt); } }