Support non-owning audio::recorder

This commit is contained in:
Nikita Lisitsa 2022-10-08 14:35:45 +03:00
parent ce5ccfde70
commit 5b0834f097
2 changed files with 27 additions and 10 deletions

View file

@ -21,5 +21,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); std::shared_ptr<recorder> make_recorder(std::vector<float> samples);
std::shared_ptr<recorder> make_recorder(util::span<float const> samples);
} }

View file

@ -16,13 +16,17 @@ namespace psemek::audio
{} {}
recorder_impl(std::vector<float> samples) recorder_impl(std::vector<float> samples)
: buffer_(std::move(samples)) : storage_(std::move(samples))
, length_(buffer_.size()) , samples_(storage_)
{}
recorder_impl(util::span<float const> samples)
: samples_(samples)
{} {}
std::optional<std::size_t> length() const override std::optional<std::size_t> length() const override
{ {
return stream_ ? stream_->length() : buffer_.size(); return stream_ ? stream_->length() : storage_.size();
} }
std::size_t request(std::size_t samples) override std::size_t request(std::size_t samples) override
@ -30,23 +34,26 @@ namespace psemek::audio
if (!stream_) if (!stream_)
return 0; return 0;
if (buffer_.size() < length_ + samples) if (storage_.size() < samples_.size() + samples)
buffer_.resize(std::max<std::size_t>(samples, buffer_.size() * 2)); {
storage_.resize(std::max<std::size_t>(samples, storage_.size() * 2));
samples_ = {storage_.data(), storage_.data() + samples_.size()};
}
auto result = stream_->read(buffer_.data() + length_, samples); auto result = stream_->read(storage_.data() + samples_.size(), samples);
length_ += result; samples_ = {storage_.data(), storage_.data() + samples_.size() + result};
return result; return result;
} }
util::span<float const> buffer() const override util::span<float const> buffer() const override
{ {
return {buffer_.data(), buffer_.data() + length_}; return samples_;
} }
private: private:
stream_ptr stream_; stream_ptr stream_;
std::vector<float> buffer_; std::vector<float> storage_;
std::size_t length_{0}; util::span<float const> samples_;
}; };
} }
@ -58,7 +65,16 @@ namespace psemek::audio
std::shared_ptr<recorder> make_recorder(std::vector<float> samples) std::shared_ptr<recorder> make_recorder(std::vector<float> samples)
{ {
if ((samples.size() % 2) != 0)
throw std::runtime_error("bad sample count");
return std::make_shared<recorder_impl>(std::move(samples)); return std::make_shared<recorder_impl>(std::move(samples));
} }
std::shared_ptr<recorder> make_recorder(util::span<float const> samples)
{
if ((samples.size() % 2) != 0)
throw std::runtime_error("bad sample count");
return std::make_shared<recorder_impl>(samples);
}
} }