Support retrieving the number of already played samples from a stream
This commit is contained in:
parent
62af785c08
commit
d19c93af33
9 changed files with 54 additions and 0 deletions
|
|
@ -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() {}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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_)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue