Implement raw audio::track from scratch, without dependence on recoder & duplicator
This commit is contained in:
parent
633e366650
commit
a67e00d601
1 changed files with 84 additions and 5 deletions
|
|
@ -1,17 +1,96 @@
|
||||||
#include <psemek/audio/track.hpp>
|
#include <psemek/audio/track.hpp>
|
||||||
#include <psemek/audio/combine/duplicate.hpp>
|
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
namespace psemek::audio
|
namespace psemek::audio
|
||||||
{
|
{
|
||||||
|
|
||||||
track_ptr load_raw(util::span<float const> data)
|
namespace
|
||||||
{
|
{
|
||||||
return make_duplicator(make_recorder(data));
|
|
||||||
|
struct data_holder
|
||||||
|
{
|
||||||
|
std::vector<float> storage;
|
||||||
|
util::span<float const> samples;
|
||||||
|
|
||||||
|
data_holder(util::span<float const> samples)
|
||||||
|
: samples(samples)
|
||||||
|
{}
|
||||||
|
|
||||||
|
data_holder(std::vector<float> storage)
|
||||||
|
: storage(std::move(storage))
|
||||||
|
, samples(this->storage)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct raw_stream_impl
|
||||||
|
: stream
|
||||||
|
{
|
||||||
|
raw_stream_impl(std::shared_ptr<data_holder> data_holder)
|
||||||
|
: data_holder_(std::move(data_holder))
|
||||||
|
{}
|
||||||
|
|
||||||
|
std::optional<std::size_t> length() const override
|
||||||
|
{
|
||||||
|
return data_holder_->samples.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t read(util::span<float> samples) override
|
||||||
|
{
|
||||||
|
auto played = played_.load();
|
||||||
|
|
||||||
|
auto count = std::min(data_holder_->samples.size() - played, samples.size());
|
||||||
|
std::copy(data_holder_->samples.begin() + played, data_holder_->samples.begin() + played + count, samples.begin());
|
||||||
|
played_.fetch_add(count);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t played() const override
|
||||||
|
{
|
||||||
|
return played_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<data_holder> data_holder_;
|
||||||
|
std::atomic<std::size_t> played_{0};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct raw_track_impl
|
||||||
|
: track
|
||||||
|
{
|
||||||
|
raw_track_impl(std::shared_ptr<data_holder> data_holder)
|
||||||
|
: data_holder_(std::move(data_holder))
|
||||||
|
{}
|
||||||
|
|
||||||
|
stream_ptr stream() const override
|
||||||
|
{
|
||||||
|
return std::make_shared<raw_stream_impl>(data_holder_);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::size_t> length() const override
|
||||||
|
{
|
||||||
|
return data_holder_->samples.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<data_holder> data_holder_;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
track_ptr load_raw(std::vector<float> data)
|
track_ptr load_raw(util::span<float const> samples)
|
||||||
{
|
{
|
||||||
return make_duplicator(make_recorder(std::move(data)));
|
if ((samples.size() % 2) != 0)
|
||||||
|
throw std::runtime_error("bad sample count");
|
||||||
|
return std::make_shared<raw_track_impl>(std::make_shared<data_holder>(samples));
|
||||||
|
}
|
||||||
|
|
||||||
|
track_ptr load_raw(std::vector<float> samples)
|
||||||
|
{
|
||||||
|
if ((samples.size() % 2) != 0)
|
||||||
|
throw std::runtime_error("bad sample count");
|
||||||
|
return std::make_shared<raw_track_impl>(std::make_shared<data_holder>(std::move(samples)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue