diff --git a/libs/audio/include/psemek/audio/stream.hpp b/libs/audio/include/psemek/audio/stream.hpp index 910d15bc..9f41ad8c 100644 --- a/libs/audio/include/psemek/audio/stream.hpp +++ b/libs/audio/include/psemek/audio/stream.hpp @@ -17,7 +17,6 @@ namespace psemek::audio 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() {} diff --git a/libs/audio/include/psemek/audio/wave/generator.hpp b/libs/audio/include/psemek/audio/wave/generator.hpp index c0540ed2..dbb70f63 100644 --- a/libs/audio/include/psemek/audio/wave/generator.hpp +++ b/libs/audio/include/psemek/audio/wave/generator.hpp @@ -3,6 +3,8 @@ #include #include +#include + namespace psemek::audio { @@ -21,7 +23,7 @@ namespace psemek::audio std::size_t played() const override { - return played_; + return played_.load(); } std::size_t read(float * data, std::size_t sample_count) override @@ -33,13 +35,19 @@ namespace psemek::audio *p++ = v; *p++ = v; } - played_ += sample_count; + played_.fetch_add(sample_count); return sample_count; } private: Func func_; - std::size_t played_ = 0; + std::atomic played_{0}; }; + template + auto make_generator(Func && func) + { + return std::make_shared>>(std::forward(func)); + } + } diff --git a/libs/audio/source/mixer.cpp b/libs/audio/source/mixer.cpp index 35af129a..95f945fa 100644 --- a/libs/audio/source/mixer.cpp +++ b/libs/audio/source/mixer.cpp @@ -25,7 +25,7 @@ namespace psemek::audio std::size_t played() const override { - return played_; + return played_.load(); } private: @@ -37,7 +37,7 @@ namespace psemek::audio std::mutex new_channels_mutex_; std::vector new_channels_; - std::size_t played_ = 0; + std::atomic played_{0}; }; channel_ptr mixer_impl::add(stream_ptr stream) @@ -96,7 +96,7 @@ namespace psemek::audio std::swap(channels_, alive_channels_); alive_channels_.clear(); - played_ += sample_count; + played_.fetch_add(sample_count); return sample_count; } diff --git a/libs/audio/source/wave/sawtooth.cpp b/libs/audio/source/wave/sawtooth.cpp index 979a02bb..3e74c08f 100644 --- a/libs/audio/source/wave/sawtooth.cpp +++ b/libs/audio/source/wave/sawtooth.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include @@ -16,7 +15,7 @@ namespace psemek::audio return (2.f / geom::pi) * (- std::atan2(z.real() + 1.f, z.imag())); }; - return util::to_shared(generator_stream(func)); + return make_generator(func); } } diff --git a/libs/audio/source/wave/silence.cpp b/libs/audio/source/wave/silence.cpp index 567752ed..404b2f0e 100644 --- a/libs/audio/source/wave/silence.cpp +++ b/libs/audio/source/wave/silence.cpp @@ -1,40 +1,12 @@ #include +#include namespace psemek::audio { - namespace - { - - struct silence_impl - : stream - { - 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; - } - - std::optional length() const override - { - return std::nullopt; - } - - std::size_t played() const override - { - return played_; - } - - private: - std::size_t played_ = 0; - }; - - } - stream_ptr silence() { - return std::make_shared(); + return make_generator([]{ return 0.f; }); } } diff --git a/libs/audio/source/wave/sine.cpp b/libs/audio/source/wave/sine.cpp index bcbd8ae6..0c3d8bd7 100644 --- a/libs/audio/source/wave/sine.cpp +++ b/libs/audio/source/wave/sine.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include @@ -15,7 +14,7 @@ namespace psemek::audio return o.next().imag(); }; - return util::to_shared(generator_stream(func)); + return make_generator(func); } } diff --git a/libs/audio/source/wave/square.cpp b/libs/audio/source/wave/square.cpp index 1770c4fa..8d96ca51 100644 --- a/libs/audio/source/wave/square.cpp +++ b/libs/audio/source/wave/square.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include @@ -14,7 +13,7 @@ namespace psemek::audio return o.next().imag() > 0.f ? 1.f : -1.f; }; - return util::to_shared(generator_stream(func)); + return make_generator(func); } } diff --git a/libs/audio/source/wave/triangle.cpp b/libs/audio/source/wave/triangle.cpp index f66a894c..54d97c22 100644 --- a/libs/audio/source/wave/triangle.cpp +++ b/libs/audio/source/wave/triangle.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include @@ -16,7 +15,7 @@ namespace psemek::audio return 4.f * std::abs(t - std::floor(t + 0.5f)) - 1.f; }; - return util::to_shared(generator_stream(func)); + return make_generator(func); } }