Refactor audio system

This commit is contained in:
2025-06-01 11:20:08 +02:00
parent 81f4d6157e
commit e2a2d6efdf
4 changed files with 47 additions and 19 deletions

View File

@@ -35,6 +35,7 @@ find_package(spdlog CONFIG REQUIRED)
add_executable(HansTheGatherer
src/main.cpp
src/audio.cpp
src/assets.cpp
src/physics.cpp
)

33
src/audio.cpp Normal file
View File

@@ -0,0 +1,33 @@
#include "audio.hpp"
#include "assets.hpp"
AudioModule::AudioModule(flecs::world& world)
{
auto* audio_assets = world.get<AudioAssets>();
auto* music_stream = SDL_OpenAudioDeviceStream(
SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &audio_assets->background_music.spec, NULL, NULL);
auto* sound_stream = SDL_OpenAudioDeviceStream(
SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &audio_assets->background_music.spec, NULL, NULL);
SDL_ResumeAudioStreamDevice(music_stream);
world.set<AudioStreams>(
AudioStreams{.music_stream = music_stream, .sound_stream = sound_stream});
world.system<AudioStreams, AudioAssets>("FeedAudioStreams")
.term_at(0)
.singleton()
.term_at(1)
.singleton()
.each(
[](AudioStreams& audio_streams, AudioAssets& audio_assets)
{
if (SDL_GetAudioStreamQueued(audio_streams.music_stream) <
static_cast<int>(audio_assets.background_music.buffer_length))
{
SDL_PutAudioStreamData(audio_streams.music_stream,
audio_assets.background_music.buffer,
audio_assets.background_music.buffer_length);
}
});
}

View File

@@ -2,6 +2,7 @@
#include <SDL3/SDL.h>
#include <cstdint>
#include <flecs.h>
struct AudioAsset
{
@@ -9,3 +10,14 @@ struct AudioAsset
uint8_t* buffer;
uint32_t buffer_length;
};
struct AudioStreams
{
SDL_AudioStream* music_stream;
SDL_AudioStream* sound_stream;
};
struct AudioModule
{
AudioModule(flecs::world& world);
};

View File

@@ -51,6 +51,7 @@ int main()
SdlHandles{.window = window, .renderer = renderer, .text_engine = text_engine});
world.import <AssetModule>();
world.import <AudioModule>();
world.import <PhysicsModule>();
world.import <LevelModule>();
@@ -116,17 +117,6 @@ int main()
TTF_DestroyText(text);
});
auto* audio_assets = world.get<AudioAssets>();
auto* stream = SDL_OpenAudioDeviceStream(
SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &audio_assets->background_music.spec, NULL, NULL);
if (!stream)
{
SDL_Log("Couldn't create audio stream: %s", SDL_GetError());
return SDL_APP_FAILURE;
}
SDL_ResumeAudioStreamDevice(stream);
bool exit_gameloop = false;
while (!exit_gameloop)
{
@@ -164,14 +154,6 @@ int main()
}
}
// Game Logic
if (SDL_GetAudioStreamQueued(stream) < (int)audio_assets->background_music.buffer_length)
{
SDL_PutAudioStreamData(stream,
audio_assets->background_music.buffer,
audio_assets->background_music.buffer_length);
}
// Render
SDL_RenderClear(renderer);
world.progress();