#include "mixer.h" #include void Mixer::playSound(std::string_view filename) { Mix_Chunk* chunk = getChunkByFilename(std::string(filename)); int ret = Mix_PlayChannel(-1, chunk, 0); if (ret == -1) { throw mix_error(); } Mix_Volume(ret, soundVolume_); } int Mixer::loopSound(std::string_view filename) { Mix_Chunk* chunk = getChunkByFilename(std::string(filename)); int ret = Mix_PlayChannel(-1, chunk, -1); if (ret == -1) { throw mix_error(); } Mix_Volume(ret, soundVolume_); return ret; } void Mixer::stopChannel(int channel) { Mix_HaltChannel(channel); } void Mixer::pauseSounds() { Mix_Pause(-1); } void Mixer::unpauseSounds() { Mix_Resume(-1); } void Mixer::setSoundVolume(int vol) { soundVolume_ = MIX_MAX_VOLUME / 10.0 * vol; Mix_Volume(-1, soundVolume_); } void Mixer::playMusic(std::string_view name, int ms) { Mix_Music* song = getMusicByName(name); int ret; if (ms == 0) { ret = Mix_PlayMusic(song, -1); } else { ret = Mix_FadeInMusic(song, -1, ms); } if (ret == -1) { throw mix_error(); } playingTrack_ = name; } void Mixer::fadeoutMusic(int ms) { if (Mix_FadeOutMusic(ms) == 0) { throw mix_error(); } playingTrack_ = ""; } void Mixer::muteMusic() { Mix_VolumeMusic(0); musicMuted_ = true; } void Mixer::unmuteMusic() { Mix_VolumeMusic(musicVolume_); musicMuted_ = false; } void Mixer::setMusicVolume(int vol) { musicVolume_ = MIX_MAX_VOLUME / 10.0 * vol; musicMuted_ = false; Mix_VolumeMusic(musicVolume_); } void Mixer::pauseMusic() { Mix_PauseMusic(); } void Mixer::unpauseMusic() { Mix_ResumeMusic(); } Mix_Chunk* Mixer::getChunkByFilename(std::string filename) { if (!sounds_.count(filename)) { Mix_Chunk* sample = Mix_LoadWAV(filename.c_str()); if (!sample) { throw mix_error(); } sounds_[filename] = chunk_ptr(sample); } return sounds_[filename].get(); } Mix_Music* Mixer::getMusicByName(std::string_view name) { std::string filename = "../res/music/" + std::string(name) + ".wav"; if (!music_.count(filename)) { Mix_Music* song = Mix_LoadMUS(filename.c_str()); if (!song) { throw mix_error(); } music_[filename] = music_ptr(song); } return music_[filename].get(); }