CUGL 1.2
Cornell University Game Library
All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends
CUAudioChannels.h
1 //
2 // CUAudioEngine.h
3 // Cornell University Game Library (CUGL)
4 //
5 // This module is a singleton providing a legacy (2000-era) audio engine. Like
6 // all engines of this era, it provides a flat channel structure for playing
7 // sounds as well as a single channel for background music. This is much
8 // more primitive than modern sound engines, with the advantage that it is
9 // simpler to use.
10 //
11 // Because this is a singleton, there are no publicly accessible constructors
12 // or intializers. Use the static methods instead. This singleton should be
13 // used instead of AudioManager, and not used at the same time as it.
14 //
15 // This engine has been refactored to take advantage of our more modern audio
16 // graph backend. However, we have kept the legacy API for backwards
17 // compatibility with older versions of CUGL. The mixer graph behind the
18 // scenes is a little complicated because we make heavy use of AudioFader.
19 // This is to prevent the audible "clicking" that comes when sound is stopped
20 // or paused, and was a major problem with OpenAL.
21 //
22 // CUGL MIT License:
23 //
24 // This software is provided 'as-is', without any express or implied
25 // warranty. In no event will the authors be held liable for any damages
26 // arising from the use of this software.
27 //
28 // Permission is granted to anyone to use this software for any purpose,
29 // including commercial applications, and to alter it and redistribute it
30 // freely, subject to the following restrictions:
31 //
32 // 1. The origin of this software must not be misrepresented; you must not
33 // claim that you wrote the original software. If you use this software
34 // in a product, an acknowledgment in the product documentation would be
35 // appreciated but is not required.
36 //
37 // 2. Altered source versions must be plainly marked as such, and must not
38 // be misrepresented as being the original software.
39 //
40 // 3. This notice may not be removed or altered from any source distribution.
41 //
42 // Author: Walker White
43 // Version: 12/20/18
44 //
45 #ifndef __CU_AUDIO_CHANNELS_H__
46 #define __CU_AUDIO_CHANNELS_H__
47 #include <cugl/audio/CUAudioManager.h>
48 #include <cugl/audio/CUSound.h>
49 #include <cugl/util/CUTimestamp.h>
50 #include <unordered_map>
51 #include <functional>
52 #include <vector>
53 #include <deque>
54 #include <queue>
55 
57 #define DEFAULT_FADE 0.015
58 
59 namespace cugl {
61  namespace audio {
62  class AudioOutput;
63  class AudioScheduler;
64  class AudioMixer;
65  class AudioFader;
66  class AudioPanner;
67  }
115 #pragma mark Sound State
116 public:
120  enum class State {
122  INACTIVE,
124  PLAYING,
126  PAUSED
127  };
128 
129 private:
131  static AudioChannels* _gEngine;
132 
134  unsigned int _capacity;
136  std::unordered_map<std::string,std::shared_ptr<audio::AudioFader>> _effects;
138  std::deque<std::string> _equeue;
140  //std::deque<std::string,> _equeue;
141 
143  std::shared_ptr<audio::AudioOutput> _output;
145  std::shared_ptr<audio::AudioMixer> _mixer;
147  std::vector<std::shared_ptr<audio::AudioScheduler>> _channel;
149  std::vector<std::shared_ptr<audio::AudioFader>> _chfader;
150 
152  std::deque<std::shared_ptr<audio::AudioFader>> _fadePool;
154  std::deque<std::shared_ptr<audio::AudioPanner>> _pan1Pool;
156  std::deque<std::shared_ptr<audio::AudioPanner>> _pan2Pool;
157 
169  std::function<void(Sound* asset, bool status)> _musicCB;
170 
182  std::function<void(const std::string& key , bool status)> _soundCB;
183 
184 #pragma mark -
185 #pragma mark Constructors (Private)
186 
191  AudioChannels();
192 
199  ~AudioChannels() { dispose(); }
200 
210  bool init();
211 
223  bool init(Uint32 slots);
224 
231  void dispose();
232 
233 
234 #pragma mark -
235 #pragma mark Internal Helpers
236 
244  void removeKey(std::string key);
245 
258  std::shared_ptr<audio::AudioFader> wrapInstance(const std::shared_ptr<Sound>& asset);
259 
272  std::shared_ptr<Sound> accessInstance(const std::shared_ptr<audio::AudioNode>& node) const;
273 
286  std::shared_ptr<Sound> disposeInstance(const std::shared_ptr<audio::AudioNode>& node);
287 
299  void gcMusic(const std::shared_ptr<audio::AudioNode>& sound, bool status);
300 
314  void gcEffect(const std::shared_ptr<audio::AudioNode>& sound, bool status);
315 
316 #pragma mark -
317 #pragma mark Static Accessors
318 public:
327  static AudioChannels* get() { return _gEngine; }
328 
356  static void start(Uint32 slots);
357 
387  static void start(Uint32 channels, Uint32 buffer);
388 
396  static void stop();
397 
398 
399 #pragma mark -
400 #pragma mark Music Playback
401 
425  void playMusic(const std::shared_ptr<Sound>& music, bool loop=false,
426  float volume=-1.0f, float fade=0.0f);
427 
435  const Sound* currentMusic() const;
436 
442  State getMusicState() const;
443 
451  bool isMusicLoop() const;
452 
464  void setMusicLoop(bool loop);
465 
474  float getMusicVolume() const;
475 
484  void setMusicVolume(float volume);
485 
500  float getMusicPan() const;
501 
516  void setMusicPan(float pan);
517 
530  float getMusicDuration() const;
531 
547  float getMusicElapsed() const;
548 
565  float getMusicRemaining() const;
566 
583  void setMusicElapsed(float time);
584 
602  void setMusicRemaining(float time);
603 
617  void stopMusic(float fade=DEFAULT_FADE);
618 
632  void pauseMusic(float fade=DEFAULT_FADE);
633 
639  void resumeMusic();
640 
651  void setMusicListener(std::function<void(Sound*,bool)> callback) {
652  _musicCB = callback;
653  }
654 
665  std::function<void(Sound*,bool)> getMusicListener() const {
666  return _musicCB;
667  }
668 
669 #pragma mark -
670 #pragma mark Music Queue Management
671 
695  void queueMusic(const std::shared_ptr<Sound>& music, bool loop=false,
696  float volume=-1.0f, float fade=0.0f);
697 
703  const std::vector<Sound*> getMusicQueue() const;
704 
710  size_t getMusicPending() const;
711 
727  float getOverlap() const;
728 
744  void setOverlap(double time);
745 
762  void advanceMusicQueue(float fade=DEFAULT_FADE,unsigned int steps=0);
763 
770  void clearMusicQueue();
771 
772 
773 #pragma mark -
774 #pragma mark Sound Effect Management
775 
799  bool playEffect(const std::string& key, const std::shared_ptr<Sound>& sound,
800  bool loop=false, float volume=-1.0f, bool force=false);
801 
826  bool playEffect(const char* key, const std::shared_ptr<Sound>& sound,
827  bool loop=false, float volume=1.0f, bool force=false) {
828  return playEffect(std::string(key),sound,loop,volume,force);
829  }
830 
841  size_t getAvailableChannels() const {
842  return (size_t)_capacity-_effects.size();
843  }
844 
855  State getEffectState(const std::string& key) const;
856 
867  State getEffectState(const char* key) const {
868  return getEffectState(std::string(key));
869  }
870 
878  bool isActiveEffect(const std::string& key) const {
879  return _effects.find(key) != _effects.end();
880  }
881 
889  bool isActiveEffect(const char* key) const {
890  return isActiveEffect(std::string(key));
891  }
892 
903  const Sound* currentEffect(const std::string& key) const;
904 
915  const Sound* currentEffect(const char* key) const {
916  return currentEffect(std::string(key));
917  }
918 
928  bool isEffectLoop(const std::string& key) const;
929 
939  bool isEffectLoop(const char* key) const {
940  return isEffectLoop(std::string(key));
941  }
942 
951  void setEffectLoop(const std::string& key, bool loop);
952 
961  void setEffectLoop(const char* key, bool loop) {
962  setEffectLoop(std::string(key),loop);
963  }
964 
975  float getEffectVolume(const std::string& key) const;
976 
987  float getEffectVolume(const char* key) const {
988  return getEffectVolume(std::string(key));
989  }
990 
1001  void setEffectVolume(const std::string& key, float volume);
1002 
1013  void setEffectVolume(const char* key, float volume) {
1014  setEffectVolume(std::string(key),volume);
1015  }
1016 
1035  float getEffectPan(const std::string& key) const;
1036 
1055  float getEffectPan(const char* key) const {
1056  return getEffectPan(std::string(key));
1057  }
1058 
1076  void setEffectPan(const std::string& key, float pan);
1077 
1095  void setEffectPan(const char* key, float pan) {
1096  setEffectPan(std::string(key),pan);
1097  }
1098 
1111  float getEffectDuration(const std::string& key) const;
1112 
1125  float getEffectDuration(const char* key) const {
1126  return getEffectDuration(std::string(key));
1127  }
1128 
1143  float getEffectElapsed(const std::string& key) const;
1144 
1159  float getEffectElapsed(const char* key) const {
1160  return getEffectElapsed(std::string(key));
1161  }
1162 
1176  void setEffectElapsed(const std::string& key, float time);
1177 
1191  void setEffectElapsed(const char* key, float time) {
1192  setEffectElapsed(std::string(key),time);
1193  }
1194 
1209  float getEffectRemaining(const std::string& key) const;
1210 
1225  float getEffectRemaining(const char* key) const {
1226  return getEffectRemaining(std::string(key));
1227  }
1228 
1242  void setEffectRemaining(const std::string& key, float time);
1243 
1257  void setEffectRemaining(const char* key, float time) {
1258  setEffectRemaining(std::string(key),time);
1259  }
1260 
1278  void stopEffect(const std::string& key,float fade=DEFAULT_FADE);
1279 
1297  void stopEffect(const char* key,float fade=DEFAULT_FADE) {
1298  stopEffect(std::string(key));
1299  }
1300 
1315  void pauseEffect(const std::string& key,float fade=DEFAULT_FADE);
1316 
1331  void pauseEffect(const char* key,float fade=DEFAULT_FADE) {
1332  pauseEffect(std::string(key));
1333  }
1334 
1342  void resumeEffect(std::string key);
1343 
1351  void resumeEffect(const char* key) {
1352  resumeEffect(std::string(key));
1353  }
1354 
1368  void stopAllEffects(float fade=DEFAULT_FADE);
1369 
1383  void pauseAllEffects(float fade=DEFAULT_FADE);
1384 
1388  void resumeAllEffects();
1389 
1400  void setEffectListener(std::function<void(const std::string& key,bool)> callback) {
1401  _soundCB = callback;
1402  }
1403 
1414  std::function<void(const std::string& key,bool)> getEffectListener() const {
1415  return _soundCB;
1416  }
1417 
1418 #pragma mark -
1419 #pragma mark Global Management
1420 
1433  void stopAll(float fade=DEFAULT_FADE);
1434 
1449  void pauseAll(float fade=DEFAULT_FADE);
1450 
1457  void resumeAll();
1458 };
1459 
1460 }
1461 
1462 
1463 #endif /* __CU_AUDIO_CHANNELS_H__ */
Definition: CUSound.h:69
void stopAllEffects(float fade=DEFAULT_FADE)
float getEffectPan(const char *key) const
Definition: CUAudioChannels.h:1055
float getEffectPan(const std::string &key) const
void pauseAllEffects(float fade=DEFAULT_FADE)
void stopAll(float fade=DEFAULT_FADE)
float getEffectRemaining(const char *key) const
Definition: CUAudioChannels.h:1225
void pauseEffect(const char *key, float fade=DEFAULT_FADE)
Definition: CUAudioChannels.h:1331
float getEffectDuration(const std::string &key) const
float getMusicDuration() const
bool playEffect(const std::string &key, const std::shared_ptr< Sound > &sound, bool loop=false, float volume=-1.0f, bool force=false)
void resumeEffect(const char *key)
Definition: CUAudioChannels.h:1351
const Sound * currentEffect(const std::string &key) const
float getEffectElapsed(const std::string &key) const
float getEffectRemaining(const std::string &key) const
State
Definition: CUAudioChannels.h:120
State getMusicState() const
void setEffectElapsed(const char *key, float time)
Definition: CUAudioChannels.h:1191
void pauseMusic(float fade=DEFAULT_FADE)
void setMusicVolume(float volume)
void advanceMusicQueue(float fade=DEFAULT_FADE, unsigned int steps=0)
void stopEffect(const std::string &key, float fade=DEFAULT_FADE)
void setMusicRemaining(float time)
bool isActiveEffect(const char *key) const
Definition: CUAudioChannels.h:889
float getOverlap() const
size_t getAvailableChannels() const
Definition: CUAudioChannels.h:841
float getEffectVolume(const char *key) const
Definition: CUAudioChannels.h:987
void setMusicPan(float pan)
const Sound * currentEffect(const char *key) const
Definition: CUAudioChannels.h:915
void queueMusic(const std::shared_ptr< Sound > &music, bool loop=false, float volume=-1.0f, float fade=0.0f)
void stopEffect(const char *key, float fade=DEFAULT_FADE)
Definition: CUAudioChannels.h:1297
void setEffectVolume(const std::string &key, float volume)
void setMusicListener(std::function< void(Sound *, bool)> callback)
Definition: CUAudioChannels.h:651
bool isMusicLoop() const
const Sound * currentMusic() const
void setEffectPan(const std::string &key, float pan)
size_t getMusicPending() const
void setEffectRemaining(const char *key, float time)
Definition: CUAudioChannels.h:1257
void setMusicLoop(bool loop)
float getEffectDuration(const char *key) const
Definition: CUAudioChannels.h:1125
static void stop()
State getEffectState(const std::string &key) const
void setEffectVolume(const char *key, float volume)
Definition: CUAudioChannels.h:1013
std::function< void(Sound *, bool)> getMusicListener() const
Definition: CUAudioChannels.h:665
void setOverlap(double time)
void pauseEffect(const std::string &key, float fade=DEFAULT_FADE)
void setEffectRemaining(const std::string &key, float time)
bool playEffect(const char *key, const std::shared_ptr< Sound > &sound, bool loop=false, float volume=1.0f, bool force=false)
Definition: CUAudioChannels.h:826
bool isActiveEffect(const std::string &key) const
Definition: CUAudioChannels.h:878
void setEffectListener(std::function< void(const std::string &key, bool)> callback)
Definition: CUAudioChannels.h:1400
void resumeEffect(std::string key)
void pauseAll(float fade=DEFAULT_FADE)
float getMusicVolume() const
float getMusicElapsed() const
static void start(Uint32 slots)
void stopMusic(float fade=DEFAULT_FADE)
bool isEffectLoop(const std::string &key) const
void setMusicElapsed(float time)
void setEffectLoop(const std::string &key, bool loop)
float getEffectVolume(const std::string &key) const
const std::vector< Sound * > getMusicQueue() const
void playMusic(const std::shared_ptr< Sound > &music, bool loop=false, float volume=-1.0f, float fade=0.0f)
float getEffectElapsed(const char *key) const
Definition: CUAudioChannels.h:1159
std::function< void(const std::string &key, bool)> getEffectListener() const
Definition: CUAudioChannels.h:1414
float getMusicRemaining() const
Definition: CUAction.h:51
float getMusicPan() const
void setEffectPan(const char *key, float pan)
Definition: CUAudioChannels.h:1095
State getEffectState(const char *key) const
Definition: CUAudioChannels.h:867
bool isEffectLoop(const char *key) const
Definition: CUAudioChannels.h:939
Definition: CUAudioChannels.h:114
void setEffectElapsed(const std::string &key, float time)
void setEffectLoop(const char *key, bool loop)
Definition: CUAudioChannels.h:961