Add audio::recorder
This commit is contained in:
parent
9d58904a66
commit
e4871da0c5
2 changed files with 73 additions and 0 deletions
22
libs/audio/include/psemek/audio/recorder.hpp
Normal file
22
libs/audio/include/psemek/audio/recorder.hpp
Normal 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);
|
||||||
|
|
||||||
|
}
|
||||||
51
libs/audio/source/recorder.cpp
Normal file
51
libs/audio/source/recorder.cpp
Normal 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue