37 lines
1.5 KiB
C++
37 lines
1.5 KiB
C++
#include "FluidSim/AudioOutputStream.hpp"
|
|
|
|
#include <algorithm>
|
|
#include <cmath>
|
|
|
|
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<std::int16_t>(finite_left * 32767.0f);
|
|
output_[i * 2 + 1] = static_cast<std::int16_t>(finite_right * 32767.0f);
|
|
}
|
|
std::fill(output_.begin() + static_cast<std::ptrdiff_t>(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
|