Cornell Cocos
Cornell Extensions to Cocos2d
CUSoundEngine.h
1 //
2 // CUSoundEngine.h
3 // Cornell Extensions to Cocos2D
4 //
5 // This module provides a robust sound engine for Cocos2d applications. It is built on top of
6 // the new experimental AudioEngine, making it a lot more user friendly. It provides all of
7 // the functionality of SimpleAudioEngine except pan and pitch control. As there is no true
8 // cross platform support for either of these (they are usually ignored on non-Apple platforms)
9 // this should not be a problem.
10 //
11 // IMPORTANT: It is absolutely crucial on iOS that all sounds have exactly the same format.
12 // The same file format, the same sampling rate, the same number of channels. Any change in
13 // format requires a reconfiguration of the mixer graph, and this can cause clipping and/or
14 // distortion for rapid-fire sound effects.
15 //
16 // Author: Walker White
17 // Version: 12/10/15
18 //
19 #ifndef __CU_SOUND_ENGINE_H__
20 #define __CU_SOUND_ENGINE_H__
21 
22 #include <audio/include/AudioEngine.h>
23 
24 NS_CC_BEGIN
25 
26 class Sound;
27 
28 #define AENG experimental::AudioEngine
29 
45 class CC_DLL SoundEngine {
46 public:
47 
48 #pragma mark -
49 #pragma mark Sound Packet
50 
57  class SoundPacket {
58  public:
64  const std::string getKey() const { return _key; }
65 
71  const Sound* getSound() const { return _sound; }
72 
78  SoundPacket(const SoundPacket& data) :
79  SoundPacket(data._key, data._sound, data._loop, data._volume) {}
80 
85 
86  protected:
88  std::string _key;
89 
92 
94  bool _loop;
95 
97  float _volume;
98 
100  int _sndid;
101 
110  SoundPacket(const std::string& k, Sound* s, bool l, float v) :
111  _sndid(-1), _sound(s), _key(k), _loop(l), _volume(v) {}
112 
116  SoundPacket() : _sndid(-1), _sound(nullptr), _key(""), _loop(false), _volume(0.0f) {}
117 
123  void set(const SoundPacket& data) {
124  _sound = data._sound; _key = data._key; _loop = data._loop; _volume = data._volume;
125  }
126 
128  friend class SoundEngine;
129  };
130 
131 
132 #pragma mark -
133 #pragma mark Sound State
134 
140  enum class SoundState {
142  INACTIVE,
144  LOADING,
146  PLAYING,
148  PAUSED
149  };
150 
151 
152 #pragma mark -
153 #pragma mark Sound Engine
154 protected:
157 
159  experimental::AudioProfile* _musicProfile;
161  experimental::AudioProfile* _effectProfile;
162 
166  std::deque<SoundPacket*> _mqueue;
167 
171  std::unordered_map<std::string,int> _effectIDs;
173  std::deque<std::string> _equeue;
174 
175 
176 #pragma mark Allocation
177 
182  SoundEngine() : _musicData(nullptr), _musicProfile(nullptr), _effectProfile(nullptr), _effectData(nullptr) {}
183 
189  ~SoundEngine() { dispose(); }
190 
199  bool init();
200 
206  void dispose();
207 
211  void clearQueue();
212 
213 
214 #pragma mark Audio Helpers
215 
223  void playMusic(SoundPacket* data);
224 
238  void playEffect(SoundPacket* data, bool force=false);
239 
247  static SoundState convertAudioState(AENG::AudioState state);
248 
258  void gcMusic(int id);
259 
269  void gcEffect(int id, const std::string key);
270 
271 
272 public:
273 #pragma mark Static Accessors
274 
281  static SoundEngine* getInstance() { return _gEngine; }
282 
290  static void start();
291 
298  static void stop();
299 
300 
301 #pragma mark -
302 #pragma mark Music Management
303 
320  void playMusic(Sound* sound, bool loop=false, float volume=1.0);
321 
329  const Sound* currentMusic() const { return (_musicData->_sndid != -1 ? _musicData->_sound : nullptr); }
330 
336  SoundState getMusicState() const;
337 
345  bool isMusicLoop() const { return _musicData->_sndid != -1 && _musicData->_loop; }
346 
357  void setMusicLoop(bool loop); // Clears the queue
358 
366  bool getMusicVolume() const { return (_musicData->_sndid != -1 ? _musicData->_volume : 0.0f); }
367 
375  void setMusicVolume(float volume);
376 
386  float getMusicDuration() const {
387  return _musicData->_sndid != -1 ? AENG::getDuration(_musicData->_sndid) : 0.0f;
388  }
389 
399  float getMusicElapsed() const {
400  return _musicData->_sndid != -1 ? AENG::getCurrentTime(_musicData->_sndid) : 0.0f;
401  }
402 
412  float getMusicRemaining() const {
413  return _musicData->_sndid != -1 ?
414  AENG::getDuration(_musicData->_sndid)-AENG::getCurrentTime(_musicData->_sndid) :
415  0.0f;
416  }
417 
428  void setMusicElapsed(float time);
429 
442  void setMusicRemaining(float time);
443 
451  void stopMusic();
452 
458  void pauseMusic();
459 
463  void resumeMusic();
464 
470  void restartMusic();
471 
472 
473 #pragma mark Music Queue
474 
494  void queueMusic(Sound* sound, bool loop=false, float volume=1.0);
495 
501  const std::vector<const Sound*> getMusicQueue() const;
502 
508  size_t getMusicQueueSize() const { return _mqueue.size(); }
509 
520  void skipMusicQueue(unsigned int steps=0);
521 
522 
523 #pragma mark -
524 #pragma mark Sound Effect Management
525 
548  void playEffect(std::string key, Sound* sound, bool loop=false, float volume=1.0f, bool force=false);
549 
559  int getAvailableChannels() { return _effectProfile->maxInstances-(int)_effectIDs.size(); }
560 
568  bool isActiveEffect(std::string key) const { return _effectIDs.find(key) != _effectIDs.end(); }
569 
579  SoundState getEffectState(std::string key) const;
580 
590  bool isEffectLoop(std::string key) const;
591 
600  void setEffectLoop(std::string key, bool loop);
601 
611  float getEffectVolume(std::string key) const;
612 
621  void setEffectVolume(std::string key, float volume);
622 
634  float getEffectDuration(std::string key) const;
635 
648  float getEffectElapsed(std::string key) const;
649 
662  float getEffectRemaining(std::string key) const;
663 
675  void setEffectElapsed(std::string key, float time);
676 
688  void setEffectRemaining(std::string key, float time);
689 
699  void stopEffect(std::string key);
700 
708  void pauseEffect(std::string key);
709 
717  void resumeEffect(std::string key);
718 
726  void restartEffect(std::string key);
727 
733  void stopAllEffects();
734 
738  void pauseAllEffects();
739 
743  void resumeAllEffects();
744 
745 
746 #pragma mark -
747 #pragma mark Global Management
748 
755  void stopAll();
756 
760  void pauseAll();
761 
765  void resumeAll();
766 };
767 
768 NS_CC_END
769 #endif /* defined(__CU_SOUND_ENGINE_H__) */
size_t getMusicQueueSize() const
Definition: CUSoundEngine.h:508
~SoundPacket()
Definition: CUSoundEngine.h:84
float getMusicElapsed() const
Definition: CUSoundEngine.h:399
Definition: CUSound.h:42
float _volume
Definition: CUSoundEngine.h:97
std::deque< std::string > _equeue
Definition: CUSoundEngine.h:173
int getAvailableChannels()
Definition: CUSoundEngine.h:559
SoundEngine()
Definition: CUSoundEngine.h:182
SoundPacket ** _effectData
Definition: CUSoundEngine.h:169
experimental::AudioProfile * _effectProfile
Definition: CUSoundEngine.h:161
bool isMusicLoop() const
Definition: CUSoundEngine.h:345
const Sound * getSound() const
Definition: CUSoundEngine.h:71
std::unordered_map< std::string, int > _effectIDs
Definition: CUSoundEngine.h:171
SoundState
Definition: CUSoundEngine.h:140
bool getMusicVolume() const
Definition: CUSoundEngine.h:366
Definition: CUSoundEngine.h:57
SoundPacket(const std::string &k, Sound *s, bool l, float v)
Definition: CUSoundEngine.h:110
SoundPacket(const SoundPacket &data)
Definition: CUSoundEngine.h:78
const std::string getKey() const
Definition: CUSoundEngine.h:64
experimental::AudioProfile * _musicProfile
Definition: CUSoundEngine.h:159
static SoundEngine * getInstance()
Definition: CUSoundEngine.h:281
bool isActiveEffect(std::string key) const
Definition: CUSoundEngine.h:568
Sound * _sound
Definition: CUSoundEngine.h:91
std::string _key
Definition: CUSoundEngine.h:88
~SoundEngine()
Definition: CUSoundEngine.h:189
std::deque< SoundPacket * > _mqueue
Definition: CUSoundEngine.h:166
SoundPacket * _musicData
Definition: CUSoundEngine.h:164
float getMusicDuration() const
Definition: CUSoundEngine.h:386
float getMusicRemaining() const
Definition: CUSoundEngine.h:412
int _sndid
Definition: CUSoundEngine.h:100
void set(const SoundPacket &data)
Definition: CUSoundEngine.h:123
const Sound * currentMusic() const
Definition: CUSoundEngine.h:329
SoundPacket()
Definition: CUSoundEngine.h:116
Definition: CUSoundEngine.h:45
static SoundEngine * _gEngine
Definition: CUSoundEngine.h:156
bool _loop
Definition: CUSoundEngine.h:94