diff --git a/libs/audio/include/psemek/audio/track.hpp b/libs/audio/include/psemek/audio/track.hpp index fcaa0720..286d2ea8 100644 --- a/libs/audio/include/psemek/audio/track.hpp +++ b/libs/audio/include/psemek/audio/track.hpp @@ -21,6 +21,7 @@ namespace psemek::audio using track_ptr = std::shared_ptr; track_ptr load_raw(util::span data); + track_ptr load_raw(util::blob data); track_ptr load_raw(std::vector data); track_ptr load_wav(util::span data); diff --git a/libs/audio/source/track_raw.cpp b/libs/audio/source/track_raw.cpp index 713963e2..099fdc7b 100644 --- a/libs/audio/source/track_raw.cpp +++ b/libs/audio/source/track_raw.cpp @@ -12,6 +12,7 @@ namespace psemek::audio struct data_holder { std::vector storage; + util::blob blob_storage; util::span samples; data_holder(util::span samples) @@ -22,6 +23,11 @@ namespace psemek::audio : storage(std::move(storage)) , samples(this->storage) {} + + data_holder(util::blob storage) + : blob_storage(std::move(storage)) + , samples(util::cast(util::span(blob_storage))) + {} }; struct raw_stream_impl @@ -87,6 +93,15 @@ namespace psemek::audio return std::make_shared(std::make_shared(samples)); } + track_ptr load_raw(util::blob samples) + { + if ((samples.size() % 4) != 0) + throw util::exception("Byte count must be a multiple of 4"); + if ((samples.size() % 8) != 0) + throw util::exception("Sample count must be even"); + return std::make_shared(std::make_shared(std::move(samples))); + } + track_ptr load_raw(std::vector samples) { if ((samples.size() % 2) != 0)