Implement lazy-loading audio tracks
This commit is contained in:
parent
bd3aa04922
commit
05af18ba3f
2 changed files with 62 additions and 0 deletions
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
|||
59
libs/audio/source/track_lazy.cpp
Normal file
59
libs/audio/source/track_lazy.cpp
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue