Cytopia  0.3
A city building simulation game
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
AudioMixer.hxx
Go to the documentation of this file.
1 #ifndef AUDIOMIXER_HXX_
2 #define AUDIOMIXER_HXX_
3 
4 #include <array>
5 #include <unordered_set>
6 #include <vector>
7 #include <memory>
8 #include <list>
9 
10 #include "audio/Soundtrack.hxx"
11 #include "audio/AudioConfig.hxx"
12 #include "../util/Meta.hxx"
13 #include "../util/Singleton.hxx"
14 
15 #include "AL/al.h"
16 #include "AL/alc.h"
17 
18 #include "AL/alext.h" //header for OpenAL Soft
19 #include "AL/efx.h"
20 #include "AL/efx-presets.h"
21 
22 template <typename Key, typename Value> using Mapping = std::unordered_map<Key, Value>;
23 template <typename Type, size_t N> using Array = std::array<Type, N>;
24 using string = std::string;
25 template <typename Type> using Vector = std::vector<Type>;
26 template <typename Type> using Set = std::unordered_set<Type>;
27 template <typename Type> using List = std::list<Type>;
28 
36 {
37  double x, y, z;
38 };
39 
43 class AudioMixer : public Singleton<AudioMixer>
44 {
45 public:
47 
54  void setMusicVolume(float volume);
55 
62  void setSoundEffectVolume(float volume);
63 
69  void play(const SoundtrackID &id, int effect = AL_EFFECT_NULL);
70 
76  void play(const AudioTrigger &trigger, int effect = AL_EFFECT_NULL);
77 
84  void play(const SoundtrackID &id, const Coordinate3D &position, int effect = AL_EFFECT_NULL);
85 
92  void play(const AudioTrigger &trigger, const Coordinate3D &position, int effect = AL_EFFECT_NULL);
93 
99  void setMuted(bool isMuted);
100 
104  void stopAll();
105 
109  void prune();
110 
116  AudioMixer();
117  ~AudioMixer();
118  AudioMixer(const AudioMixer &) = delete;
119  AudioMixer(AudioMixer &&) = delete;
120  AudioMixer &operator=(const AudioMixer &) = delete;
121  AudioMixer &operator=(AudioMixer &&) = delete;
122 
124  enum class ORIENTATION_INDEX : int
125  {
126  FORWARD_X = 0,
127  FORWARD_Y = 1,
128  FORWARD_Z = 2,
129  UP_X = 3,
130  UP_Y = 4,
131  UP_Z = 5
132  };
133 
135  enum class POSITION_INDEX : int
136  {
137  X = 0,
138  Y = 1,
139  Z = 2
140  };
141 
142 private:
147 
151  Array<Vector<SoundtrackID>, AudioTrigger::_size()> m_Triggers;
152 
157 
162 
163  /* Helpers */
164 
168  const char *get_al_error_msg(ALenum error);
169 
175  void playSoundtrack(SoundtrackUPtr &soundtrack);
176 
184  void playSoundtrackWithEffect(SoundtrackUPtr &soundtrack, int ALEffect);
189  void onTrackFinished(int channelID);
190 
194  static std::function<void(int)> onTrackFinishedFunc;
195 
201  static void onTrackFinishedFuncPtr(int channelID) { onTrackFinishedFunc(channelID); }
202 
203  SoundtrackUPtr &getTrack(const AudioTrigger &trigger);
205 
206  friend class Game;
207 
208  //OpenAL Soft sound setup variables
212  ALCdevice *gAudioDevice;
213 
217  ALCcontext *alContext;
218 };
219 
220 #endif
AudioMixer::ORIENTATION_INDEX::FORWARD_Z
@ FORWARD_Z
AudioMixer::getTrack
SoundtrackUPtr & getTrack(const AudioTrigger &trigger)
Definition: AudioMixer.cxx:106
StrongType< string, struct SoundtrackIDTag >
AudioMixer::POSITION_INDEX::X
@ X
Constant
Constant::value returns the value.
AudioMixer
Definition: AudioMixer.hxx:43
AudioMixer::stopAll
void stopAll()
Stops all soundtracks.
Definition: AudioMixer.cxx:213
AudioMixer::POSITION_INDEX::Y
@ Y
AudioMixer::onTrackFinishedFunc
static std::function< void(int)> onTrackFinishedFunc
Definition: AudioMixer.hxx:194
AudioMixer::Game
friend class Game
Definition: AudioMixer.hxx:206
AudioMixer::ORIENTATION_INDEX::FORWARD_Y
@ FORWARD_Y
AudioMixer::setMusicVolume
void setMusicVolume(float volume)
sets the music volume
Definition: AudioMixer.cxx:139
int
int
Definition: tileData.hxx:57
AudioConfig.hxx
AudioMixer::playSoundtrack
void playSoundtrack(SoundtrackUPtr &soundtrack)
Plays the Soundtrack.
Definition: AudioMixer.cxx:259
Coordinate3D
a 3-dimensional coordinate
Definition: AudioMixer.hxx:35
SoundtrackUPtr
std::unique_ptr< Soundtrack > SoundtrackUPtr
Definition: Soundtrack.hxx:98
AudioMixer::onTrackFinished
void onTrackFinished(int channelID)
Called whenever a Channel has finished playing.
Definition: AudioMixer.cxx:378
AudioMixer::onTrackFinishedFuncPtr
static void onTrackFinishedFuncPtr(int channelID)
Definition: AudioMixer.hxx:201
AudioMixer::m_Soundtracks
Vector< SoundtrackUPtr > m_Soundtracks
All the available soundtracks.
Definition: AudioMixer.hxx:146
Vector
std::vector< Type > Vector
Definition: AudioConfig.hxx:15
AudioMixer::ORIENTATION_INDEX::UP_Y
@ UP_Y
Soundtrack.hxx
Coordinate3D::y
double y
Definition: AudioMixer.hxx:37
Coordinate3D::x
double x
Definition: AudioMixer.hxx:37
AudioMixer::setMuted
void setMuted(bool isMuted)
toggles the mute option for sounds
Definition: AudioMixer.cxx:211
AudioMixer::ORIENTATION_INDEX::UP_Z
@ UP_Z
AudioMixer::setSoundEffectVolume
void setSoundEffectVolume(float volume)
sets the sound effects volume
Definition: AudioMixer.cxx:149
AudioMixer::playSoundtrackWithEffect
void playSoundtrackWithEffect(SoundtrackUPtr &soundtrack, int ALEffect)
Plays the Soundtrack with a certain effect applied.
Definition: AudioMixer.cxx:299
List
std::list< Type > List
Definition: AudioMixer.hxx:27
Mapping
std::unordered_map< Key, Value > Mapping
Definition: AudioConfig.hxx:13
AudioMixer::POSITION_INDEX
POSITION_INDEX
position of listener
Definition: AudioMixer.hxx:135
AudioMixer::prune
void prune()
Updates soundtracks that are no longer playing.
Definition: AudioMixer.cxx:230
Singleton
Abstract Singleton implementation.
Definition: Singleton.hxx:8
AudioMixer::ORIENTATION_INDEX::UP_X
@ UP_X
AudioMixer::m_Playing
List< SoundtrackUPtr * > m_Playing
All the currently playing Soundtracks.
Definition: AudioMixer.hxx:161
AudioMixer::ORIENTATION_INDEX
ORIENTATION_INDEX
orientation of listener
Definition: AudioMixer.hxx:124
string
std::string string
Definition: AudioMixer.hxx:24
AudioMixer::POSITION_INDEX::Z
@ Z
AudioMixer::alContext
ALCcontext * alContext
OpenAL Soft setup, context of where audio is played.
Definition: AudioMixer.hxx:217
AudioMixer::play
void play(const SoundtrackID &id, int effect=AL_EFFECT_NULL)
Plays a Soundtrack given its ID and optionally applies an effect.
Definition: AudioMixer.cxx:158
AudioMixer::ORIENTATION_INDEX::FORWARD_X
@ FORWARD_X
AudioMixer::get_al_error_msg
const char * get_al_error_msg(ALenum error)
Get a descriptive error message from an error code.
Definition: AudioMixer.cxx:396
AudioMixer::~AudioMixer
~AudioMixer()
Definition: AudioMixer.cxx:91
AudioMixer::AudioMixer
AudioMixer()
Definition: AudioMixer.cxx:21
Coordinate3D::z
double z
Definition: AudioMixer.hxx:37
AudioMixer::m_Triggers
Array< Vector< SoundtrackID >, AudioTrigger::_size()> m_Triggers
A Mapping between triggers and SoundtrackID.
Definition: AudioMixer.hxx:151
Array
std::array< Type, N > Array
Definition: AudioMixer.cxx:17
Set
std::unordered_set< Type > Set
Definition: AudioMixer.hxx:26
AudioMixer::gAudioDevice
ALCdevice * gAudioDevice
OpenAL Soft setup, audio device to be used.
Definition: AudioMixer.hxx:212
AudioMixer::operator=
AudioMixer & operator=(const AudioMixer &)=delete
AudioMixer::m_GetSound
Mapping< SoundtrackID, SoundtrackUPtr * > m_GetSound
A Mapping between SoundtrackID and Soundtrack.
Definition: AudioMixer.hxx:156