diff --git a/libs/audio/include/psemek/audio/detail/white_noise.hpp b/libs/audio/include/psemek/audio/detail/white_noise.hpp index 300d6b1d..fa0ad110 100644 --- a/libs/audio/include/psemek/audio/detail/white_noise.hpp +++ b/libs/audio/include/psemek/audio/detail/white_noise.hpp @@ -2,7 +2,7 @@ #include -namespace psemek::audio +namespace psemek::audio::detail { std::vector white_noise(std::size_t sample_count); diff --git a/libs/audio/include/psemek/audio/wave/white_noise.hpp b/libs/audio/include/psemek/audio/wave/white_noise.hpp new file mode 100644 index 00000000..a19306f5 --- /dev/null +++ b/libs/audio/include/psemek/audio/wave/white_noise.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include + +namespace psemek::audio +{ + + stream_ptr white_noise(float frequency); + +} diff --git a/libs/audio/source/detail/white_noise.cpp b/libs/audio/source/detail/white_noise.cpp index b1e9a1c8..393278e1 100644 --- a/libs/audio/source/detail/white_noise.cpp +++ b/libs/audio/source/detail/white_noise.cpp @@ -3,7 +3,7 @@ #include #include -namespace psemek::audio +namespace psemek::audio::detail { std::vector white_noise(std::size_t sample_count) diff --git a/libs/audio/source/wave/karplus_strong.cpp b/libs/audio/source/wave/karplus_strong.cpp index 57b62c62..955202db 100644 --- a/libs/audio/source/wave/karplus_strong.cpp +++ b/libs/audio/source/wave/karplus_strong.cpp @@ -17,7 +17,7 @@ namespace psemek::audio : stream { karplus_strong_impl(float frequency) - : buffer_(white_noise(2 * std::round(audio::frequency / frequency))) + : buffer_(detail::white_noise(2 * std::round(audio::frequency / frequency))) {} std::optional length() const override diff --git a/libs/audio/source/wave/white_noise.cpp b/libs/audio/source/wave/white_noise.cpp new file mode 100644 index 00000000..13b58472 --- /dev/null +++ b/libs/audio/source/wave/white_noise.cpp @@ -0,0 +1,61 @@ +#include +#include +#include + +#include +#include + +namespace psemek::audio +{ + + namespace + { + + struct white_noise_impl + : stream + { + white_noise_impl(float frequency) + : buffer_(detail::white_noise(2 * std::round(audio::frequency / frequency))) + {} + + std::optional length() const override + { + return std::nullopt; + } + + std::size_t read(util::span samples) override + { + std::size_t const size = buffer_.size(); + + for (std::size_t i = 0; i < samples.size(); i += 2) + { + samples[i + 0] = buffer_[buffer_pos_ + 0]; + samples[i + 1] = buffer_[buffer_pos_ + 1]; + + buffer_pos_ += 2; + buffer_pos_ %= size; + } + + return samples.size(); + } + + std::size_t played() const override + { + return played_.load(); + } + + private: + std::vector buffer_; + std::size_t buffer_pos_{0}; + + std::atomic played_; + }; + + } + + stream_ptr white_noise(float frequency) + { + return std::make_shared(frequency); + } + +}