diff --git a/src/app/TetrisApp.cpp b/src/app/TetrisApp.cpp index e0e26be..c4bc0eb 100644 --- a/src/app/TetrisApp.cpp +++ b/src/app/TetrisApp.cpp @@ -31,6 +31,7 @@ #include "audio/Audio.h" #include "audio/MenuWrappers.h" #include "audio/SoundEffect.h" +#include "audio/AudioManager.h" #include "core/Config.h" #include "core/Settings.h" @@ -847,17 +848,19 @@ void TetrisApp::Impl::runLoop() if (e.type == SDL_EVENT_KEY_DOWN && !e.key.repeat) { if (e.key.scancode == SDL_SCANCODE_M) { - Audio::instance().toggleMute(); + if (auto sys = AudioManager::get()) sys->toggleMute(); musicEnabled = !musicEnabled; Settings::instance().setMusicEnabled(musicEnabled); } if (e.key.scancode == SDL_SCANCODE_N) { - Audio::instance().skipToNextTrack(); - if (!musicStarted && Audio::instance().getLoadedTrackCount() > 0) { - musicStarted = true; - musicEnabled = true; - Settings::instance().setMusicEnabled(true); + if (auto sys = AudioManager::get()) { + sys->skipToNextTrack(); + if (!musicStarted && sys->getLoadedTrackCount() > 0) { + musicStarted = true; + musicEnabled = true; + Settings::instance().setMusicEnabled(true); + } } } // K: Toggle sound effects (S is reserved for co-op movement) @@ -1322,10 +1325,14 @@ void TetrisApp::Impl::runLoop() game->softDropBoost(frameMs); if (musicLoadingStarted && !musicLoaded) { - currentTrackLoading = Audio::instance().getLoadedTrackCount(); - if (Audio::instance().isLoadingComplete() || (totalTracks > 0 && currentTrackLoading >= totalTracks)) { - Audio::instance().shuffle(); - musicLoaded = true; + if (auto sys = AudioManager::get()) { + currentTrackLoading = sys->getLoadedTrackCount(); + if (sys->isLoadingComplete() || (totalTracks > 0 && currentTrackLoading >= totalTracks)) { + sys->shuffle(); + musicLoaded = true; + } + } else { + currentTrackLoading = 0; } } @@ -1712,21 +1719,27 @@ void TetrisApp::Impl::runLoop() currentLoadingFile.clear(); } - Audio::instance().init(); - totalTracks = 0; - 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++; - } - totalLoadingTasks.store(baseTasks + totalTracks); - if (totalTracks > 0) { - Audio::instance().startBackgroundLoading(); - musicLoadingStarted = true; + if (auto sys = AudioManager::get()) { + sys->init(); + totalTracks = 0; + 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; + sys->addTrackAsync(path); + totalTracks++; + } + totalLoadingTasks.store(baseTasks + totalTracks); + if (totalTracks > 0) { + sys->startBackgroundLoading(); + musicLoadingStarted = true; + } else { + musicLoaded = true; + } } else { + totalTracks = 0; + totalLoadingTasks.store(baseTasks + totalTracks); musicLoaded = true; } @@ -1879,10 +1892,20 @@ void TetrisApp::Impl::runLoop() if (totalTracks > 0) { musicProgress = musicLoaded ? 0.7 : std::min(0.7, (double)currentTrackLoading / totalTracks * 0.7); } else { - if (Audio::instance().isLoadingComplete()) { - musicProgress = 0.7; - } else if (Audio::instance().getLoadedTrackCount() > 0) { - musicProgress = 0.35; + if (auto sys = AudioManager::get()) { + if (sys->isLoadingComplete()) { + musicProgress = 0.7; + } else if (sys->getLoadedTrackCount() > 0) { + musicProgress = 0.35; + } else { + Uint32 elapsedMs = SDL_GetTicks() - static_cast(loadStart); + if (elapsedMs > 1500) { + musicProgress = 0.7; + musicLoaded = true; + } else { + musicProgress = 0.0; + } + } } else { Uint32 elapsedMs = SDL_GetTicks() - static_cast(loadStart); if (elapsedMs > 1500) { @@ -1924,7 +1947,7 @@ void TetrisApp::Impl::runLoop() menuTrackLoader = std::jthread([]() { std::string menuTrack = AssetPath::resolveWithExtensions("assets/music/Every Block You Take", { ".mp3" }); if (!menuTrack.empty()) { - Audio::instance().setMenuTrack(menuTrack); + if (auto sys = AudioManager::get()) sys->setMenuTrack(menuTrack); } else { SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Menu track not found (Every Block You Take)"); } @@ -1933,9 +1956,9 @@ void TetrisApp::Impl::runLoop() } if (state == AppState::Menu) { - Audio::instance().playMenuMusic(); + if (auto sys = AudioManager::get()) sys->playMenuMusic(); } else { - Audio::instance().playGameMusic(); + if (auto sys = AudioManager::get()) sys->playGameMusic(); } musicStarted = true; } @@ -1944,9 +1967,9 @@ void TetrisApp::Impl::runLoop() static AppState previousState = AppState::Loading; if (state != previousState && musicStarted) { if (state == AppState::Menu && previousState == AppState::Playing) { - Audio::instance().playMenuMusic(); + if (auto sys = AudioManager::get()) sys->playMenuMusic(); } else if (state == AppState::Playing && previousState == AppState::Menu) { - Audio::instance().playGameMusic(); + if (auto sys = AudioManager::get()) sys->playGameMusic(); } } previousState = state; @@ -2720,7 +2743,7 @@ void TetrisApp::Impl::shutdown() } lineEffect.shutdown(); - Audio::instance().shutdown(); + if (auto sys = AudioManager::get()) sys->shutdown(); SoundEffectManager::instance().shutdown(); // Destroy textures before tearing down the renderer/window. diff --git a/src/core/application/ApplicationManager.cpp b/src/core/application/ApplicationManager.cpp index e7c13e2..546bcd2 100644 --- a/src/core/application/ApplicationManager.cpp +++ b/src/core/application/ApplicationManager.cpp @@ -268,7 +268,7 @@ void ApplicationManager::shutdown() { m_running = false; // Stop audio systems before tearing down SDL to avoid aborts/asserts - if (auto sys = ::AudioManager::get()) sys->shutdown(); + if (auto sys = AudioManager::get()) sys->shutdown(); SoundEffectManager::instance().shutdown(); // Cleanup in reverse order of initialization @@ -382,11 +382,11 @@ bool ApplicationManager::initializeManagers() { // M: Toggle/mute music; start playback if unmuting and not started yet if (!consume && sc == SDL_SCANCODE_M) { - if (auto sys = ::AudioManager::get()) sys->toggleMute(); + if (auto sys = AudioManager::get()) sys->toggleMute(); m_musicEnabled = !m_musicEnabled; - if (m_musicEnabled && !m_musicStarted && ::AudioManager::get() && ::AudioManager::get()->getLoadedTrackCount() > 0) { - ::AudioManager::get()->shuffle(); - ::AudioManager::get()->start(); + if (m_musicEnabled && !m_musicStarted && AudioManager::get() && AudioManager::get()->getLoadedTrackCount() > 0) { + AudioManager::get()->shuffle(); + AudioManager::get()->start(); m_musicStarted = true; } consume = true; @@ -394,7 +394,7 @@ bool ApplicationManager::initializeManagers() { // N: Skip to next song in the playlist (or restart menu track) if (!consume && sc == SDL_SCANCODE_N) { - if (auto sys = ::AudioManager::get()) { sys->skipToNextTrack(); if (!m_musicStarted && sys->getLoadedTrackCount() > 0) { m_musicStarted = true; m_musicEnabled = true; } } + if (auto sys = AudioManager::get()) { sys->skipToNextTrack(); if (!m_musicStarted && sys->getLoadedTrackCount() > 0) { m_musicStarted = true; m_musicEnabled = true; } } consume = true; } @@ -615,7 +615,7 @@ bool ApplicationManager::initializeGame() { // as lambdas that reference members here. // Start background music loading similar to main.cpp: Audio init + file discovery - if (auto sys = ::AudioManager::get()) sys->init(); + if (auto sys = AudioManager::get()) sys->init(); // Discover available tracks (up to 100) and queue for background loading m_totalTracks = 0; std::vector trackPaths; @@ -631,14 +631,14 @@ bool ApplicationManager::initializeGame() { } m_totalTracks = static_cast(trackPaths.size()); for (const auto& path : trackPaths) { - if (auto sys = ::AudioManager::get()) sys->addTrackAsync(path); + if (auto sys = AudioManager::get()) sys->addTrackAsync(path); } if (m_totalTracks > 0) { - if (auto sys = ::AudioManager::get()) sys->startBackgroundLoading(); + if (auto sys = AudioManager::get()) sys->startBackgroundLoading(); // Kick off playback now; Audio will pick a track once decoded. // Do not mark as started yet; we'll flip the flag once a track is actually loaded. if (m_musicEnabled) { - if (auto sys = ::AudioManager::get()) { sys->shuffle(); sys->start(); } + if (auto sys = AudioManager::get()) { sys->shuffle(); sys->start(); } m_musicStarted = true; } m_currentTrackLoading = 1; // mark started @@ -938,13 +938,13 @@ void ApplicationManager::setupStateHandlers() { // Start music as soon as at least one track has decoded (don’t wait for all) // Start music as soon as at least one track has decoded (don't wait for all) if (m_musicEnabled && !m_musicStarted) { - if (auto sys = ::AudioManager::get()) { + if (auto sys = AudioManager::get()) { if (sys->getLoadedTrackCount() > 0) { sys->shuffle(); sys->start(); m_musicStarted = true; } } } // Track completion status for UI if (!m_musicLoaded) { - if (auto sys = ::AudioManager::get()) { + if (auto sys = AudioManager::get()) { if (sys->isLoadingComplete()) m_musicLoaded = true; } } diff --git a/src/core/assets/AssetManager.cpp b/src/core/assets/AssetManager.cpp index 1aed990..3d87c71 100644 --- a/src/core/assets/AssetManager.cpp +++ b/src/core/assets/AssetManager.cpp @@ -41,7 +41,7 @@ bool AssetManager::initialize(SDL_Renderer* renderer) { m_renderer = renderer; // Get references to singleton systems - m_audioSystem = ::AudioManager::get(); + m_audioSystem = AudioManager::get(); m_soundSystem = &SoundEffectManager::instance(); m_initialized = true; diff --git a/src/gameplay/LineEffect.cpp b/src/gameplay/LineEffect.cpp index 944e316..ebefce8 100644 --- a/src/gameplay/LineEffect.cpp +++ b/src/gameplay/LineEffect.cpp @@ -267,6 +267,6 @@ void LineEffect::playLineClearSound(int lineCount) { const std::vector* sample = (lineCount == 4) ? &tetrisSample : &lineClearSample; if (sample && !sample->empty()) { // Mix via shared Audio device so it layers with music - if (auto sys = ::AudioManager::get()) sys->playSfx(*sample, 2, 44100, (lineCount == 4) ? 0.9f : 0.7f); + if (auto sys = AudioManager::get()) sys->playSfx(*sample, 2, 44100, (lineCount == 4) ? 0.9f : 0.7f); } } diff --git a/src/gameplay/effects/LineEffect.cpp b/src/gameplay/effects/LineEffect.cpp index 5d9d67b..c3e4ee8 100644 --- a/src/gameplay/effects/LineEffect.cpp +++ b/src/gameplay/effects/LineEffect.cpp @@ -462,7 +462,7 @@ void LineEffect::playLineClearSound(int lineCount) { const std::vector* sample = (lineCount == 4) ? &tetrisSample : &lineClearSample; if (sample && !sample->empty()) { // Mix via shared Audio device so it layers with music - if (auto sys = ::AudioManager::get()) sys->playSfx(*sample, 2, 44100, (lineCount == 4) ? 0.9f : 0.7f); + if (auto sys = AudioManager::get()) sys->playSfx(*sample, 2, 44100, (lineCount == 4) ? 0.9f : 0.7f); } } diff --git a/src/states/MenuState.cpp b/src/states/MenuState.cpp index 86d3d3f..38775c8 100644 --- a/src/states/MenuState.cpp +++ b/src/states/MenuState.cpp @@ -181,7 +181,7 @@ void MenuState::showCoopSetupPanel(bool show, bool resumeMusic) { coopSetupStep = CoopSetupStep::ChoosePartner; // Resume menu music only when requested (ESC should pass resumeMusic=false) if (resumeMusic && ctx.musicEnabled && *ctx.musicEnabled) { - if (auto sys = ::AudioManager::get()) sys->playMenuMusic(); + if (auto sys = AudioManager::get()) sys->playMenuMusic(); } } } diff --git a/src/states/OptionsState.cpp b/src/states/OptionsState.cpp index feb82db..6fe422b 100644 --- a/src/states/OptionsState.cpp +++ b/src/states/OptionsState.cpp @@ -221,7 +221,7 @@ void OptionsState::toggleFullscreen() { } void OptionsState::toggleMusic() { - if (auto sys = ::AudioManager::get()) sys->toggleMute(); + if (auto sys = AudioManager::get()) sys->toggleMute(); // If muted, music is disabled. If not muted, music is enabled. // Note: Audio::instance().isMuted() returns true if muted. // But Audio class doesn't expose isMuted directly in header usually? diff --git a/src/states/VideoState.cpp b/src/states/VideoState.cpp index 6602390..57e00ab 100644 --- a/src/states/VideoState.cpp +++ b/src/states/VideoState.cpp @@ -105,7 +105,7 @@ void VideoState::startAudioIfReady() { if (m_audioPcm.empty()) return; // Use the existing audio output path (same device as music/SFX). - if (auto sys = ::AudioManager::get()) sys->playSfx(m_audioPcm, m_audioChannels, m_audioRate, 1.0f); + if (auto sys = AudioManager::get()) sys->playSfx(m_audioPcm, m_audioChannels, m_audioRate, 1.0f); m_audioStarted = true; }