diff --git a/CMakeLists.txt b/CMakeLists.txt index cd42a2f..1d8e273 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,7 @@ find_package(spdlog CONFIG REQUIRED) add_executable(HansTheGatherer src/main.cpp + src/audio.cpp src/assets.cpp src/physics.cpp ) diff --git a/src/audio.cpp b/src/audio.cpp new file mode 100644 index 0000000..2e1a0c0 --- /dev/null +++ b/src/audio.cpp @@ -0,0 +1,33 @@ +#include "audio.hpp" +#include "assets.hpp" + +AudioModule::AudioModule(flecs::world& world) +{ + auto* audio_assets = world.get(); + 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{.music_stream = music_stream, .sound_stream = sound_stream}); + + world.system("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(audio_assets.background_music.buffer_length)) + { + SDL_PutAudioStreamData(audio_streams.music_stream, + audio_assets.background_music.buffer, + audio_assets.background_music.buffer_length); + } + }); +} diff --git a/src/audio.hpp b/src/audio.hpp index 1a8d322..9f37ead 100644 --- a/src/audio.hpp +++ b/src/audio.hpp @@ -2,6 +2,7 @@ #include #include +#include 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); +}; diff --git a/src/main.cpp b/src/main.cpp index ae7f65c..8e2bf5d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -51,6 +51,7 @@ int main() SdlHandles{.window = window, .renderer = renderer, .text_engine = text_engine}); world.import (); + world.import (); world.import (); world.import (); @@ -116,17 +117,6 @@ int main() TTF_DestroyText(text); }); - auto* audio_assets = world.get(); - 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();