Support creating audio::recorder directly from samples
This commit is contained in:
parent
2c59879630
commit
f46b080a69
3 changed files with 20 additions and 4 deletions
|
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue