diff --git a/settings.ini b/settings.ini index d28b9c7..99029f7 100644 --- a/settings.ini +++ b/settings.ini @@ -5,7 +5,7 @@ Fullscreen=1 [Audio] -Music=0 +Music=1 Sound=1 [Gameplay] @@ -14,7 +14,7 @@ SmoothScroll=1 UpRotateClockwise=0 [Player] -Name=PLAYER +Name=GREGOR [Debug] Enabled=1 diff --git a/src/main.cpp b/src/main.cpp index a507aa9..c731acc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -699,6 +699,13 @@ int main(int, char **) SDL_Texture* statisticsPanelTex = nullptr; SDL_Texture* nextPanelTex = nullptr; + // Music loading tracking + int totalTracks = 0; + int currentTrackLoading = 0; + bool musicLoaded = false; + bool musicStarted = false; + bool musicLoadingStarted = false; + // Loader control: execute incrementally on main thread to avoid SDL threading issues std::atomic_bool g_loadingStarted{false}; std::atomic_bool g_loadingComplete{false}; @@ -710,7 +717,8 @@ int main(int, char **) // Initialize counters on first step if (step == 0) { - g_totalLoadingTasks.store(25); // Total: 2 fonts + 2 logos + 1 main + 1 blocks + 3 panels + 16 audio + constexpr int baseTasks = 25; // 2 fonts + 2 logos + 1 main + 1 blocks + 3 panels + 16 SFX + g_totalLoadingTasks.store(baseTasks); g_loadedTasks.store(0); { std::lock_guard lk(g_assetLoadErrorsMutex); @@ -720,6 +728,26 @@ int main(int, char **) std::lock_guard lk(g_currentLoadingMutex); g_currentLoadingFile.clear(); } + + // Initialize background music loading + Audio::instance().init(); + for (int i = 1; i <= 100; ++i) { + char base[128]; + std::snprintf(base, sizeof(base), "assets/music/music%03d", i); + std::string path = AssetPath::resolveWithExtensions(base, { ".mp3" }); + if (path.empty()) break; + Audio::instance().addTrackAsync(path); + totalTracks++; + } + // Expand task budget to account for music tracks so the loading bar waits for them + g_totalLoadingTasks.store(baseTasks + totalTracks); + if (totalTracks > 0) { + Audio::instance().startBackgroundLoading(); + musicLoadingStarted = true; + } else { + // No music files found, mark as loaded so game can continue + musicLoaded = true; + } } // Execute one load operation per step @@ -851,10 +879,6 @@ int main(int, char **) SDL_Rect logicalVP{0, 0, LOGICAL_W, LOGICAL_H}; float logicalScale = 1.f; Uint64 lastMs = SDL_GetPerformanceCounter(); - bool musicStarted = false; - bool musicLoaded = false; - int currentTrackLoading = 0; - int totalTracks = 0; // Will be set dynamically based on actual files enum class MenuFadePhase { None, FadeOut, FadeIn }; MenuFadePhase menuFadePhase = MenuFadePhase::None; @@ -1399,6 +1423,18 @@ int main(int, char **) rightHeld = right; if (down && !game.isPaused()) game.softDropBoost(frameMs); + // Track music loading on every frame so it finishes even after the loading screen ends + if (musicLoadingStarted && !musicLoaded) { + currentTrackLoading = Audio::instance().getLoadedTrackCount(); + if (Audio::instance().isLoadingComplete() || (totalTracks > 0 && currentTrackLoading >= totalTracks)) { + Audio::instance().shuffle(); + if (musicEnabled) { + Audio::instance().start(); + } + musicLoaded = true; + } + } + if (state == AppState::Playing) { if (!game.isPaused()) { @@ -1438,22 +1474,14 @@ int main(int, char **) } } - // Update progress based on background loading - if (currentTrackLoading > 0 && !musicLoaded) { - currentTrackLoading = Audio::instance().getLoadedTrackCount(); - // If loading is complete OR we've loaded all expected tracks (handles potential thread cleanup hang) - if (Audio::instance().isLoadingComplete() || (totalTracks > 0 && currentTrackLoading >= totalTracks)) { - Audio::instance().shuffle(); // Shuffle once all tracks are loaded - musicLoaded = true; - } - } - // Prefer task-based progress if we have tasks registered - int totalTasks = g_totalLoadingTasks.load(std::memory_order_acquire); - int doneTasks = g_loadedTasks.load(std::memory_order_acquire); + const int totalTasks = g_totalLoadingTasks.load(std::memory_order_acquire); + const int musicDone = std::min(totalTracks, currentTrackLoading); + int doneTasks = g_loadedTasks.load(std::memory_order_acquire) + musicDone; + if (doneTasks > totalTasks) doneTasks = totalTasks; if (totalTasks > 0) { loadingProgress = std::min(1.0, double(doneTasks) / double(totalTasks)); - if (loadingProgress >= 1.0) { + if (loadingProgress >= 1.0 && musicLoaded) { state = AppState::Menu; stateMgr.setState(state); } @@ -1481,7 +1509,7 @@ int main(int, char **) double timeProgress = std::min(0.1, (now - loadStart) / 500.0); loadingProgress = std::min(1.0, assetProgress + musicProgress + timeProgress); if (loadingProgress > 0.99) loadingProgress = 1.0; - if (musicLoaded && timeProgress >= 0.1) loadingProgress = 1.0; + if (!musicLoaded && timeProgress >= 0.1) loadingProgress = 1.0; if (loadingProgress >= 1.0 && musicLoaded) { state = AppState::Menu; stateMgr.setState(state);