Audio stuff

This commit is contained in:
Nikita Lisitsa 2023-05-01 01:20:07 +03:00
parent 4b223c5ed1
commit 0675585a53
5 changed files with 74 additions and 3 deletions

View file

@ -2,7 +2,7 @@
#include <vector>
namespace psemek::audio
namespace psemek::audio::detail
{
std::vector<float> white_noise(std::size_t sample_count);

View file

@ -0,0 +1,10 @@
#pragma once
#include <psemek/audio/stream.hpp>
namespace psemek::audio
{
stream_ptr white_noise(float frequency);
}

View file

@ -3,7 +3,7 @@
#include <psemek/random/generator.hpp>
#include <psemek/random/uniform.hpp>
namespace psemek::audio
namespace psemek::audio::detail
{
std::vector<float> white_noise(std::size_t sample_count)

View file

@ -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<std::size_t> length() const override

View file

@ -0,0 +1,61 @@
#include <psemek/audio/wave/white_noise.hpp>
#include <psemek/audio/constants.hpp>
#include <psemek/audio/detail/white_noise.hpp>
#include <vector>
#include <atomic>
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<std::size_t> length() const override
{
return std::nullopt;
}
std::size_t read(util::span<float> 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<float> buffer_;
std::size_t buffer_pos_{0};
std::atomic<std::size_t> played_;
};
}
stream_ptr white_noise(float frequency)
{
return std::make_shared<white_noise_impl>(frequency);
}
}