diff --git a/libs/audio/include/psemek/audio/engine.hpp b/libs/audio/include/psemek/audio/engine.hpp index 0df5540c..0c2ef0a0 100644 --- a/libs/audio/include/psemek/audio/engine.hpp +++ b/libs/audio/include/psemek/audio/engine.hpp @@ -9,6 +9,7 @@ #include #include +#include namespace psemek::audio { @@ -34,6 +35,8 @@ namespace psemek::audio return load(data.data(), data.size()); } + std::shared_ptr load_raw(std::vector data); + std::shared_ptr play(std::shared_ptr s, bool start = true, bool loop = false); private: diff --git a/libs/audio/source/engine.cpp b/libs/audio/source/engine.cpp index b92cd593..17bd6e32 100644 --- a/libs/audio/source/engine.cpp +++ b/libs/audio/source/engine.cpp @@ -45,11 +45,17 @@ namespace psemek::audio : track { Mix_Chunk * chunk; + std::vector buffer; track_impl(Mix_Chunk * chunk) : chunk(chunk) {} + track_impl(Mix_Chunk * chunk, std::vector buffer) + : chunk(chunk) + , buffer(std::move(buffer)) + {} + sample const * data() const override { return reinterpret_cast(chunk->abuf); @@ -307,6 +313,16 @@ namespace psemek::audio return std::make_shared(chunk); } + std::shared_ptr engine::load_raw(std::vector data) + { + Mix_Chunk * chunk = static_cast(malloc(sizeof(Mix_Chunk))); + chunk->allocated = 0; + chunk->alen = data.size() * sizeof(sample); + chunk->volume = 128; + chunk->abuf = const_cast(reinterpret_cast(data.data())); + return std::make_shared(chunk, std::move(data)); + } + std::shared_ptr engine::play(std::shared_ptr s, bool start, bool loop) { auto str = impl().play(std::move(s), loop);