]> git.mxchange.org Git - flightgear.git/blob - src/Sound/soundmanager.cxx
Sound Manager: support subsystem reinit
[flightgear.git] / src / Sound / soundmanager.cxx
1 // soundmanager.cxx -- Wraps the SimGear OpenAl sound manager class
2 //
3 // Copyright (C) 2001  Curtis L. Olson - http://www.flightgear.org/~curt
4 //
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.
9 //
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.
14 //
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.
18 //
19
20 #include <simgear/sound/soundmgr_openal.hxx>
21
22 #include "soundmanager.hxx"
23 #include "Main/globals.hxx"
24 #include "Main/fg_props.hxx"
25
26 #include <vector>
27 #include <string>
28
29 #ifdef ENABLE_AUDIO_SUPPORT
30 /**
31  * Listener class that monitors the sim state.
32  */
33 class Listener : public SGPropertyChangeListener
34 {
35 public:
36     Listener(FGSoundManager *wrapper) : _wrapper(wrapper) {}
37     virtual void valueChanged (SGPropertyNode * node);
38
39 private:
40     FGSoundManager* _wrapper;
41 };
42
43 void Listener::valueChanged(SGPropertyNode * node)
44 {
45     _wrapper->activate(node->getBoolValue());
46 }
47
48 FGSoundManager::FGSoundManager()
49   : _is_initialized(false),
50     _listener(new Listener(this))
51 {
52     SGPropertyNode_ptr scenery_loaded = fgGetNode("sim/sceneryloaded", true);
53     scenery_loaded->addChangeListener(_listener);
54 }
55
56 FGSoundManager::~FGSoundManager()
57 {
58 }
59
60 void FGSoundManager::init()
61 {
62     _sound_working = fgGetNode("/sim/sound/working");
63     _sound_enabled = fgGetNode("/sim/sound/enabled");
64     _volume        = fgGetNode("/sim/sound/volume");
65     _device_name   = fgGetNode("/sim/sound/device-name");
66
67     reinit();
68 }
69
70 void FGSoundManager::reinit()
71 {
72     _is_initialized = false;
73
74     if (_is_initialized && !_sound_working->getBoolValue())
75     {
76         // shutdown sound support
77         stop();
78         return;
79     }
80
81     if (!_sound_working->getBoolValue())
82     {
83         return;
84     }
85
86     update_device_list();
87
88     select_device(_device_name->getStringValue());
89     SGSoundMgr::reinit();
90     _is_initialized = true;
91
92     activate(fgGetBool("sim/sceneryloaded", true));
93 }
94
95 void FGSoundManager::activate(bool State)
96 {
97     if (_is_initialized)
98     {
99         if (State)
100         {
101             SGSoundMgr::activate();
102         }
103     }
104 }
105
106 void FGSoundManager::update_device_list()
107 {
108     std::vector <const char*>devices = get_available_devices();
109     for (unsigned int i=0; i<devices.size(); i++) {
110         SGPropertyNode *p = fgGetNode("/sim/sound/devices/device", i, true);
111         p->setStringValue(devices[i]);
112     }
113     devices.clear();
114 }
115
116 // Update sound manager and propagate property values,
117 // since the sound manager doesn't read any properties itself.
118 // Actual sound update is triggered by the subsystem manager.
119 void FGSoundManager::update(double dt)
120 {
121     if (_is_initialized && _sound_working->getBoolValue() && _sound_enabled->getBoolValue())
122     {
123         set_volume(_volume->getFloatValue());
124         SGSoundMgr::update(dt);
125     }
126 }
127
128 #endif // ENABLE_AUDIO_SUPPORT