Compare commits
2 commits
ae2efc94fb
...
506a6c303e
| Author | SHA1 | Date | |
|---|---|---|---|
| 506a6c303e | |||
| 99b103b267 |
3 changed files with 20 additions and 5 deletions
|
|
@ -15,6 +15,7 @@ namespace psemek::audio
|
||||||
virtual channel_ptr add(stream_ptr stream) = 0;
|
virtual channel_ptr add(stream_ptr stream) = 0;
|
||||||
|
|
||||||
virtual std::size_t stream_count() const = 0;
|
virtual std::size_t stream_count() const = 0;
|
||||||
|
virtual std::size_t max_length() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
using mixer_ptr = std::shared_ptr<mixer>;
|
using mixer_ptr = std::shared_ptr<mixer>;
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,8 @@ namespace psemek::audio
|
||||||
return stream_count_.load();
|
return stream_count_.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::size_t max_length() const override;
|
||||||
|
|
||||||
std::size_t read(util::span<float> samples) override;
|
std::size_t read(util::span<float> samples) override;
|
||||||
|
|
||||||
std::optional<std::size_t> length() const override
|
std::optional<std::size_t> length() const override
|
||||||
|
|
@ -59,6 +61,17 @@ namespace psemek::audio
|
||||||
return result;
|
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)
|
std::size_t mixer_impl::read(util::span<float> samples)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -23,25 +23,26 @@ namespace psemek::audio
|
||||||
|
|
||||||
std::size_t request(std::size_t sample_count) override
|
std::size_t request(std::size_t sample_count) override
|
||||||
{
|
{
|
||||||
std::size_t count = 0;
|
|
||||||
|
|
||||||
if (storage_.size() < samples_.size() + sample_count)
|
if (storage_.size() < samples_.size() + sample_count)
|
||||||
{
|
{
|
||||||
storage_.resize(std::max<std::size_t>(samples_.size() + sample_count, storage_.size() * 2));
|
storage_.resize(std::max<std::size_t>(samples_.size() + sample_count, storage_.size() * 2));
|
||||||
samples_ = {storage_.data(), storage_.data() + samples_.size()};
|
samples_ = {storage_.data(), storage_.data() + samples_.size()};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::size_t count = 0;
|
||||||
if (auto stream = channel_->stream())
|
if (auto stream = channel_->stream())
|
||||||
{
|
{
|
||||||
count = stream->read({storage_.data() + samples_.size(), sample_count});
|
count = stream->read({storage_.data() + samples_.size(), sample_count});
|
||||||
if (count < sample_count)
|
if (count < sample_count)
|
||||||
|
{
|
||||||
channel_->stop();
|
channel_->stop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::fill(storage_.data() + samples_.size() + count, storage_.data() + samples_.size() + sample_count, 0.f);
|
std::fill(storage_.data() + samples_.size() + count, storage_.data() + samples_.size() + count, 0.f);
|
||||||
samples_ = {storage_.data(), storage_.data() + samples_.size() + sample_count};
|
samples_ = {storage_.data(), storage_.data() + samples_.size() + count};
|
||||||
|
|
||||||
return sample_count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
util::span<float const> buffer() const override
|
util::span<float const> buffer() const override
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue