From 5f71d0b0e14bd2927836eee98141133c84a3ed67 Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Thu, 13 Mar 2025 19:48:01 -0400 Subject: [PATCH] Underflow on clipped outputs; Fix for Shiroverb. --- src/AlsaDriver.cpp | 14 +++++++------- src/Lv2Effect.cpp | 3 ++- src/Lv2Pedalboard.cpp | 3 ++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/AlsaDriver.cpp b/src/AlsaDriver.cpp index 9b14d64..bcc4eab 100644 --- a/src/AlsaDriver.cpp +++ b/src/AlsaDriver.cpp @@ -720,7 +720,7 @@ namespace pipedal std::vector &buffers = this->captureBuffers; int channels = this->captureChannels; - constexpr float scale = 1.0f / (std::numeric_limits::max() + 1L); + constexpr double scale = 1.0f / (std::numeric_limits::max() + 1L); for (size_t frame = 0; frame < frames; ++frame) { for (int channel = 0; channel < channels; ++channel) @@ -891,7 +891,7 @@ namespace pipedal std::vector &buffers = this->playbackBuffers; int channels = this->playbackChannels; - constexpr float scale = std::numeric_limits::max(); + constexpr double scale = std::numeric_limits::max(); for (size_t frame = 0; frame < frames; ++frame) { for (int channel = 0; channel < channels; ++channel) @@ -913,7 +913,7 @@ namespace pipedal std::vector &buffers = this->playbackBuffers; int channels = this->playbackChannels; - constexpr float scale = 0x00FFFFFF; + constexpr double scale = 0x00FFFFFF; for (size_t frame = 0; frame < frames; ++frame) { for (int channel = 0; channel < channels; ++channel) @@ -935,7 +935,7 @@ namespace pipedal std::vector &buffers = this->playbackBuffers; int channels = this->playbackChannels; - constexpr float scale = 0x00FFFFFF; + constexpr double scale = 0x00FFFFFF; for (size_t frame = 0; frame < frames; ++frame) { for (int channel = 0; channel < channels; ++channel) @@ -955,7 +955,7 @@ namespace pipedal std::vector &buffers = this->playbackBuffers; int channels = this->playbackChannels; - constexpr float scale = std::numeric_limits::max(); + constexpr double scale = std::numeric_limits::max(); for (size_t frame = 0; frame < frames; ++frame) { for (int channel = 0; channel < channels; ++channel) @@ -975,7 +975,7 @@ namespace pipedal std::vector &buffers = this->playbackBuffers; int channels = this->playbackChannels; - constexpr float scale = std::numeric_limits::max(); + constexpr double scale = std::numeric_limits::max(); for (size_t frame = 0; frame < frames; ++frame) { for (int channel = 0; channel < channels; ++channel) @@ -1000,7 +1000,7 @@ namespace pipedal std::vector &buffers = this->playbackBuffers; int channels = this->playbackChannels; - constexpr float scale = std::numeric_limits::max(); + constexpr double scale = std::numeric_limits::max(); for (size_t frame = 0; frame < frames; ++frame) { for (int channel = 0; channel < channels; ++channel) diff --git a/src/Lv2Effect.cpp b/src/Lv2Effect.cpp index a3db00a..915164c 100644 --- a/src/Lv2Effect.cpp +++ b/src/Lv2Effect.cpp @@ -464,7 +464,7 @@ void Lv2Effect::SetAudioOutputBuffer(int index, float *buffer) if (this->inputAudioPortIndices.size() != 0) // i.e. we're not mixing a zero-input control { - if ((size_t)index < this->inputAudioPortIndices.size()) + if ((size_t)index < this->outputAudioPortIndices.size()) { int pluginIndex = this->outputAudioPortIndices[index]; lilv_instance_connect_port(pInstance, pluginIndex, buffer); @@ -562,6 +562,7 @@ void Lv2Effect::AssignUnconnectedPorts() { float *buffer = bufferPool.AllocateBuffer(pHost->GetMaxAudioBufferSize()); int pluginIndex = this->outputAudioPortIndices[i]; + lilv_instance_connect_port(pInstance, pluginIndex, buffer); } } } diff --git a/src/Lv2Pedalboard.cpp b/src/Lv2Pedalboard.cpp index 8fef924..8bed348 100644 --- a/src/Lv2Pedalboard.cpp +++ b/src/Lv2Pedalboard.cpp @@ -112,7 +112,8 @@ std::vector Lv2Pedalboard::PrepareItems( { std::shared_ptr pLv2Effect; - if (existingEffects && existingEffects->contains(item.instanceId())) + if (existingEffects && existingEffects->contains(item.instanceId()) + ) { pLv2Effect = existingEffects->at(item.instanceId()); ((Lv2Effect*)pLv2Effect.get())->SetBorrowedEffect(true);