Add audio::recorder

This commit is contained in:
Nikita Lisitsa 2022-10-06 15:45:23 +03:00
parent 9d58904a66
commit e4871da0c5
2 changed files with 73 additions and 0 deletions

View file

@ -0,0 +1,22 @@
#pragma once
#include <psemek/audio/stream.hpp>
#include <psemek/util/span.hpp>
namespace psemek::audio
{
struct recorder
{
virtual stream_ptr stream() const = 0;
virtual std::size_t request(std::size_t samples) = 0;
virtual util::span<float const> buffer() const = 0;
virtual ~recorder() {}
};
std::shared_ptr<recorder> make_recorder(stream_ptr stream);
}

View file

@ -0,0 +1,51 @@
#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));
}
}