From 736d9faf975c454cbb0c82746fd5266a4fd8723c Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 8 May 2024 08:14:05 -0400 Subject: [PATCH] Double also (#91) * Support Double Precision in the library; and in consolidated 1. The airwin_consolidated_base gets processDoubleReplacing 2. The AWConsolidatedProcessor gets supportDoublePrecision true 3. processBlock now does the right either-or branch (with templates!) Closes #46 Closes #90 * Include type traits --- src-juce/AWConsolidatedProcessor.cpp | 51 ++++++++++++++-------------- src-juce/AWConsolidatedProcessor.h | 3 ++ src/airwin_consolidated_base.h | 1 + 3 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src-juce/AWConsolidatedProcessor.cpp b/src-juce/AWConsolidatedProcessor.cpp index ad9410d..ca1853e 100644 --- a/src-juce/AWConsolidatedProcessor.cpp +++ b/src-juce/AWConsolidatedProcessor.cpp @@ -1,24 +1,4 @@ -/* - * Surge XT - a free and open source hybrid synthesizer, - * built by Surge Synth Team - * - * Learn more at https://surge-synthesizer.github.io/ - * - * Copyright 2018-2024, various authors, as described in the GitHub - * transaction log. - * - * Surge XT is released under the GNU General Public Licence v3 - * or later (GPL-3.0-or-later). The license is found in the "LICENSE" - * file in the root of this repository, or at - * https://www.gnu.org/licenses/gpl-3.0.en.html - * - * Surge was a commercial product from 2004-2018, copyright and ownership - * held by Claes Johanson at Vember Audio during that period. - * Claes made Surge open source in September 2018. - * - * All source for Surge XT is available at - * https://github.com/surge-synthesizer/surge - */ +#include #include "AWConsolidatedProcessor.h" #include "AWConsolidatedEditor.h" @@ -145,8 +125,8 @@ bool AWConsolidatedAudioProcessor::isBusesLayoutSupported(const BusesLayout &lay return inputValid && outputValid; } -void AWConsolidatedAudioProcessor::processBlock(juce::AudioBuffer &buffer, - juce::MidiBuffer &midiMessages) +template +void AWConsolidatedAudioProcessor::processBlockT(juce::AudioBuffer &buffer) { juce::ScopedNoDenormals noDenormals; @@ -175,8 +155,8 @@ void AWConsolidatedAudioProcessor::processBlock(juce::AudioBuffer &buffer return; } - const float *inputs[2]; - float *outputs[2]; + const T *inputs[2]; + T *outputs[2]; inputs[0] = buffer.getReadPointer(0); inputs[1] = inBus->getNumberOfChannels() == 2 ? buffer.getReadPointer(1) : buffer.getReadPointer(0); @@ -196,9 +176,28 @@ void AWConsolidatedAudioProcessor::processBlock(juce::AudioBuffer &buffer awProcessor->setParameter(i, fxParams[i]->get()); } - awProcessor->processReplacing((float **)inputs, (float **)outputs, buffer.getNumSamples()); + if constexpr (std::is_same_v) + { + awProcessor->processReplacing((float **)inputs, (float **)outputs, buffer.getNumSamples()); + } + else + { + awProcessor->processDoubleReplacing((double **)inputs, (double **)outputs, buffer.getNumSamples()); + } } +void AWConsolidatedAudioProcessor::processBlock(juce::AudioBuffer &buffer, + juce::MidiBuffer &midiMessages) +{ + processBlockT(buffer); +} + +void AWConsolidatedAudioProcessor::processBlock(juce::AudioBuffer &buffer, juce::MidiBuffer &) +{ + processBlockT(buffer); +} + + //============================================================================== bool AWConsolidatedAudioProcessor::hasEditor() const { diff --git a/src-juce/AWConsolidatedProcessor.h b/src-juce/AWConsolidatedProcessor.h index 32b40fa..c6914a4 100644 --- a/src-juce/AWConsolidatedProcessor.h +++ b/src-juce/AWConsolidatedProcessor.h @@ -91,6 +91,9 @@ class AWConsolidatedAudioProcessor : public juce::AudioProcessor, bool isBusesLayoutSupported(const BusesLayout &layouts) const override; void processBlock(juce::AudioBuffer &, juce::MidiBuffer &) override; + void processBlock(juce::AudioBuffer &, juce::MidiBuffer &) override; + bool supportsDoublePrecisionProcessing() const override { return true; } + template void processBlockT(juce::AudioBuffer &); //============================================================================== juce::AudioProcessorEditor *createEditor() override; diff --git a/src/airwin_consolidated_base.h b/src/airwin_consolidated_base.h index 8fcb0ac..21cc565 100644 --- a/src/airwin_consolidated_base.h +++ b/src/airwin_consolidated_base.h @@ -48,6 +48,7 @@ struct AirwinConsolidatedBase virtual void programsAreChunks(bool) {} virtual void processReplacing(float **inputs, float **outputs, VstInt32 sampleFrames) = 0; + virtual void processDoubleReplacing(double **inputs, double **outputs, VstInt32 sampleFrames) = 0; virtual float getParameter(VstInt32 index) = 0; // get the parameter value at the specified index