Support creating audio::recorder directly from samples

This commit is contained in:
Nikita Lisitsa 2022-10-08 14:05:13 +03:00
parent 2c59879630
commit f46b080a69
3 changed files with 20 additions and 4 deletions

View file

@ -3,12 +3,14 @@
#include <psemek/audio/stream.hpp> #include <psemek/audio/stream.hpp>
#include <psemek/util/span.hpp> #include <psemek/util/span.hpp>
#include <vector>
namespace psemek::audio namespace psemek::audio
{ {
struct recorder struct recorder
{ {
virtual stream_ptr stream() const = 0; virtual std::optional<std::size_t> length() const = 0;
virtual std::size_t request(std::size_t samples) = 0; virtual std::size_t request(std::size_t samples) = 0;
@ -18,5 +20,6 @@ namespace psemek::audio
}; };
std::shared_ptr<recorder> make_recorder(stream_ptr stream); std::shared_ptr<recorder> make_recorder(stream_ptr stream);
std::shared_ptr<recorder> make_recorder(std::vector<float> samples);
} }

View file

@ -18,7 +18,7 @@ namespace psemek::audio
std::optional<std::size_t> length() const override std::optional<std::size_t> length() const override
{ {
return recorder_->stream()->length(); return recorder_->length();
} }
std::size_t played() const override std::size_t played() const override

View file

@ -15,13 +15,21 @@ namespace psemek::audio
: stream_(std::move(stream)) : stream_(std::move(stream))
{} {}
stream_ptr stream() const override recorder_impl(std::vector<float> samples)
: buffer_(std::move(samples))
, length_(buffer_.size())
{}
std::optional<std::size_t> length() const override
{ {
return stream_; return stream_ ? stream_->length() : buffer_.size();
} }
std::size_t request(std::size_t samples) override std::size_t request(std::size_t samples) override
{ {
if (!stream_)
return 0;
if (buffer_.size() < length_ + samples) if (buffer_.size() < length_ + samples)
buffer_.resize(std::max<std::size_t>(samples, buffer_.size() * 2)); buffer_.resize(std::max<std::size_t>(samples, buffer_.size() * 2));
@ -48,4 +56,9 @@ namespace psemek::audio
return std::make_shared<recorder_impl>(std::move(stream)); return std::make_shared<recorder_impl>(std::move(stream));
} }
std::shared_ptr<recorder> make_recorder(std::vector<float> samples)
{
return std::make_shared<recorder_impl>(std::move(samples));
}
} }