diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp index 58913a1713..3e1828a40a 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -835,6 +835,16 @@ private: std::vector> renderOps; }; +//============================================================================== +struct SequenceAndLatency +{ + using RenderSequenceVariant = std::variant, + GraphRenderSequence>; + + RenderSequenceVariant sequence; + int latencySamples = 0; +}; + //============================================================================== class RenderSequenceBuilder { @@ -846,19 +856,12 @@ public: static constexpr auto midiChannelIndex = AudioProcessorGraph::midiChannelIndex; - template - static auto build (const Nodes& n, const Connections& c) + template + static SequenceAndLatency build (const Nodes& n, const Connections& c) { - RenderSequence sequence; + GraphRenderSequence sequence; const RenderSequenceBuilder builder (n, c, sequence); - - struct SequenceAndLatency - { - RenderSequence sequence; - int latencySamples = 0; - }; - - return SequenceAndLatency { std::move (sequence), builder.totalLatency }; + return { std::move (sequence), builder.totalLatency }; } private: @@ -1307,8 +1310,7 @@ private: if (output.isMIDI()) { if (inputChannelOfIndexToIgnore != midiChannelIndex - && c.isConnected ({ { output.nodeID, midiChannelIndex }, - { node->nodeID, midiChannelIndex } })) + && c.isConnected ({ output, { node->nodeID, midiChannelIndex } })) return true; } else @@ -1356,37 +1358,49 @@ class RenderSequence public: using AudioGraphIOProcessor = AudioProcessorGraph::AudioGraphIOProcessor; - RenderSequence (PrepareSettings s, const Nodes& n, const Connections& c) - : RenderSequence (s, - RenderSequenceBuilder::build> (n, c), - RenderSequenceBuilder::build> (n, c)) + RenderSequence (const PrepareSettings s, const Nodes& n, const Connections& c) + : RenderSequence (s, s.precision == AudioProcessor::ProcessingPrecision::singlePrecision + ? RenderSequenceBuilder::build (n, c) + : RenderSequenceBuilder::build (n, c)) { } - void process (AudioBuffer& audio, MidiBuffer& midi, AudioPlayHead* playHead) + template + void process (AudioBuffer& audio, MidiBuffer& midi, AudioPlayHead* playHead) { - renderSequenceF.perform (audio, midi, playHead); + if (auto* s = std::get_if> (&sequence.sequence)) + s->perform (audio, midi, playHead); + else + jassertfalse; // Not prepared for this audio format! } - void process (AudioBuffer& audio, MidiBuffer& midi, AudioPlayHead* playHead) + template + void processIO (AudioGraphIOProcessor& io, AudioBuffer& audio, MidiBuffer& midi) { - renderSequenceD.perform (audio, midi, playHead); + if (auto* s = std::get_if> (&sequence.sequence)) + processIOBlock (io, *s, audio, midi); + else + jassertfalse; // Not prepared for this audio format! } - void processIO (AudioGraphIOProcessor& io, AudioBuffer& audio, MidiBuffer& midi) - { - processIOBlock (io, renderSequenceF, audio, midi); - } - - void processIO (AudioGraphIOProcessor& io, AudioBuffer& audio, MidiBuffer& midi) - { - processIOBlock (io, renderSequenceD, audio, midi); - } - - int getLatencySamples() const { return latencySamples; } + int getLatencySamples() const { return sequence.latencySamples; } PrepareSettings getSettings() const { return settings; } private: + template + static decltype (auto) visitRenderSequence (This& t, Callback&& callback) + { + if (auto* sequence = std::get_if> (&t.sequence.sequence)) return callback (*sequence); + if (auto* sequence = std::get_if> (&t.sequence.sequence)) return callback (*sequence); + jassertfalse; + } + + RenderSequence (const PrepareSettings s, SequenceAndLatency&& built) + : settings (s), sequence (std::move (built)) + { + visitRenderSequence (*this, [&] (auto& seq) { seq.prepareBuffers (settings.blockSize); }); + } + template static void processIOBlock (AudioGraphIOProcessor& io, SequenceType& sequence, @@ -1428,23 +1442,8 @@ private: } } - template - RenderSequence (PrepareSettings s, Float f, Double d) - : settings (s), - renderSequenceF (std::move (f.sequence)), - renderSequenceD (std::move (d.sequence)), - latencySamples (f.latencySamples) - { - jassert (f.latencySamples == d.latencySamples); - - renderSequenceF.prepareBuffers (settings.blockSize); - renderSequenceD.prepareBuffers (settings.blockSize); - } - PrepareSettings settings; - GraphRenderSequence renderSequenceF; - GraphRenderSequence renderSequenceD; - int latencySamples = 0; + SequenceAndLatency sequence; }; //============================================================================== diff --git a/modules/juce_core/system/juce_StandardHeader.h b/modules/juce_core/system/juce_StandardHeader.h index 7a0714349c..79170755c3 100644 --- a/modules/juce_core/system/juce_StandardHeader.h +++ b/modules/juce_core/system/juce_StandardHeader.h @@ -72,6 +72,7 @@ #include #include #include +#include #include //==============================================================================