From 05f3de11d3e03e1c2c12919da5307c7b505d6c84 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 21 Jun 2025 19:39:15 +0300 Subject: [PATCH 1/4] implemented a sound manager --- .gitmodules | 3 +++ CMakeLists.txt | 12 +++++++--- external/SFML | 1 + soundManager.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ soundManager.h | 33 ++++++++++++++++++++++++++ 5 files changed, 106 insertions(+), 3 deletions(-) create mode 160000 external/SFML create mode 100644 soundManager.cpp create mode 100644 soundManager.h diff --git a/.gitmodules b/.gitmodules index f70a6e3..b0c5343 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "external/sol2"] path = external/sol2 url = https://github.com/ThePhD/sol2 +[submodule "external/SFML"] + path = external/SFML + url = git@github.com:SFML/SFML.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ffab7f..dd8631a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.2) +cmake_minimum_required(VERSION 3.5) project(gameBase) set(CMAKE_BUILD_TYPE Debug) @@ -6,7 +6,7 @@ cmake_policy(SET CMP0015 NEW) set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(states abstractAppState.cpp) -set(core inputManager.cpp mapping.h stateManager.cpp) +set(core inputManager.cpp mapping.h stateManager.cpp soundManager.cpp) set(util solUtil.cpp util.cpp) set(LIB_NAME gameBase) @@ -25,4 +25,10 @@ set(SOL_DIR external/sol2) add_subdirectory(${SOL_DIR}) target_include_directories(${LIB_NAME} PUBLIC ${SOL_DIR}/include) -target_link_libraries(${LIB_NAME} glfw lua::lib) +set(SFML_DIR external/SFML) +add_subdirectory(${SFML_DIR}) +set(SFML_LIB_DIR build/${SFML_DIR}/src) +target_include_directories(${LIB_NAME} PUBLIC ${SFML_DIR}/include) +target_link_directories(${LIB_NAME} PUBLIC ${SFML_LIB_DIR}) + +target_link_libraries(${LIB_NAME} sfml-system sfml-audio glfw lua::lib) diff --git a/external/SFML b/external/SFML new file mode 160000 index 0000000..3651072 --- /dev/null +++ b/external/SFML @@ -0,0 +1 @@ +Subproject commit 3651072cc0861eb10d67f342d8146b61e3629134 diff --git a/soundManager.cpp b/soundManager.cpp new file mode 100644 index 0000000..ef55e0e --- /dev/null +++ b/soundManager.cpp @@ -0,0 +1,60 @@ +#include "soundManager.h" + +#include + +namespace gameBase{ + using namespace std; + + SoundManager::Track::Track(string p) : path(p){ + soundObj = new sf::Music(p); + soundObj->openFromFile(p.c_str()); + } + + static SoundManager* soundManager = nullptr; + + SoundManager* SoundManager::getSingleton(){ + if(soundManager == nullptr) + soundManager = new SoundManager(); + + return soundManager; + } + + void SoundManager::update(){ + if(currentPlaylist[currentTrackId].soundObj->getStatus() == sf::SoundSource::Status::Stopped){ + bool lastTrack = (currentTrackId == currentPlaylist.size() - 1); + + if(lastTrack && loop) + currentTrackId = 0; + else if(lastTrack && !loop) + clearPlaylist(); + else if(!lastTrack) + currentTrackId++; + + if(!currentPlaylist.empty()){ + currentPlaylist[currentTrackId].soundObj->play(); + currentPlaylist[currentTrackId].soundObj->setLooping(false); + } + } + } + + void SoundManager::clearPlaylist(){ + for(Track &track : currentPlaylist) + delete track.soundObj; + + currentPlaylist.clear(); + } + + void SoundManager::play(vector playlist, int volume, bool loop, bool shuffle){ + this->loop = loop; + this->shuffle = shuffle; + + clearPlaylist(); + + for(string path : playlist) + currentPlaylist.push_back(Track(path)); + + currentTrackId = 0; + currentPlaylist[currentTrackId].soundObj->play(); + currentPlaylist[currentTrackId].soundObj->setLooping(false); + } +} diff --git a/soundManager.h b/soundManager.h new file mode 100644 index 0000000..b1101b2 --- /dev/null +++ b/soundManager.h @@ -0,0 +1,33 @@ +#ifndef SOUND_MANAGER_H +#define SOUND_MANAGER_H + +#include +#include + +namespace sf{ + class Music; +} + +namespace gameBase{ + class SoundManager{ + public: + static SoundManager* getSingleton(); + void update(); + void play(std::vector, int, bool, bool); + private: + struct Track{ + std::string path = ""; + sf::Music *soundObj = nullptr; + + Track(std::string); + }; + SoundManager(){} + void clearPlaylist(); + + int currentTrackId = 0; + bool loop, shuffle; + std::vector currentPlaylist; + }; +} + +#endif From a74be10c245d344cd7576e25b7f978cad6a29673 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sun, 22 Jun 2025 10:23:39 +0300 Subject: [PATCH 2/4] implemented delay between tracks not playing if the same playlist is passed --- soundManager.cpp | 58 ++++++++++++++++++++++++++++++++++-------------- soundManager.h | 10 ++++++--- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/soundManager.cpp b/soundManager.cpp index ef55e0e..5d3c815 100644 --- a/soundManager.cpp +++ b/soundManager.cpp @@ -20,41 +20,65 @@ namespace gameBase{ } void SoundManager::update(){ - if(currentPlaylist[currentTrackId].soundObj->getStatus() == sf::SoundSource::Status::Stopped){ - bool lastTrack = (currentTrackId == currentPlaylist.size() - 1); + if(!currentPlaylistTracks.empty()){ + sf::SoundSource::Status status = currentPlaylistTracks[currentTrackId].soundObj->getStatus(); - if(lastTrack && loop) - currentTrackId = 0; - else if(lastTrack && !loop) - clearPlaylist(); - else if(!lastTrack) - currentTrackId++; + if(status == sf::SoundSource::Status::Stopped){ + if(getTime() - lastPlayTime < trackDelay) return; - if(!currentPlaylist.empty()){ - currentPlaylist[currentTrackId].soundObj->play(); - currentPlaylist[currentTrackId].soundObj->setLooping(false); + bool lastTrack = (currentTrackId == currentPlaylistTracks.size() - 1); + + if(lastTrack && loop) + currentTrackId = 0; + else if(lastTrack && !loop) + clearPlaylist(); + else if(!lastTrack) + currentTrackId++; + + if(!currentPlaylistTracks.empty()){ + currentPlaylistTracks[currentTrackId].soundObj->play(); + currentPlaylistTracks[currentTrackId].soundObj->setVolume(volume); + currentPlaylistTracks[currentTrackId].soundObj->setLooping(false); + } } + else if(status == sf::SoundSource::Status::Playing) + lastPlayTime = getTime(); } } void SoundManager::clearPlaylist(){ - for(Track &track : currentPlaylist) + for(Track &track : currentPlaylistTracks) delete track.soundObj; - currentPlaylist.clear(); + currentPlaylistTracks.clear(); } - void SoundManager::play(vector playlist, int volume, bool loop, bool shuffle){ + void SoundManager::play(vector playlist, int volume, int trackDelay, bool loop, bool shuffle){ + bool samePlaylist = (playlist.size() == originalPlaylist.size()); + + if(samePlaylist) + for(int i = 0; i < originalPlaylist.size(); i++) + if(originalPlaylist[i] != playlist[i]){ + samePlaylist = false; + break; + } + + if(samePlaylist) return; + this->loop = loop; this->shuffle = shuffle; + this->volume = volume; + this->trackDelay = trackDelay; clearPlaylist(); for(string path : playlist) - currentPlaylist.push_back(Track(path)); + currentPlaylistTracks.push_back(Track(path)); + originalPlaylist = playlist; currentTrackId = 0; - currentPlaylist[currentTrackId].soundObj->play(); - currentPlaylist[currentTrackId].soundObj->setLooping(false); + currentPlaylistTracks[currentTrackId].soundObj->play(); + currentPlaylistTracks[currentTrackId].soundObj->setVolume(volume); + currentPlaylistTracks[currentTrackId].soundObj->setLooping(false); } } diff --git a/soundManager.h b/soundManager.h index b1101b2..9047ee1 100644 --- a/soundManager.h +++ b/soundManager.h @@ -4,6 +4,8 @@ #include #include +#include "util.h" + namespace sf{ class Music; } @@ -13,7 +15,7 @@ namespace gameBase{ public: static SoundManager* getSingleton(); void update(); - void play(std::vector, int, bool, bool); + void play(std::vector, int, int, bool, bool); private: struct Track{ std::string path = ""; @@ -24,9 +26,11 @@ namespace gameBase{ SoundManager(){} void clearPlaylist(); - int currentTrackId = 0; + int currentTrackId = 0, volume, trackDelay; bool loop, shuffle; - std::vector currentPlaylist; + s64 lastPlayTime = 0; + std::vector currentPlaylistTracks; + std::vector originalPlaylist; }; } From 201f50f6cfaf4b8745bad785b844e7946c2a88e8 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sun, 22 Jun 2025 10:45:30 +0300 Subject: [PATCH 3/4] implemented paylist shuffling --- soundManager.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/soundManager.cpp b/soundManager.cpp index 5d3c815..b2bae11 100644 --- a/soundManager.cpp +++ b/soundManager.cpp @@ -2,6 +2,9 @@ #include +#include +#include + namespace gameBase{ using namespace std; @@ -75,6 +78,12 @@ namespace gameBase{ for(string path : playlist) currentPlaylistTracks.push_back(Track(path)); + if(shuffle){ + random_device rd; + mt19937 g(rd()); + std::shuffle(currentPlaylistTracks.begin(), currentPlaylistTracks.end(), g); + } + originalPlaylist = playlist; currentTrackId = 0; currentPlaylistTracks[currentTrackId].soundObj->play(); From 318f43d6750ca3d2f1d542dce6c6fd7feb0a891f Mon Sep 17 00:00:00 2001 From: devZoGok Date: Mon, 23 Jun 2025 08:07:34 +0300 Subject: [PATCH 4/4] clearPlaylist is now public --- soundManager.cpp | 1 + soundManager.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/soundManager.cpp b/soundManager.cpp index b2bae11..3d5cc37 100644 --- a/soundManager.cpp +++ b/soundManager.cpp @@ -54,6 +54,7 @@ namespace gameBase{ delete track.soundObj; currentPlaylistTracks.clear(); + originalPlaylist.clear(); } void SoundManager::play(vector playlist, int volume, int trackDelay, bool loop, bool shuffle){ diff --git a/soundManager.h b/soundManager.h index 9047ee1..423007a 100644 --- a/soundManager.h +++ b/soundManager.h @@ -16,6 +16,7 @@ namespace gameBase{ static SoundManager* getSingleton(); void update(); void play(std::vector, int, int, bool, bool); + void clearPlaylist(); private: struct Track{ std::string path = ""; @@ -24,7 +25,6 @@ namespace gameBase{ Track(std::string); }; SoundManager(){} - void clearPlaylist(); int currentTrackId = 0, volume, trackDelay; bool loop, shuffle;