36 lines
981 B
C++
36 lines
981 B
C++
#pragma once
|
|
|
|
#include <atomic>
|
|
#include <condition_variable>
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <mutex>
|
|
#include <span>
|
|
#include <stop_token>
|
|
#include <vector>
|
|
|
|
namespace fluidsim::port {
|
|
|
|
class SimulationRingBuffer {
|
|
public:
|
|
explicit SimulationRingBuffer(std::size_t capacity);
|
|
std::size_t available_samples() const;
|
|
std::size_t free_space() const;
|
|
bool write(float left, float right, std::stop_token stop = {});
|
|
bool wait_for_space(std::size_t target_fill, std::stop_token stop);
|
|
void reset_consumer();
|
|
std::size_t read_interpolated(std::span<float> left, std::span<float> right, double speed);
|
|
|
|
private:
|
|
std::vector<float> left_, right_;
|
|
std::size_t mask_{};
|
|
std::atomic<std::uint64_t> write_head_{};
|
|
std::atomic<std::uint64_t> read_head_{};
|
|
double read_position_{};
|
|
bool consumer_initialized_{};
|
|
mutable std::mutex wait_mutex_;
|
|
std::condition_variable space_available_;
|
|
};
|
|
|
|
} // namespace fluidsim::port
|