Support retrieving the number of already played samples from a stream

This commit is contained in:
Nikita Lisitsa 2022-10-06 13:12:14 +03:00
parent 62af785c08
commit d19c93af33
9 changed files with 54 additions and 0 deletions

View file

@ -16,6 +16,10 @@ namespace psemek::audio
// Must be called from mixing thread
virtual std::size_t read(float * data, std::size_t sample_count) = 0;
// The number of samples already played from this stream
// Must be called from mixing thread
virtual std::size_t played() const = 0;
virtual ~stream() {}
};

View file

@ -19,6 +19,11 @@ namespace psemek::audio
return std::nullopt;
}
std::size_t played() const override
{
return played_;
}
std::size_t read(float * data, std::size_t sample_count) override
{
auto end = data + sample_count;
@ -28,11 +33,13 @@ namespace psemek::audio
*p++ = v;
*p++ = v;
}
played_ += sample_count;
return sample_count;
}
private:
Func func_;
std::size_t played_ = 0;
};
}

View file

@ -32,6 +32,11 @@ namespace psemek::audio
return common_->stream->length();
}
std::size_t played() const override
{
return common_->stream->played();
}
std::size_t read(float * data, std::size_t sample_count) override
{
if (counter_ == common_->counter)

View file

@ -23,6 +23,11 @@ namespace psemek::audio
return stream_->length();
}
std::size_t played() const override
{
return stream_->played();
}
std::size_t read(float * data, std::size_t sample_count) override
{
auto const result = stream_->read(data, sample_count);

View file

@ -24,6 +24,11 @@ namespace psemek::audio
return stream_->length();
}
std::size_t played() const override
{
return stream_->played();
}
std::size_t read(float * data, std::size_t sample_count) override
{
if (current_ >= length_)

View file

@ -26,6 +26,11 @@ namespace psemek::audio
return stream_->length();
}
std::size_t played() const override
{
return stream_->played();
}
std::size_t read(float * data, std::size_t sample_count) override
{
auto result = stream_->read(data, sample_count);

View file

@ -23,6 +23,11 @@ namespace psemek::audio
return std::nullopt;
}
std::size_t played() const override
{
return played_;
}
private:
std::vector<channel_ptr> channels_;
std::vector<channel_ptr> alive_channels_;
@ -31,6 +36,8 @@ namespace psemek::audio
std::mutex new_channels_mutex_;
std::vector<channel_ptr> new_channels_;
std::size_t played_ = 0;
};
channel_ptr mixer_impl::add(stream_ptr stream)
@ -89,6 +96,8 @@ namespace psemek::audio
std::swap(channels_, alive_channels_);
alive_channels_.clear();
played_ += sample_count;
return sample_count;
}

View file

@ -29,6 +29,11 @@ namespace psemek::audio
return right;
}
std::size_t played() const override
{
return std::min(left_->played(), right_->played());
}
std::size_t read(float * data, std::size_t sample_count) override
{
if (buffer_.size() < sample_count)

View file

@ -12,6 +12,7 @@ namespace psemek::audio
std::size_t read(float * data, std::size_t sample_count) override
{
std::fill(data, data + sample_count, 0.f);
played_ += sample_count;
return sample_count;
}
@ -19,6 +20,14 @@ namespace psemek::audio
{
return std::nullopt;
}
std::size_t played() const override
{
return played_;
}
private:
std::size_t played_ = 0;
};
}