#include "FluidSim/AudioOutputStream.hpp" #include #include namespace fluidsim::port { AudioOutputStream::AudioOutputStream(SimulationRingBuffer& ring, unsigned int sample_rate) : ring_(ring) { initialize(2, sample_rate, {sf::SoundChannel::FrontLeft, sf::SoundChannel::FrontRight}); } bool AudioOutputStream::onGetData(Chunk& data) { const std::size_t read = ring_.read_interpolated(temp_left_, temp_right_, speed()); constexpr float dc_coefficient = 0.9995f; for (std::size_t i = 0; i < read; ++i) { const float left = temp_left_[i] - previous_input_left_ + dc_coefficient * previous_output_left_; const float right = temp_right_[i] - previous_input_right_ + dc_coefficient * previous_output_right_; previous_input_left_ = temp_left_[i]; previous_input_right_ = temp_right_[i]; previous_output_left_ = left; previous_output_right_ = right; const float finite_left = std::isfinite(left) ? std::clamp(left, -1.0f, 1.0f) : 0.0f; const float finite_right = std::isfinite(right) ? std::clamp(right, -1.0f, 1.0f) : 0.0f; output_[i * 2] = static_cast(finite_left * 32767.0f); output_[i * 2 + 1] = static_cast(finite_right * 32767.0f); } std::fill(output_.begin() + static_cast(read * 2), output_.end(), 0); data.samples = output_.data(); data.sampleCount = output_.size(); return true; } void AudioOutputStream::onSeek(sf::Time /*time_offset*/) {} } // namespace fluidsim::port