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 // Must be called from mixing thread
virtual std::size_t read(float * data, std::size_t sample_count) = 0; 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() {} virtual ~stream() {}
}; };

View file

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

View file

@ -32,6 +32,11 @@ namespace psemek::audio
return common_->stream->length(); 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 std::size_t read(float * data, std::size_t sample_count) override
{ {
if (counter_ == common_->counter) if (counter_ == common_->counter)

View file

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

View file

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

View file

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

View file

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

View file

@ -29,6 +29,11 @@ namespace psemek::audio
return right; 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 std::size_t read(float * data, std::size_t sample_count) override
{ {
if (buffer_.size() < sample_count) 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::size_t read(float * data, std::size_t sample_count) override
{ {
std::fill(data, data + sample_count, 0.f); std::fill(data, data + sample_count, 0.f);
played_ += sample_count;
return sample_count; return sample_count;
} }
@ -19,6 +20,14 @@ namespace psemek::audio
{ {
return std::nullopt; return std::nullopt;
} }
std::size_t played() const override
{
return played_;
}
private:
std::size_t played_ = 0;
}; };
} }