24 : plugin (p), input (in), applyAntiDenormalisationNoise (denormalisationNoise)
40 input->getAudioNodeProperties (info);
44 info.hasAudio =
false;
46 info.numberOfChannels = 0;
49 info.numberOfChannels =
std::max (info.numberOfChannels, plugin->getNumOutputChannelsGivenInputs (info.numberOfChannels));
50 info.hasAudio = info.hasAudio || plugin->producesAudioWhenNoAudioInput();
51 info.hasMidi = info.hasMidi || plugin->takesMidiInput();
52 hasAudioInput = info.hasAudio;
53 hasMidiInput = info.hasMidi;
56 void visitNodes (
const VisitorFn& v)
override
61 input->visitNodes (v);
64 Plugin::Ptr getPlugin()
const override {
return plugin; }
68 const bool pluginWantsMidi = plugin->takesMidiInput() || plugin->isSynth();
70 return (input !=
nullptr && input->purgeSubNodes (keepAudio, keepMidi || pluginWantsMidi))
72 || ! plugin->noTail();
79 hasInitialised =
true;
80 plugin->baseClassInitialise ({ TimePosition::fromSeconds (info.startTime), info.sampleRate, info.blockSizeSamples });
81 latencySeconds = plugin->getLatencySeconds();
84 input->prepareAudioNodeToPlay (info);
88 bool isReadyToRender()
override
91 return input->isReadyToRender();
96 double getLatencySeconds() const noexcept
98 return latencySeconds;
105 hasInitialised =
false;
107 if (input !=
nullptr)
108 input->releaseAudioNodeResources();
110 plugin->baseClassDeinitialise();
116 if (plugin->isEnabled() && (rc.
isRendering || (! plugin->isFrozen())))
122 if (rc.didPlayheadJump())
125 if (input !=
nullptr)
126 input->renderAdding (rc);
130 void renderOver (
const AudioRenderContext& rc)
override
132 if (rc.didPlayheadJump())
135 if (plugin->isEnabled() && (rc.isRendering || (! plugin->isFrozen())))
137 if (latencySeconds > 0)
139 AudioRenderContext rc2 (rc);
140 rc2.streamTime = rc2.streamTime + latencySeconds;
142 input->renderOver (rc2);
147 input->renderOver (rc);
153 input->renderOver (rc);
157 virtual void renderPlugin (
const AudioRenderContext& rc)
159 SCOPED_REALTIME_CHECK
161 if (applyAntiDenormalisationNoise)
162 rc.addAntiDenormalisationNoise();
164 if (! rc.isContiguousWithPreviousBlock())
165 plugin->updateParameterStreams (TimePosition::fromSeconds (rc.getEditTime().editRange1.getStart()));
167 plugin->applyToBufferWithAutomation (createPluginRenderContext (rc));
170 void prepareForNextBlock (
const AudioRenderContext& rc)
override
172 plugin->prepareForNextBlock (TimePosition::fromSeconds (rc.getEditTime().editRange1.getStart()));
173 input->prepareForNextBlock (rc);
180 bool hasAudioInput =
false, hasMidiInput =
false, applyAntiDenormalisationNoise =
false, hasInitialised =
false;
181 double latencySeconds = 0.0;
183 PluginRenderContext createPluginRenderContext (
const AudioRenderContext& rc)
185 return { rc.destBuffer, rc.destBufferChannels, rc.bufferStartSample, rc.bufferNumSamples,
186 rc.bufferForMidiMessages, rc.midiBufferOffset,
188 rc.playhead.isPlaying(), rc.playhead.isUserDragging(), rc.isRendering,
bool isRendering
True if the rendering is happening as part of an offline render rather than live playback.