Audio update

This commit is contained in:
2025-12-25 19:17:36 +01:00
parent 938988c876
commit 68b35ea57b
15 changed files with 122 additions and 62 deletions

View File

@ -7,6 +7,7 @@
#include "../interfaces/IInputHandler.h"
#include <filesystem>
#include "../../audio/Audio.h"
#include "../../audio/AudioManager.h"
#include "../../audio/SoundEffect.h"
#include "../../persistence/Scores.h"
#include "../../states/State.h"
@ -267,7 +268,7 @@ void ApplicationManager::shutdown() {
m_running = false;
// Stop audio systems before tearing down SDL to avoid aborts/asserts
Audio::instance().shutdown();
if (auto sys = ::AudioManager::get()) sys->shutdown();
SoundEffectManager::instance().shutdown();
// Cleanup in reverse order of initialization
@ -381,11 +382,11 @@ bool ApplicationManager::initializeManagers() {
// M: Toggle/mute music; start playback if unmuting and not started yet
if (!consume && sc == SDL_SCANCODE_M) {
Audio::instance().toggleMute();
if (auto sys = ::AudioManager::get()) sys->toggleMute();
m_musicEnabled = !m_musicEnabled;
if (m_musicEnabled && !m_musicStarted && Audio::instance().getLoadedTrackCount() > 0) {
Audio::instance().shuffle();
Audio::instance().start();
if (m_musicEnabled && !m_musicStarted && ::AudioManager::get() && ::AudioManager::get()->getLoadedTrackCount() > 0) {
::AudioManager::get()->shuffle();
::AudioManager::get()->start();
m_musicStarted = true;
}
consume = true;
@ -393,11 +394,7 @@ bool ApplicationManager::initializeManagers() {
// N: Skip to next song in the playlist (or restart menu track)
if (!consume && sc == SDL_SCANCODE_N) {
Audio::instance().skipToNextTrack();
if (!m_musicStarted && Audio::instance().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;
}
@ -515,13 +512,13 @@ void ApplicationManager::registerServices() {
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Registered IInputHandler service");
}
// Register Audio system singleton
auto& audioInstance = Audio::instance();
auto audioPtr = std::shared_ptr<Audio>(&audioInstance, [](Audio*) {
// Custom deleter that does nothing since Audio is a singleton
});
m_serviceContainer.registerSingleton<IAudioSystem>(audioPtr);
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Registered IAudioSystem service");
// Register Audio system singleton (via AudioManager)
IAudioSystem* audioInstance = AudioManager::get();
if (audioInstance) {
std::shared_ptr<IAudioSystem> audioPtr(audioInstance, [](IAudioSystem*){});
m_serviceContainer.registerSingleton<IAudioSystem>(audioPtr);
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Registered IAudioSystem service");
}
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Service registration completed successfully");
}
@ -618,7 +615,7 @@ bool ApplicationManager::initializeGame() {
// as lambdas that reference members here.
// Start background music loading similar to main.cpp: Audio init + file discovery
Audio::instance().init();
if (auto sys = ::AudioManager::get()) sys->init();
// Discover available tracks (up to 100) and queue for background loading
m_totalTracks = 0;
std::vector<std::string> trackPaths;
@ -634,15 +631,15 @@ bool ApplicationManager::initializeGame() {
}
m_totalTracks = static_cast<int>(trackPaths.size());
for (const auto& path : trackPaths) {
Audio::instance().addTrackAsync(path);
if (auto sys = ::AudioManager::get()) sys->addTrackAsync(path);
}
if (m_totalTracks > 0) {
Audio::instance().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) {
Audio::instance().shuffle();
Audio::instance().start();
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(); }
m_musicStarted = true;
}
m_currentTrackLoading = 1; // mark started
}
@ -941,15 +938,15 @@ void ApplicationManager::setupStateHandlers() {
// Start music as soon as at least one track has decoded (dont 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 (Audio::instance().getLoadedTrackCount() > 0) {
Audio::instance().shuffle();
Audio::instance().start();
m_musicStarted = true;
if (auto sys = ::AudioManager::get()) {
if (sys->getLoadedTrackCount() > 0) { sys->shuffle(); sys->start(); m_musicStarted = true; }
}
}
// Track completion status for UI
if (!m_musicLoaded && Audio::instance().isLoadingComplete()) {
m_musicLoaded = true;
if (!m_musicLoaded) {
if (auto sys = ::AudioManager::get()) {
if (sys->isLoadingComplete()) m_musicLoaded = true;
}
}
});

View File

@ -1,6 +1,7 @@
#include "AssetManager.h"
#include "../../graphics/ui/Font.h"
#include "../../audio/Audio.h"
#include "../../audio/AudioManager.h"
#include "../../audio/SoundEffect.h"
#include <SDL3/SDL.h>
#include <SDL3_image/SDL_image.h>
@ -40,7 +41,7 @@ bool AssetManager::initialize(SDL_Renderer* renderer) {
m_renderer = renderer;
// Get references to singleton systems
m_audioSystem = &Audio::instance();
m_audioSystem = ::AudioManager::get();
m_soundSystem = &SoundEffectManager::instance();
m_initialized = true;

View File

@ -7,12 +7,12 @@
#include <memory>
#include <functional>
#include "../interfaces/IAssetLoader.h"
#include "../interfaces/IAssetLoader.h"
// Forward declarations
class FontAtlas;
class Audio;
class SoundEffectManager;
class IAudioSystem;
/**
* AssetManager - Centralized resource management following SOLID principles
@ -121,7 +121,7 @@ private:
// System references
SDL_Renderer* m_renderer;
Audio* m_audioSystem; // Pointer to singleton
IAudioSystem* m_audioSystem; // Pointer to audio system (IAudioSystem)
SoundEffectManager* m_soundSystem; // Pointer to singleton
// Configuration

View File

@ -1,6 +1,8 @@
#pragma once
#include <string>
#include <vector>
#include <cstdint>
/**
* @brief Abstract interface for audio system operations
@ -52,4 +54,28 @@ public:
* @return true if music is playing, false otherwise
*/
virtual bool isMusicPlaying() const = 0;
// Extended control methods used by the application
virtual bool init() = 0;
virtual void shutdown() = 0;
virtual void addTrack(const std::string& path) = 0;
virtual void addTrackAsync(const std::string& path) = 0;
virtual void startBackgroundLoading() = 0;
virtual bool isLoadingComplete() const = 0;
virtual int getLoadedTrackCount() const = 0;
virtual void start() = 0;
virtual void skipToNextTrack() = 0;
virtual void shuffle() = 0;
virtual void toggleMute() = 0;
virtual bool isMuted() const = 0;
virtual void setMenuTrack(const std::string& path) = 0;
virtual void playMenuMusic() = 0;
virtual void playGameMusic() = 0;
// Low-level SFX path (raw PCM) used by internal SFX mixer
virtual void playSfx(const std::vector<int16_t>& pcm, int channels, int rate, float volume) = 0;
};