psemek/libs/audio/source/recorder.cpp
2022-10-06 15:45:23 +03:00

51 lines
926 B
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))
{}
stream_ptr stream() const override
{
return stream_;
}
std::size_t request(std::size_t samples) override
{
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));
}
}