1 #ifndef __SOUNDMANAGER_H_
2 #define __SOUNDMANAGER_H_
3 
4 #include "../Singleton.h"
5 
6 #include <SDL_mixer.h>
7 #include <cstdint>
8 #include <string>
9 #include <vector>
10 
11 #define SAMPLE_RATE 44100
12 
13 namespace NXE
14 {
15 namespace Sound
16 {
17 
18 enum class SFX : uint16_t
19 {
20   SND_NULL             = 0,
21   SND_MENU_MOVE        = 1,
22   SND_MSG              = 2,
23   SND_BONK_HEAD        = 3,
24   SND_SWITCH_WEAPON    = 4,
25   SND_MENU_PROMPT      = 5,
26   SND_HOPPY_JUMP       = 6,
27   SND_DOOR             = 11,
28   SND_BLOCK_DESTROY    = 12,
29   SND_GET_XP           = 14,
30   SND_PLAYER_JUMP      = 15,
31   SND_PLAYER_HURT      = 16,
32   SND_PLAYER_DIE       = 17,
33   SND_MENU_SELECT      = 18,
34   SND_HEALTH_REFILL    = 20,
35   SND_BUBBLE           = 21,
36   SND_CHEST_OPEN       = 22,
37   SND_THUD             = 23,
38   SND_PLAYER_WALK      = 24,
39   SND_FUNNY_EXPLODE    = 25,
40   SND_QUAKE            = 26,
41   SND_LEVEL_UP         = 27,
42   SND_SHOT_HIT         = 28,
43   SND_TELEPORT         = 29,
44   SND_ENEMY_JUMP       = 30,
45   SND_TINK             = 31,
46   SND_POLAR_STAR_L1_2  = 32,
47   SND_SNAKE_FIRE       = 33,
48   SND_FIREBALL         = 34,
49   SND_EXPLOSION1       = 35,
50   SND_GUN_CLICK        = 37,
51   SND_GET_ITEM         = 38,
52   SND_EM_FIRE          = 39,
53   SND_STREAM1          = 40,
54   SND_STREAM2          = 41,
55   SND_GET_MISSILE      = 42,
56   SND_COMPUTER_BEEP    = 43,
57   SND_MISSILE_HIT      = 44,
58   SND_XP_BOUNCE        = 45,
59   SND_IRONH_SHOT_FLY   = 46,
60   SND_EXPLOSION2       = 47,
61   SND_BUBBLER_FIRE     = 48,
62   SND_POLAR_STAR_L3    = 49,
63   SND_ENEMY_SQUEAK     = 50,
64   SND_ENEMY_HURT       = 51,
65   SND_ENEMY_HURT_BIG   = 52,
66   SND_ENEMY_HURT_SMALL = 53,
67   SND_ENEMY_HURT_COOL  = 54,
68   SND_ENEMY_SQUEAK2    = 55,
69   SND_SPLASH           = 56,
70   SND_ENEMY_DAMAGE     = 57,
71   SND_PROPELLOR        = 58,
72   SND_SPUR_CHARGE_1    = 59,
73   SND_SPUR_CHARGE_2    = 60,
74   SND_SPUR_CHARGE_3    = 61,
75   SND_SPUR_FIRE_1      = 62,
76   SND_SPUR_FIRE_2      = 63,
77   SND_SPUR_FIRE_3      = 64,
78   SND_SPUR_MAXED       = 65,
79   SND_EXPL_SMALL       = 70,
80   SND_LITTLE_CRASH     = 71,
81   SND_BIG_CRASH        = 72,
82   SND_BUBBLER_LAUNCH   = 100,
83   SND_LIGHTNING_STRIKE = 101,
84   SND_JAWS             = 102,
85   SND_CHARGE_GUN       = 103,
86   SND_104              = 104,
87   SND_PUPPY_BARK       = 105,
88   SND_SLASH            = 106,
89   SND_BLOCK_MOVE       = 107,
90   SND_IGOR_JUMP        = 108,
91   SND_CRITTER_FLY      = 109,
92   SND_DROLL_SHOT_FLY   = 110,
93   SND_MOTOR_RUN        = 111,
94   SND_MOTOR_SKIP       = 112,
95   SND_BOOSTER          = 113,
96   SND_CORE_HURT        = 114,
97   SND_CORE_THRUST      = 115,
98   SND_CORE_CHARGE      = 116,
99   SND_NEMESIS_FIRE     = 117,
100   // drums
101   SND_DRUM_BASS = 150,
102   SND_DRUM_SNARE = 151,
103   SND_DRUM_HICLOSE = 152,
104   SND_DRUM_HIOPEN = 153,
105   SND_DRUM_TOM = 154,
106   SND_DRUM_PERCUSSION = 155
107 };
108 
109 class SoundManager
110 {
111 
112 public:
113   static SoundManager *getInstance();
114 
115   bool init();
116   void shutdown();
117 
118   void playSfx(NXE::Sound::SFX snd, int32_t loop = 0);
119   void playSfxResampled(NXE::Sound::SFX snd, uint32_t percent);
120   void stopSfx(NXE::Sound::SFX snd);
121 
122   void startStreamSound(int32_t freq);
123   void startPropSound();
124   void stopLoopSfx();
125 
126   void music(uint32_t songno, bool resume = false);
127   void enableMusic(int newstate);
128   void setNewmusic(int newstate);
129 
130   uint32_t currentSong();
131   uint32_t lastSong();
132   void fadeMusic();
133   void runFade();
134   void pause();
135   void resume();
136   void updateMusicVolume();
137   void updateSfxVolume();
138   std::vector<std::string> &music_dir_names();
139 
140 protected:
141   friend class Singleton<SoundManager>;
142 
143   SoundManager();
144   ~SoundManager();
145   SoundManager(const SoundManager &) = delete;
146   SoundManager &operator=(const SoundManager &) = delete;
147 
148 private:
149   bool _shouldMusicPlay(uint32_t songno, uint32_t musicmode);
150   bool _musicIsBoss(uint32_t songno);
151   void _start_org_track(int songno, bool resume);
152   void _start_ogg_track(int songno, bool resume, std::string dir);
153   void _reloadTrackList();
154 
155   uint32_t _lastSong    = 0;
156   uint32_t _lastSongPos = 0;
157   uint32_t _currentSong = 0;
158   bool _songlooped      = false;
159 
160   std::vector<std::string> _music_names;
161   std::vector<bool> _music_loop;
162   std::vector<std::string> _music_dirs;
163   std::vector<std::string> _music_dir_names;
164   std::vector<std::string> _music_playlists;
165 
166   const char _bossmusic[14] = {4, 7, 10, 11, 15, 16, 17, 18, 21, 22, 31, 33, 35, 0};
167 };
168 
169 
170 
171 } // namespace Sound
172 } // namespace NXE
173 #endif
174