#pragma once #include "FluidSim/SimulationRingBuffer.hpp" #include #include #include #include namespace fluidsim::port { class AudioOutputStream final : public sf::SoundStream { public: explicit AudioOutputStream(SimulationRingBuffer& ring, unsigned int sample_rate = 44100); void set_speed(double speed) { speed_.store(speed, std::memory_order_relaxed); } double speed() const { return speed_.load(std::memory_order_relaxed); } private: static constexpr std::size_t block_size = 512; SimulationRingBuffer& ring_; std::array temp_left_{}, temp_right_{}; std::array output_{}; std::atomic speed_{1.0}; float previous_input_left_{}, previous_output_left_{}; float previous_input_right_{}, previous_output_right_{}; bool onGetData(Chunk& data) override; void onSeek(sf::Time time_offset) override; }; } // namespace fluidsim::port