Files
FluidSimCpp/include/FluidSim/SimulationRingBuffer.hpp
2026-10-22 23:52:20 +02:00

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