Port FluidSim core and scenarios to C++20
This commit is contained in:
36
src/audio_output_stream.cpp
Normal file
36
src/audio_output_stream.cpp
Normal file
@@ -0,0 +1,36 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user