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),
50 _listener(new Listener(this))
52 SGPropertyNode_ptr scenery_loaded = fgGetNode("sim/sceneryloaded", true);
53 scenery_loaded->addChangeListener(_listener);
56 FGSoundManager::~FGSoundManager()
61 void FGSoundManager::setNewSoundDevice(const char *device)
63 SGSoundMgr *smgr = globals->get_soundmgr();
70 void FGSoundManager::init()
72 globals->get_props()->tie("/sim/sound/devices/name",
73 SGRawValueFunctions<const char *>(0, FGSoundManager::setNewSoundDevice), false);
76 void FGSoundManager::bind()
78 _sound_working = fgGetNode("/sim/sound/working");
79 _sound_enabled = fgGetNode("/sim/sound/enabled");
80 _volume = fgGetNode("/sim/sound/volume");
82 // we intentionally do _not_ call SGSoundMgr::bind here, we'll do this later
85 void FGSoundManager::activate(bool State)
87 if (_is_initialized &&
88 fgGetBool("/sim/sound/working"))
91 SGSoundMgr::activate();
95 void FGSoundManager::runtime_init()
98 SGSoundMgr::init(fgGetString("/sim/sound/device-name", NULL));
100 std::vector <const char*>devices = get_available_devices();
101 for (unsigned int i=0; i<devices.size(); i++) {
102 SGPropertyNode *p = fgGetNode("/sim/sound/devices/device", i, true);
103 p->setStringValue(devices[i]);
108 // Update sound manager and propagate property values,
109 // since the sound manager doesn't read any properties itself.
110 // Actual sound update is triggered by the subsystem manager.
111 void FGSoundManager::update(double dt)
113 if (!_is_initialized) {
114 if (_sound_working->getBoolValue()) {
116 _is_initialized = true;
119 if (!_sound_working->getBoolValue()) { // request to reinit
120 SGSoundMgr::reinit();
121 _sound_working->setBoolValue(true);
124 if (_sound_enabled->getBoolValue()) {
125 set_volume(_volume->getFloatValue());
126 SGSoundMgr::update(dt);
131 #endif // ENABLE_AUDIO_SUPPORT