1 // soundmanager.cxx -- Wraps the SimGear OpenAl sound manager class
3 // Copyright (C) 2001 Curtis L. Olson - http://www.flightgear.org/~curt
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License as
7 // published by the Free Software Foundation; either version 2 of the
8 // License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful, but
11 // WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #include <simgear/sound/soundmgr_openal.hxx>
22 #include "soundmanager.hxx"
23 #include "Main/globals.hxx"
24 #include "Main/fg_props.hxx"
29 #ifdef ENABLE_AUDIO_SUPPORT
31 * Listener class that monitors the sim state.
33 class Listener : public SGPropertyChangeListener
36 Listener(FGSoundManager *wrapper) : _wrapper(wrapper) {}
37 virtual void valueChanged (SGPropertyNode * node);
40 FGSoundManager* _wrapper;
43 void Listener::valueChanged(SGPropertyNode * node)
45 _wrapper->activate(node->getBoolValue());
48 FGSoundManager::FGSoundManager()
49 : _is_initialized(false),
51 _listener(new Listener(this))
53 SGPropertyNode_ptr scenery_loaded = fgGetNode("sim/sceneryloaded", true);
54 scenery_loaded->addChangeListener(_listener);
57 FGSoundManager::~FGSoundManager()
61 void FGSoundManager::init()
63 _sound_working = fgGetNode("/sim/sound/working");
64 _sound_enabled = fgGetNode("/sim/sound/enabled");
65 _volume = fgGetNode("/sim/sound/volume");
66 _device_name = fgGetNode("/sim/sound/device-name");
68 _currentView = fgGetNode("sim/current-view");
69 _viewPosLon = fgGetNode("sim/current-view/viewer-lon-deg");
70 _viewPosLat = fgGetNode("sim/current-view/viewer-lat-deg");
71 _viewPosElev = fgGetNode("sim/current-view/viewer-elev-ft");
73 _velocityNorthFPS = fgGetNode("velocities/speed-north-fps", true);
74 _velocityEastFPS = fgGetNode("velocities/speed-east-fps", true);
75 _velocityDownFPS = fgGetNode("velocities/speed-down-fps", true);
80 void FGSoundManager::reinit()
82 _is_initialized = false;
84 if (_is_initialized && !_sound_working->getBoolValue())
86 // shutdown sound support
91 if (!_sound_working->getBoolValue())
98 select_device(_device_name->getStringValue());
100 _is_initialized = true;
102 activate(fgGetBool("sim/sceneryloaded", true));
105 void FGSoundManager::activate(bool State)
111 SGSoundMgr::activate();
116 void FGSoundManager::update_device_list()
118 std::vector <const char*>devices = get_available_devices();
119 for (unsigned int i=0; i<devices.size(); i++) {
120 SGPropertyNode *p = fgGetNode("/sim/sound/devices/device", i, true);
121 p->setStringValue(devices[i]);
126 bool FGSoundManager::stationary() const
128 // this is an ugly hack to decide if the *viewer* is stationary,
129 // since we don't model the viewer velocity directly.
130 return (_currentView->getDoubleValue("x-offset-m") == 0.0) &&
131 (_currentView->getDoubleValue("y-offset-m") == 0.0) &&
132 (_currentView->getDoubleValue("z-offset-m") == 0.0);
135 // Update sound manager and propagate property values,
136 // since the sound manager doesn't read any properties itself.
137 // Actual sound update is triggered by the subsystem manager.
138 void FGSoundManager::update(double dt)
140 if (_is_initialized && _sound_working->getBoolValue())
142 bool enabled = _sound_enabled->getBoolValue();
143 if (enabled != _enabled)
153 SGGeod viewPosGeod(SGGeod::fromDegFt(_viewPosLon->getDoubleValue(),
154 _viewPosLat->getDoubleValue(),
155 _viewPosElev->getDoubleValue()));
156 SGVec3d cartPos = SGVec3d::fromGeod(viewPosGeod);
158 set_position(cartPos, viewPosGeod);
160 SGQuatd viewOrientation;
161 for (int i=0; i<4; ++i) {
162 viewOrientation[i] = _currentView->getChild("raw-orientation", i, true)->getDoubleValue();
165 set_orientation( viewOrientation );
167 SGVec3d velocity(SGVec3d::zeros());
169 velocity = SGVec3d(_velocityNorthFPS->getDoubleValue(),
170 _velocityEastFPS->getDoubleValue(),
171 _velocityDownFPS->getDoubleValue() );
174 set_velocity( velocity );
176 set_volume(_volume->getFloatValue());
177 SGSoundMgr::update(dt);
182 #endif // ENABLE_AUDIO_SUPPORT