Compare commits

...

2 commits

Author SHA1 Message Date
506a6c303e Add audio::mixer::max_length
All checks were successful
Run tests / Run tests (push) Successful in 6m43s
2026-07-19 19:39:54 +03:00
99b103b267 Fix audio::recorder::request 2026-07-19 19:39:45 +03:00
3 changed files with 20 additions and 5 deletions

View file

@ -15,6 +15,7 @@ namespace psemek::audio
virtual channel_ptr add(stream_ptr stream) = 0;
virtual std::size_t stream_count() const = 0;
virtual std::size_t max_length() const = 0;
};
using mixer_ptr = std::shared_ptr<mixer>;

View file

@ -22,6 +22,8 @@ namespace psemek::audio
return stream_count_.load();
}
std::size_t max_length() const override;
std::size_t read(util::span<float> samples) override;
std::optional<std::size_t> length() const override
@ -59,6 +61,17 @@ namespace psemek::audio
return result;
}
std::size_t mixer_impl::max_length() const
{
// TODO: safe access when the mixer is already playing?
std::size_t result = 0;
for (auto const & channel : new_channels_)
if (auto stream = channel->stream())
if (auto length = stream->length(); length && *length > result)
result = *length;
return result;
}
std::size_t mixer_impl::read(util::span<float> samples)
{
{

View file

@ -23,25 +23,26 @@ namespace psemek::audio
std::size_t request(std::size_t sample_count) override
{
std::size_t count = 0;
if (storage_.size() < samples_.size() + sample_count)
{
storage_.resize(std::max<std::size_t>(samples_.size() + sample_count, storage_.size() * 2));
samples_ = {storage_.data(), storage_.data() + samples_.size()};
}
std::size_t count = 0;
if (auto stream = channel_->stream())
{
count = stream->read({storage_.data() + samples_.size(), sample_count});
if (count < sample_count)
{
channel_->stop();
}
}
std::fill(storage_.data() + samples_.size() + count, storage_.data() + samples_.size() + sample_count, 0.f);
samples_ = {storage_.data(), storage_.data() + samples_.size() + sample_count};
std::fill(storage_.data() + samples_.size() + count, storage_.data() + samples_.size() + count, 0.f);
samples_ = {storage_.data(), storage_.data() + samples_.size() + count};
return sample_count;
return count;
}
util::span<float const> buffer() const override