]> git.mxchange.org Git - flightgear.git/blobdiff - src/Sound/soundmanager.cxx
toggle fullscreen: also adapt GUI plane when resizing
[flightgear.git] / src / Sound / soundmanager.cxx
index 6d3908b3cd43e6572f6ad58a111fa33b3138addc..9ae7e3aed8aed49f121a8ee021f8af0f5d2df81a 100644 (file)
@@ -37,7 +37,7 @@ public:
     virtual void valueChanged (SGPropertyNode * node);
 
 private:
-    FGSoundManager * _wrapper;
+    FGSoundManager* _wrapper;
 };
 
 void Listener::valueChanged(SGPropertyNode * node)
@@ -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);
@@ -57,46 +58,67 @@ FGSoundManager::~FGSoundManager()
 {
 }
 
-
-void FGSoundManager::setNewSoundDevice(const char *device)
-{
-    SGSoundMgr *smgr = globals->get_soundmgr();
-    smgr->suspend();
-    smgr->stop();
-    smgr->init(device);
-    smgr->resume();
-}
-
 void FGSoundManager::init()
-{
-    globals->get_props()->tie("/sim/sound/devices/name",
-          SGRawValueFunctions<const char *>(0, FGSoundManager::setNewSoundDevice), false);
-}
-
-void FGSoundManager::bind()
 {
     _sound_working = fgGetNode("/sim/sound/working");
     _sound_enabled = fgGetNode("/sim/sound/enabled");
     _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();
+}
+
+void FGSoundManager::reinit()
+{
+    _is_initialized = false;
+
+    if (_is_initialized && !_sound_working->getBoolValue())
+    {
+        // shutdown sound support
+        stop();
+        return;
+    }
+
+    if (!_sound_working->getBoolValue())
+    {
+        return;
+    }
+
+    update_device_list();
 
-    // we intentionally do _not_ call SGSoundMgr::bind here, we'll do this later
+    select_device(_device_name->getStringValue());
+    SGSoundMgr::reinit();
+    _is_initialized = true;
+
+    activate(fgGetBool("sim/sceneryloaded", true));
 }
 
 void FGSoundManager::activate(bool State)
 {
-    if (_is_initialized &&
-        fgGetBool("/sim/sound/working"))
+    if (_is_initialized)
     {
         if (State)
+        {
             SGSoundMgr::activate();
+        }
     }
 }
 
-void FGSoundManager::runtime_init()
+void FGSoundManager::update_device_list()
 {
-    SGSoundMgr::bind();
-    SGSoundMgr::init(fgGetString("/sim/sound/device-name", NULL));
-
     std::vector <const char*>devices = get_available_devices();
     for (unsigned int i=0; i<devices.size(); i++) {
         SGPropertyNode *p = fgGetNode("/sim/sound/devices/device", i, true);
@@ -105,23 +127,56 @@ void FGSoundManager::runtime_init()
     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) {
-        if (_sound_working->getBoolValue()) {
-            runtime_init();
-            _is_initialized = true;
-        }
-    } else {
-        if (!_sound_working->getBoolValue()) {   // request to reinit
-            SGSoundMgr::reinit();
-           _sound_working->setBoolValue(true);
+    if (_is_initialized && _sound_working->getBoolValue())
+    {
+        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 );
 
-        if (_sound_enabled->getBoolValue()) {
             set_volume(_volume->getFloatValue());
             SGSoundMgr::update(dt);
         }