Implement lazy-loading audio tracks

This commit is contained in:
Nikita Lisitsa 2024-03-11 01:00:24 +03:00
parent bd3aa04922
commit 05af18ba3f
2 changed files with 62 additions and 0 deletions

View file

@ -6,6 +6,7 @@
#include <optional>
#include <vector>
#include <filesystem>
namespace psemek::audio
{
@ -31,4 +32,6 @@ namespace psemek::audio
track_ptr load_mp3(util::blob data);
track_ptr load_mp3(std::vector<char> data);
track_ptr load_lazy(std::filesystem::path const & path);
}

View file

@ -0,0 +1,59 @@
#include <psemek/audio/track.hpp>
#include <psemek/util/exception.hpp>
#include <psemek/io/file_stream.hpp>
namespace psemek::audio
{
namespace
{
struct lazy_track_impl
: track
{
lazy_track_impl(std::filesystem::path const & path)
: path_(path)
{}
stream_ptr stream() const override
{
load_proxy();
return proxy_->stream();
}
std::optional<std::size_t> length() const override
{
load_proxy();
return proxy_->length();
}
private:
std::filesystem::path path_;
mutable track_ptr proxy_;
void load_proxy() const
{
if (proxy_)
return;
auto data = io::read_full(io::file_istream(path_));
auto const extension = path_.extension();
if (extension == ".mp3")
proxy_ = load_mp3(std::move(data));
else if (extension == ".wav")
proxy_ = load_wav(std::move(data));
else if (extension == ".raw")
proxy_ = load_raw(std::move(data));
else
throw util::exception("Unknown audio format: " + extension.string());
}
};
}
track_ptr load_lazy(std::filesystem::path const & path)
{
return std::make_shared<lazy_track_impl>(path);
}
}