File: soundeffectmanager.h

package info (click to toggle)
fife 0.4.2-10
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 25,204 kB
  • sloc: cpp: 42,642; xml: 18,881; python: 13,521; makefile: 23
file content (180 lines) | stat: -rw-r--r-- 6,743 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/***************************************************************************
 *   Copyright (C) 2005-2019 by the FIFE team                              *
 *   http://www.fifengine.net                                              *
 *   This file is part of FIFE.                                            *
 *                                                                         *
 *   FIFE is free software; you can redistribute it and/or                 *
 *   modify it under the terms of the GNU Lesser General Public            *
 *   License as published by the Free Software Foundation; either          *
 *   version 2.1 of the License, or (at your option) any later version.    *
 *                                                                         *
 *   This library is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
 *   Lesser General Public License for more details.                       *
 *                                                                         *
 *   You should have received a copy of the GNU Lesser General Public      *
 *   License along with this library; if not, write to the                 *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
 ***************************************************************************/

#ifndef FIFE_SOUNDEFFECTMANAGER_H
#define FIFE_SOUNDEFFECTMANAGER_H

// Standard C++ library includes
#include <queue>
#include <map>

// Platform specific includes

// 3rd party library includes

// FIFE includes
// These includes are split up in two parts, separated by one empty line
// First block: files included from the FIFE root src directory
// Second block: files included from the same folder
#include "audio/fife_openal.h"
#include "audio/soundconfig.h"

namespace FIFE {

	class SoundEffect;
	class SoundFilter;
	class SoundEmitter;

	class SoundEffectManager {
	public:
		/** Constructor
		 */
		SoundEffectManager();

		/** Destructor
		 */
		~SoundEffectManager();

		/** Initializes the effect system
		 */
		void init(ALCdevice* device);

		/** Returns true if sound effect module is active
		 */
		bool isActive() const;

		/** Creates SoundEffect of the specific type.
		 * @param type See SoundEffectType
		 */
		SoundEffect* createSoundEffect(SoundEffectType type);

		/** Creates EaxReverb SoundEffect and loads the specific preset type.
		 * @param type See SoundEffectPreset
		 */
		SoundEffect* createSoundEffectPreset(SoundEffectPreset type);

		/** Deletes given SoundEffect.
		 * Deactivates for SoundEmitters are automatically done.
		 */
		void deleteSoundEffect(SoundEffect* effect);

		/** Enables given SoundEffect.
		 */
		void enableSoundEffect(SoundEffect* effect);

		/** Disables given SoundEffect.
		 */
		void disableSoundEffect(SoundEffect* effect);

		/** Adds given SoundEmitter to the specific SoundEffect.
		 * Note: A SoundEmitter can only have a limited number of effects, usually 4.
		 */
		void addEmitterToSoundEffect(SoundEffect* effect, SoundEmitter* emitter);

		/** Removes given SoundEmitter from the specific SoundEffect.
		 */
		void removeEmitterFromSoundEffect(SoundEffect* effect, SoundEmitter* emitter);

		/** Adds given SoundFilter to the SoundEffect.
		 * Note: A SoundEffect can only have one SoundFilter.
		 */
		void addSoundFilterToSoundEffect(SoundEffect* effect, SoundFilter* filter);

		/** Removes given SoundFilter from the SoundEffect.
		 */
		void removeSoundFilterFromSoundEffect(SoundEffect* effect, SoundFilter* filter);

		/** Internal function to do the OpenAL calls to activate the SoundEffect for the SoundEmitter.
		 */
		void activateEffect(SoundEffect* effect, SoundEmitter* emitter);

		/** Internal function to do the OpenAL calls to deactivate the SoundEffect for the SoundEmitter.
		 */
		void deactivateEffect(SoundEffect* effect, SoundEmitter* emitter);

		/** Creates SoundFilter of the specific type.
		 * @param type See SoundFilterType
		 */
		SoundFilter* createSoundFilter(SoundFilterType type);

		/** Deletes given SoundFilter.
		 * Deactivates for SoundEmitters and Effects are automatically done.
		 */
		void deleteSoundFilter(SoundFilter* filter);

		/** Enables given direct SoundFilter. Only SoundFilters for SoundEmitters are meant.
		 */
		void enableDirectSoundFilter(SoundFilter* filter);

		/** Disables given SoundFilter. Only SoundFilters for SoundEmitters are meant.
		 */
		void disableDirectSoundFilter(SoundFilter* filter);

		/** Adds given SoundEmitter to the specific direct SoundFilter
		 * Note: A SoundEmitter can only have one direct filter.
		 */
		void addEmitterToDirectSoundFilter(SoundFilter* filter, SoundEmitter* emitter);

		/** Removes given SoundEmitter from the specific direct SoundFilter.
		 */
		void removeEmitterFromDirectSoundFilter(SoundFilter* filter, SoundEmitter* emitter);

		/** Internal function to do the OpenAL calls to activate the SoundFilter for the SoundEmitter.
		 */
		void activateFilter(SoundFilter* filter, SoundEmitter* emitter);

		/** Internal function to do the OpenAL calls to deactivate the SoundFilter for the SoundEmitter.
		 */
		void deactivateFilter(SoundFilter* filter, SoundEmitter* emitter);

	private:
		//! Inital the presets
		void createPresets();
		//! OpenAL device
		ALCdevice* m_device;
		//! If sound effect module is active
		bool m_active;
		//! Holds handles for effects
		ALuint m_effectSlots[MAX_EFFECT_SLOTS];
		//! Maximal created effect slots, can be different to MAX_EFFECT_SLOTS
		uint16_t m_createdSlots;
		//! Holds free handles for effect slots
		std::queue<ALuint> m_freeSlots;
		//! Maximal effect slots per Source
		ALint m_maxSlots;
		//! Holds all SoundEffects
		std::vector<SoundEffect*> m_effects;
		//! Holds SoundEffects together with the added SoundEmitters
		typedef std::map<SoundEffect*, std::vector<SoundEmitter*> > SoundEffectEmitterMap;
		SoundEffectEmitterMap m_effectEmitters;
		//! Holds all SoundFilters
		std::vector<SoundFilter*> m_filters;
		//! Holds SoundFilters together with the added SoundEmitters
		typedef std::map<SoundFilter*, std::vector<SoundEmitter*> > SoundFilterEmitterMap;
		SoundFilterEmitterMap m_filterdEmitters;
		//! Holds SoundFilters together with the added SoundEffects
		typedef std::map<SoundFilter*, std::vector<SoundEffect*> > SoundFilterEffectMap;
		SoundFilterEffectMap m_filterdEffects;
		//! Establishes the relationship between SoundEffectPreset and EFXEAXREVERBPROPERTIES
		std::map<SoundEffectPreset, EFXEAXREVERBPROPERTIES> m_presets;
	};
}
#endif