diff --git a/libs/audio/include/psemek/audio/wave/white_noise.hpp b/libs/audio/include/psemek/audio/wave/white_noise.hpp index a19306f5..77eb954a 100644 --- a/libs/audio/include/psemek/audio/wave/white_noise.hpp +++ b/libs/audio/include/psemek/audio/wave/white_noise.hpp @@ -5,6 +5,10 @@ namespace psemek::audio { + // True noise + stream_ptr white_noise(); + + // Fixed-buffer noise to simulate a specific frequency stream_ptr white_noise(float frequency); } diff --git a/libs/audio/source/wave/white_noise.cpp b/libs/audio/source/wave/white_noise.cpp index 13b58472..0eb865f2 100644 --- a/libs/audio/source/wave/white_noise.cpp +++ b/libs/audio/source/wave/white_noise.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include #include @@ -14,8 +16,41 @@ namespace psemek::audio 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 + { + for (std::size_t i = 0; i < samples.size(); i += 2) + { + float value = d_(rng_); + samples[i + 0] = value; + samples[i + 1] = value; + } + + played_.fetch_add(samples.size()); + + return samples.size(); + } + + std::size_t played() const override + { + return played_.load(); + } + + private: + random::generator rng_{0x4b0a763ef6573bf2ull, 0}; + random::uniform_distribution d_{-1.f, 1.f}; + std::atomic played_; + }; + + struct fixed_white_noise_impl + : stream + { + fixed_white_noise_impl(float frequency) + : buffer_(detail::white_noise(std::round(audio::frequency / frequency))) {} std::optional length() const override @@ -29,13 +64,15 @@ namespace psemek::audio 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]; + samples[i + 0] = buffer_[buffer_pos_]; + samples[i + 1] = buffer_[buffer_pos_]; - buffer_pos_ += 2; + buffer_pos_ += 1; buffer_pos_ %= size; } + played_.fetch_add(samples.size()); + return samples.size(); } @@ -53,9 +90,14 @@ namespace psemek::audio } + stream_ptr white_noise() + { + return std::make_shared(); + } + stream_ptr white_noise(float frequency) { - return std::make_shared(frequency); + return std::make_shared(frequency); } }