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
|
// 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() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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_)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue