Support loading raw audio track from blob

This commit is contained in:
Nikita Lisitsa 2024-03-11 00:59:17 +03:00
parent 4a17529e39
commit bd3aa04922
2 changed files with 16 additions and 0 deletions

View file

@ -21,6 +21,7 @@ namespace psemek::audio
using track_ptr = std::shared_ptr<track>;
track_ptr load_raw(util::span<float const> data);
track_ptr load_raw(util::blob data);
track_ptr load_raw(std::vector<float> data);
track_ptr load_wav(util::span<char const> data);

View file

@ -12,6 +12,7 @@ namespace psemek::audio
struct data_holder
{
std::vector<float> storage;
util::blob blob_storage;
util::span<float const> samples;
data_holder(util::span<float const> 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<float const>(util::span<char const>(blob_storage)))
{}
};
struct raw_stream_impl
@ -87,6 +93,15 @@ namespace psemek::audio
return std::make_shared<raw_track_impl>(std::make_shared<data_holder>(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<raw_track_impl>(std::make_shared<data_holder>(std::move(samples)));
}
track_ptr load_raw(std::vector<float> samples)
{
if ((samples.size() % 2) != 0)