/* This file is part of Minitrem. Minitrem is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. Minitrem is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Minitrem. If not, see . */ #include "common.hpp" namespace audio { static std::list playing_sounds; static std::list ambient_sounds; void sound_t::load(const char *path) { printf("load %s\n", path); auto sound = sounds.emplace(sounds.end()); sound->loadFromFile(path); } void sound_t::play(void) { if (!sounds.size()) return; auto sound = playing_sounds.emplace(playing_sounds.end()); sound->setBuffer(sounds[rand() % sounds.size()]); sound->setVolume(volume * 100.0f); sound->setRelativeToListener(true); // disable spatialization sound->play(); } void sound_t::play_3d(v2f_t x) { if (!sounds.size()) return; auto sound = playing_sounds.emplace(playing_sounds.end()); sound->setBuffer(sounds[rand() % sounds.size()]); sound->setVolume(volume * 100.0f); sound->setPosition(x[0], x[1], 0.0f); sound->play(); } void ambient_t::load(const char *path) { printf("load %s\n", path); sound.openFromFile(path); sound.setLoop(true); ambient_sounds.push_back(this); } void update(v3f_t camera, bool paused) { // update 3D settings // the listener is looking down at the XY plane with +X pointing right // and +Y pointing down sf::Listener::setPosition(camera); sf::Listener::setDirection(0.0f, 0.0f, -1.0f); sf::Listener::setUpVector(0.0f, 1.0f, 0.0f); // remove sounds that finished playing from playing_sounds playing_sounds.remove_if( [](sf::Sound &sound) { return sound.getStatus() == sf::Sound::Stopped; }); // update ambient sounds (weights set by game) for (ambient_t *ambient : ambient_sounds) { v3f_t origin; if (paused) { if (ambient->playing) { ambient->sound.stop(); ambient->playing = false; } continue; } if (!ambient->playing) { ambient->sound.play(); ambient->playing = true; } origin[0] = ambient->origin[0]; origin[1] = ambient->origin[1]; origin[2] = 0.0f; ambient->sound.setPosition(origin); ambient->sound.setVolume(ambient->volume * ambient->weight * 100.0f); } } } // namespace audio