vectozavr-shooter/engine/SoundController.cpp

82 lines
2.1 KiB
C++
Raw Normal View History

2021-10-17 19:38:16 +03:00
//
// Created by Иван Ильин on 17.10.2021.
//
#include "SoundController.h"
#include "ResourceManager.h"
#include "utils/Log.h"
2021-10-17 19:38:16 +03:00
SoundController* SoundController::_instance = nullptr;
2021-10-29 23:44:37 +03:00
bool SoundController::_validInstance = false;
2021-10-17 19:38:16 +03:00
void SoundController::init() {
_instance = new SoundController();
2021-10-29 23:44:37 +03:00
_validInstance = true;
Log::log("SoundController::init(): sound controller was initialized");
2021-10-17 19:38:16 +03:00
}
void SoundController::playSound(const SoundTag& soundTag, const std::string& filename) {
2021-10-29 23:44:37 +03:00
if(!_validInstance) {
2021-10-17 19:38:16 +03:00
return;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
if(_instance->_sounds.count(soundTag) == 0) {
_instance->_sounds.emplace(soundTag, sf::Sound(*ResourceManager::loadSoundBuffer(filename)));
}
2021-10-17 19:38:16 +03:00
_instance->_sounds[soundTag].play();
Log::log("SoundController::playSound(): play sound '" + soundTag.str() + "'");
2021-10-17 19:38:16 +03:00
}
void SoundController::pauseSound(const SoundTag& soundTag) {
2021-10-29 23:44:37 +03:00
if(!_validInstance) {
2021-10-17 19:38:16 +03:00
return;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
if(_instance->_sounds.count(soundTag) > 0) {
_instance->_sounds[soundTag].pause();
}
Log::log("SoundController::pauseSound(): sound '" + soundTag.str() + "' was paused");
2021-10-17 19:38:16 +03:00
}
void SoundController::stopSound(const SoundTag& soundTag) {
2021-10-29 23:44:37 +03:00
if(!_validInstance) {
2021-10-17 19:38:16 +03:00
return;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
if(_instance->_sounds.count(soundTag) > 0) {
_instance->_sounds[soundTag].stop();
}
Log::log("SoundController::stopSound(): sound '" + soundTag.str() + "' was stopped");
2021-10-17 19:38:16 +03:00
}
sf::Sound::Status SoundController::getStatus(const SoundTag& soundTag) {
2021-10-29 23:44:37 +03:00
if(!_validInstance) {
2021-10-17 19:38:16 +03:00
return sf::Sound::Status::Stopped;
2021-10-28 16:58:02 +03:00
}
2021-10-17 19:38:16 +03:00
2021-10-28 16:58:02 +03:00
if(_instance->_sounds.count(soundTag) > 0) {
2021-10-17 19:38:16 +03:00
return _instance->_sounds[soundTag].getStatus();
2021-10-28 16:58:02 +03:00
} else {
2021-10-17 19:38:16 +03:00
return sf::Sound::Status::Stopped;
}
2021-10-17 19:38:16 +03:00
}
void SoundController::free() {
2021-10-29 23:44:37 +03:00
if(_validInstance) {
for(auto& [soundTag, sound] : _instance->_sounds) {
stopSound(soundTag);
2021-10-29 23:44:37 +03:00
}
_instance->_sounds.clear();
2021-10-17 19:38:16 +03:00
}
2021-10-29 23:44:37 +03:00
_validInstance = false;
2021-10-17 19:38:16 +03:00
delete _instance;
Log::log("SoundController::free(): pointer to 'SoundController' was freed");
2021-10-17 19:38:16 +03:00
}