64 lines
1.2 KiB
C++
64 lines
1.2 KiB
C++
#include <psemek/audio/recorder.hpp>
|
|
|
|
#include <vector>
|
|
|
|
namespace psemek::audio
|
|
{
|
|
|
|
namespace
|
|
{
|
|
|
|
struct recorder_impl
|
|
: recorder
|
|
{
|
|
recorder_impl(stream_ptr stream)
|
|
: stream_(std::move(stream))
|
|
{}
|
|
|
|
recorder_impl(std::vector<float> samples)
|
|
: buffer_(std::move(samples))
|
|
, length_(buffer_.size())
|
|
{}
|
|
|
|
std::optional<std::size_t> length() const override
|
|
{
|
|
return stream_ ? stream_->length() : buffer_.size();
|
|
}
|
|
|
|
std::size_t request(std::size_t samples) override
|
|
{
|
|
if (!stream_)
|
|
return 0;
|
|
|
|
if (buffer_.size() < length_ + samples)
|
|
buffer_.resize(std::max<std::size_t>(samples, buffer_.size() * 2));
|
|
|
|
auto result = stream_->read(buffer_.data() + length_, samples);
|
|
length_ += result;
|
|
return result;
|
|
}
|
|
|
|
util::span<float const> buffer() const override
|
|
{
|
|
return {buffer_.data(), buffer_.data() + length_};
|
|
}
|
|
|
|
private:
|
|
stream_ptr stream_;
|
|
std::vector<float> buffer_;
|
|
std::size_t length_{0};
|
|
};
|
|
|
|
}
|
|
|
|
std::shared_ptr<recorder> make_recorder(stream_ptr 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));
|
|
}
|
|
|
|
}
|