Audio stuff
This commit is contained in:
parent
4b223c5ed1
commit
0675585a53
5 changed files with 74 additions and 3 deletions
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
#include <vector>
|
||||
|
||||
namespace psemek::audio
|
||||
namespace psemek::audio::detail
|
||||
{
|
||||
|
||||
std::vector<float> white_noise(std::size_t sample_count);
|
||||
|
|
|
|||
10
libs/audio/include/psemek/audio/wave/white_noise.hpp
Normal file
10
libs/audio/include/psemek/audio/wave/white_noise.hpp
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
#pragma once
|
||||
|
||||
#include <psemek/audio/stream.hpp>
|
||||
|
||||
namespace psemek::audio
|
||||
{
|
||||
|
||||
stream_ptr white_noise(float frequency);
|
||||
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
61
libs/audio/source/wave/white_noise.cpp
Normal file
61
libs/audio/source/wave/white_noise.cpp
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue