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