37template <
typename FloatType>
50 auto numSamples = buffer.getNumSamples();
53 if (numSamples > maxSamples)
56 int chunkStartSample = 0;
57 while (chunkStartSample < numSamples)
59 auto chunkSize =
jmin (maxSamples, numSamples - chunkStartSample);
61 AudioBuffer<FloatType> audioChunk (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), chunkStartSample, chunkSize);
63 midiChunk.addEvents (midiMessages, chunkStartSample, chunkSize, -chunkStartSample);
69 chunkStartSample += maxSamples;
85 op->perform (context);
88 for (
int i = 0;
i < buffer.getNumChannels(); ++
i)
98 createOp ([=] (
const Context&
c) { FloatVectorOperations::clear (
c.audioBuffers[index],
c.numSamples); });
103 createOp ([=] (
const Context&
c) { FloatVectorOperations::copy (
c.audioBuffers[dstIndex],
104 c.audioBuffers[srcIndex],
110 createOp ([=] (
const Context&
c) { FloatVectorOperations::add (
c.audioBuffers[dstIndex],
111 c.audioBuffers[srcIndex],
122 createOp ([=] (
const Context&
c) {
c.midiBuffers[dstIndex] =
c.midiBuffers[srcIndex]; });
127 createOp ([=] (
const Context&
c) {
c.midiBuffers[dstIndex].addEvents (
c.midiBuffers[srcIndex],
128 0,
c.numSamples, 0); });
137 const Array<int>& audioChannelsUsed,
int totalNumChans,
int midiBuffer)
156 const int defaultMIDIBufferSize = 512;
158 midiChunk.ensureSize (defaultMIDIBufferSize);
161 m.ensureSize (defaultMIDIBufferSize);
199 template <
typename LambdaType,
200 std::enable_if_t<std::is_rvalue_reference<LambdaType&&>::value,
int> = 0>
205 LambdaOp (LambdaType&&
f) :
function (std::forward<LambdaType> (
f)) {}
211 renderOps.add (
new LambdaOp (std::forward<LambdaType> (
fn)));
229 for (
int i =
c.numSamples; --
i >= 0;)
251 int totalNumChans,
int midiBuffer)
271 auto numAudioChannels = [
this]
273 if (
const auto* proc =
node->getProcessor())
274 if (proc->getTotalNumInputChannels() == 0 && proc->getTotalNumOutputChannels() == 0)
296 if (
node->isBypassed())
305 if (
node->isBypassed())
306 node->processBlockBypassed (buffer, midiMessages);
308 node->processBlock (buffer, midiMessages);
316 if (
node->isBypassed())
317 node->processBlockBypassed (buffer, midiMessages);
319 node->processBlock (buffer, midiMessages);
325 if (
node->isBypassed())
348template <
typename RenderSequence>
414 return delays[nodeID.uid];
421 for (
auto&&
c :
graph.getConnections())
422 if (
c.destination.nodeID == nodeID)
430 std::unordered_set<Node*>& parents,
431 const std::unordered_map<
Node*, std::unordered_set<Node*>>& otherParents)
435 auto* parentNode =
i.otherNode;
437 if (parentNode == child)
440 if (parents.insert (parentNode).second)
442 auto parentParents = otherParents.find (parentNode);
444 if (parentParents != otherParents.end())
446 parents.insert (parentParents->second.begin(), parentParents->second.end());
459 std::unordered_map<Node*, std::unordered_set<Node*>> nodeParents;
461 for (
auto* node :
graph.getNodes())
463 int insertionIndex = 0;
465 for (; insertionIndex <
result.size(); ++insertionIndex)
467 auto& parents = nodeParents[
result.getUnchecked (insertionIndex)];
469 if (parents.find (node) != parents.end())
473 result.insert (insertionIndex, node);
481 const int ourRenderingIndex,
const int maxLatency)
489 if (sources.isEmpty())
491 if (inputChan >= numOuts)
500 if (sources.size() == 1)
503 auto src = sources.getUnchecked(0);
514 if (inputChan < numOuts
520 sequence.addCopyChannelOp (bufIndex, newFreeBuffer);
521 bufIndex = newFreeBuffer;
526 if (nodeDelay < maxLatency)
527 sequence.addDelayChannelOp (bufIndex, maxLatency - nodeDelay);
533 int reusableInputIndex = -1;
536 for (
int i = 0;
i < sources.size(); ++
i)
538 auto src = sources.getReference(
i);
544 reusableInputIndex =
i;
545 bufIndex = sourceBufIndex;
549 if (nodeDelay < maxLatency)
550 sequence.addDelayChannelOp (bufIndex, maxLatency - nodeDelay);
556 if (reusableInputIndex < 0)
562 audioBuffers.getReference (bufIndex).setAssignedToNonExistentNode();
567 sequence.addClearChannelOp (bufIndex);
569 sequence.addCopyChannelOp (srcIndex, bufIndex);
571 reusableInputIndex = 0;
572 auto nodeDelay =
getNodeDelay (sources.getFirst().nodeID);
574 if (nodeDelay < maxLatency)
575 sequence.addDelayChannelOp (bufIndex, maxLatency - nodeDelay);
578 for (
int i = 0;
i < sources.size(); ++
i)
580 if (
i != reusableInputIndex)
582 auto src = sources.getReference(
i);
589 if (nodeDelay < maxLatency)
593 sequence.addDelayChannelOp (srcIndex, maxLatency - nodeDelay);
598 sequence.addCopyChannelOp (srcIndex, bufferToDelay);
599 sequence.addDelayChannelOp (bufferToDelay, maxLatency - nodeDelay);
600 srcIndex = bufferToDelay;
604 sequence.addAddChannelOp (srcIndex, bufIndex);
618 if (sources.isEmpty())
622 if (processor.acceptsMidi() || processor.producesMidi())
623 sequence.addClearMidiBufferOp (midiBufferToUse);
625 return midiBufferToUse;
629 if (sources.size() == 1)
631 auto src = sources.getReference (0);
634 if (midiBufferToUse >= 0)
641 sequence.addCopyMidiBufferOp (midiBufferToUse, newFreeBuffer);
642 midiBufferToUse = newFreeBuffer;
651 return midiBufferToUse;
655 int midiBufferToUse = -1;
656 int reusableInputIndex = -1;
658 for (
int i = 0;
i < sources.size(); ++
i)
660 auto src = sources.getReference (
i);
663 if (sourceBufIndex >= 0
667 reusableInputIndex =
i;
668 midiBufferToUse = sourceBufIndex;
673 if (reusableInputIndex < 0)
677 jassert (midiBufferToUse >= 0);
682 sequence.addCopyMidiBufferOp (srcIndex, midiBufferToUse);
684 sequence.addClearMidiBufferOp (midiBufferToUse);
686 reusableInputIndex = 0;
689 for (
int i = 0;
i < sources.size(); ++
i)
691 if (
i != reusableInputIndex)
696 sequence.addAddMidiBufferOp (srcIndex, midiBufferToUse);
700 return midiBufferToUse;
707 auto numOuts = processor.getTotalNumOutputChannels();
708 auto totalChans =
jmax (numIns, numOuts);
713 for (
int inputChan = 0; inputChan < numIns; ++inputChan)
719 audioChannelsToUse.
add (index);
721 if (inputChan < numOuts)
725 for (
int outputChan = numIns; outputChan < numOuts; ++outputChan)
729 audioChannelsToUse.
add (index);
736 if (processor.producesMidi())
739 delays.set (node.
nodeID.
uid, maxLatency + processor.getLatencySamples());
744 sequence.addProcessOp (node, audioChannelsToUse, totalChans, midiBufferToUse);
753 for (
auto&&
c :
graph.getConnections())
754 if (
c.destination == nc)
755 results.
add (
c.source);
762 for (
int i = 1;
i < buffers.
size(); ++
i)
767 return buffers.
size() - 1;
776 if (
b.channel == output)
787 for (
auto&
b : buffers)
793 int inputChannelOfIndexToIgnore,
798 auto* node =
orderedNodes.getUnchecked (stepIndexToSearchFrom);
803 &&
graph.isConnected ({ { output.nodeID, AudioProcessorGraph::midiChannelIndex },
804 { node->nodeID, AudioProcessorGraph::midiChannelIndex } }))
809 for (
int i = 0;
i < node->getProcessor()->getTotalNumInputChannels(); ++
i)
810 if (
i != inputChannelOfIndexToIgnore &&
graph.isConnected ({ output, { node->nodeID, i } }))
814 inputChannelOfIndexToIgnore = -1;
815 ++stepIndexToSearchFrom;
830bool AudioProcessorGraph::Connection::operator== (
const Connection& other)
const noexcept
835bool AudioProcessorGraph::Connection::operator!= (
const Connection&
c)
const noexcept
837 return ! operator== (
c);
840bool AudioProcessorGraph::Connection::operator< (
const Connection& other)
const noexcept
842 if (
source.nodeID != other.source.nodeID)
843 return source.nodeID < other.source.nodeID;
845 if (
destination.nodeID != other.destination.nodeID)
846 return destination.nodeID < other.destination.nodeID;
848 if (
source.channelIndex != other.source.channelIndex)
849 return source.channelIndex < other.source.channelIndex;
851 return destination.channelIndex < other.destination.channelIndex;
871 processor->setProcessingPrecision (
processor->supportsDoublePrecisionProcessing() ? precision
874 processor->setRateAndBufferSizeDetails (newSampleRate, newBlockSize);
875 processor->prepareToPlay (newSampleRate, newBlockSize);
899 ioProc->setParentGraph (graph);
902bool AudioProcessorGraph::Node::Connection::operator== (
const Connection& other)
const noexcept
914 if (
auto* bypassParam =
processor->getBypassParameter())
915 return (bypassParam->getValue() != 0.0f);
925 if (
auto* bypassParam =
processor->getBypassParameter())
926 bypassParam->setValueNotifyingHost (shouldBeBypassed ? 1.0f : 0.0f);
950 return "Audio Graph";
976 if (
n->nodeID == nodeID)
984 if (newProcessor ==
nullptr || newProcessor.get() ==
this)
995 if (
n->getProcessor() == newProcessor.get() ||
n->nodeID == nodeID)
1014 n->setParentGraph (
this);
1023 for (
int i =
nodes.size(); --
i >= 0;)
1025 if (
nodes.getUnchecked (
i)->nodeID == nodeId)
1028 auto node =
nodes.removeAndReturn (
i);
1039 if (node !=
nullptr)
1050 connections.push_back ({ {
i.otherNode->nodeID,
i.otherChannel }, { node.
nodeID,
i.thisChannel } });
1053 connections.push_back ({ { node.
nodeID, o.thisChannel }, { o.otherNode->nodeID, o.otherChannel } });
1058 std::vector<Connection> connections;
1063 std::sort (connections.begin(), connections.end());
1064 auto last = std::unique (connections.begin(), connections.end());
1065 connections.erase (last, connections.end());
1072 for (
auto& o : source->outputs)
1073 if (o.otherNode == dest && o.thisChannel == sourceChannel && o.otherChannel == destChannel)
1084 dest,
c.destination.channelIndex);
1093 for (
auto&
out : source->outputs)
1094 if (
out.otherNode == dest)
1110 for (
auto&&
i : dst.inputs)
1111 if (
i.otherNode == &src)
1114 if (recursionCheck > 0)
1115 for (
auto&&
i : dst.inputs)
1116 if (
isAnInputTo (src, *
i.otherNode, recursionCheck - 1))
1127 if (sourceChannel < 0
1130 || sourceIsMIDI != destIsMIDI)
1133 if (source ==
nullptr
1134 || (! sourceIsMIDI && sourceChannel >= source->processor->getTotalNumOutputChannels())
1135 || (sourceIsMIDI && ! source->processor->producesMidi()))
1139 || (! destIsMIDI && destChannel >= dest->processor->getTotalNumInputChannels())
1140 || (destIsMIDI && ! dest->processor->acceptsMidi()))
1143 return !
isConnected (source, sourceChannel, dest, destChannel);
1151 dest,
c.destination.channelIndex);
1162 auto sourceChan =
c.source.channelIndex;
1163 auto destChan =
c.destination.channelIndex;
1165 if (
canConnect (source, sourceChan, dest, destChan))
1167 source->outputs.add ({ dest, destChan, sourceChan });
1168 dest->inputs.add ({ source, sourceChan, destChan });
1185 auto sourceChan =
c.source.channelIndex;
1186 auto destChan =
c.destination.channelIndex;
1188 if (
isConnected (source, sourceChan, dest, destChan))
1190 source->outputs.removeAllInstancesOf ({ dest, destChan, sourceChan });
1191 dest->inputs.removeAllInstancesOf ({ source, sourceChan, destChan });
1205 std::vector<Connection> connections;
1208 if (! connections.empty())
1210 for (
auto c : connections)
1222 return (sourceChannel ==
midiChannelIndex ? source->processor->producesMidi()
1223 :
isPositiveAndBelow (sourceChannel, source->processor->getTotalNumOutputChannels()))
1232 return isLegal (source,
c.source.channelIndex, dest,
c.destination.channelIndex);
1239 bool anyRemoved =
false;
1241 for (
auto* node :
nodes)
1243 std::vector<Connection> connections;
1246 for (
auto c : connections)
1257 std::unique_ptr<RenderSequenceFloat> oldSequenceF;
1258 std::unique_ptr<RenderSequenceDouble> oldSequenceD;
1269 for (
auto* node :
nodes)
1270 if (! node->isPrepared)
1278 auto newSequenceF = std::make_unique<RenderSequenceFloat>();
1279 auto newSequenceD = std::make_unique<RenderSequenceDouble>();
1287 newSequenceF->prepareBuffers (currentBlockSize);
1288 newSequenceD->prepareBuffers (currentBlockSize);
1295 for (
auto* node :
nodes)
1317 const auto newPrepareSettings = [&]
1322 settings.
blockSize = estimatedSamplesPerBlock;
1323 settings.
valid =
true;
1374 n->getProcessor()->reset();
1384 n->getProcessor()->setNonRealtime (isProcessingNonRealtime);
1393template <
typename FloatType,
typename SequenceType>
1396 std::unique_ptr<SequenceType>& renderSequence,
1397 std::atomic<bool>& isPrepared)
1401 while (! isPrepared)
1406 if (renderSequence !=
nullptr)
1407 renderSequence->perform (buffer, midiMessages, graph.
getPlayHead());
1415 if (renderSequence !=
nullptr)
1416 renderSequence->perform (buffer, midiMessages, graph.
getPlayHead());
1421 midiMessages.
clear();
1469 d.category =
"I/O devices";
1470 d.pluginFormatName =
"Internal";
1471 d.manufacturerName =
"JUCE";
1473 d.isInstrument =
false;
1475 d.deprecatedUid =
d.uniqueId =
d.name.hashCode();
1480 d.numInputChannels =
graph->getTotalNumInputChannels();
1485 d.numOutputChannels =
graph->getTotalNumOutputChannels();
1502template <
typename FloatType,
typename SequenceType>
1510 auto&& currentAudioOutputBuffer = sequence.currentAudioOutputBuffer;
1512 for (
int i =
jmin (currentAudioOutputBuffer.getNumChannels(), buffer.getNumChannels()); --
i >= 0;)
1513 currentAudioOutputBuffer.addFrom (
i, 0, buffer,
i, 0, buffer.getNumSamples());
1520 auto* currentInputBuffer = sequence.currentAudioInputBuffer;
1522 for (
int i =
jmin (currentInputBuffer->getNumChannels(), buffer.getNumChannels()); --
i >= 0;)
1523 buffer.copyFrom (
i, 0, *currentInputBuffer,
i, 0, buffer.getNumSamples());
1529 sequence.currentMidiOutputBuffer.addEvents (midiMessages, 0, buffer.getNumSamples(), 0);
1533 midiMessages.
addEvents (*sequence.currentMidiInputBuffer, 0, buffer.getNumSamples(), 0);
1571#if ! JUCE_AUDIOPROCESSOR_NO_GUI
1590 if (
graph !=
nullptr)
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
virtual void setNonRealtime(bool isNonRealtime) noexcept
Definition AudioProcessor.cpp:72
Definition juce_Array.h:56
int size() const noexcept
Definition juce_Array.h:215
void add(const ElementType &newElement)
Definition juce_Array.h:418
ElementType & getReference(int index) noexcept
Definition juce_Array.h:267
Definition juce_AsyncUpdater.h:39
virtual void handleAsyncUpdate()=0
void triggerAsyncUpdate()
Definition juce_AsyncUpdater.cpp:62
void cancelPendingUpdate() noexcept
Definition juce_AsyncUpdater.cpp:74
Definition juce_AudioSampleBuffer.h:34
Definition juce_AudioPlayHead.h:39
Definition juce_AudioProcessorEditor.h:43
Definition juce_AudioProcessorGraph.h:318
void setStateInformation(const void *data, int sizeInBytes) override
Definition juce_AudioProcessorGraph.cpp:1584
const IODeviceType type
Definition juce_AudioProcessorGraph.h:385
AudioProcessorGraph * graph
Definition juce_AudioProcessorGraph.h:386
int getNumPrograms() override
Definition juce_AudioProcessorGraph.cpp:1576
bool supportsDoublePrecisionProcessing() const override
Definition juce_AudioProcessorGraph.cpp:1497
bool isInput() const noexcept
Definition juce_AudioProcessorGraph.cpp:1568
IODeviceType getType() const noexcept
Definition juce_AudioProcessorGraph.h:340
bool acceptsMidi() const override
Definition juce_AudioProcessorGraph.cpp:1558
const String getProgramName(int) override
Definition juce_AudioProcessorGraph.cpp:1580
bool producesMidi() const override
Definition juce_AudioProcessorGraph.cpp:1563
double getTailLengthSeconds() const override
Definition juce_AudioProcessorGraph.cpp:1553
void prepareToPlay(double newSampleRate, int estimatedSamplesPerBlock) override
Definition juce_AudioProcessorGraph.cpp:1488
IODeviceType
Definition juce_AudioProcessorGraph.h:323
@ midiInputNode
Definition juce_AudioProcessorGraph.h:330
@ audioInputNode
Definition juce_AudioProcessorGraph.h:324
@ audioOutputNode
Definition juce_AudioProcessorGraph.h:327
@ midiOutputNode
Definition juce_AudioProcessorGraph.h:333
void setCurrentProgram(int) override
Definition juce_AudioProcessorGraph.cpp:1578
AudioProcessorEditor * createEditor() override
Definition juce_AudioProcessorGraph.cpp:1573
void getStateInformation(juce::MemoryBlock &destData) override
Definition juce_AudioProcessorGraph.cpp:1583
void setParentGraph(AudioProcessorGraph *)
Definition juce_AudioProcessorGraph.cpp:1586
~AudioGraphIOProcessor() override
Definition juce_AudioProcessorGraph.cpp:1448
void releaseResources() override
Definition juce_AudioProcessorGraph.cpp:1493
bool hasEditor() const override
Definition juce_AudioProcessorGraph.cpp:1572
const String getName() const override
Definition juce_AudioProcessorGraph.cpp:1452
int getCurrentProgram() override
Definition juce_AudioProcessorGraph.cpp:1577
AudioGraphIOProcessor(IODeviceType)
Definition juce_AudioProcessorGraph.cpp:1443
void fillInPluginDescription(PluginDescription &) const override
Definition juce_AudioProcessorGraph.cpp:1466
bool isOutput() const noexcept
Definition juce_AudioProcessorGraph.cpp:1569
void changeProgramName(int, const String &) override
Definition juce_AudioProcessorGraph.cpp:1581
void processBlock(AudioBuffer< float > &, MidiBuffer &) override
Definition juce_AudioProcessorGraph.cpp:1541
Definition juce_AudioProcessorGraph.h:101
CriticalSection processorLock
Definition juce_AudioProcessorGraph.h:179
bool isPrepared
Definition juce_AudioProcessorGraph.h:149
ReferenceCountedObjectPtr< Node > Ptr
Definition juce_AudioProcessorGraph.h:129
Array< Connection > outputs
Definition juce_AudioProcessorGraph.h:148
std::unique_ptr< AudioProcessor > processor
Definition juce_AudioProcessorGraph.h:147
Array< Connection > inputs
Definition juce_AudioProcessorGraph.h:148
void prepare(double newSampleRate, int newBlockSize, AudioProcessorGraph *, ProcessingPrecision)
Definition juce_AudioProcessorGraph.cpp:861
void setBypassed(bool shouldBeBypassed) noexcept
Definition juce_AudioProcessorGraph.cpp:921
void setParentGraph(AudioProcessorGraph *) const
Definition juce_AudioProcessorGraph.cpp:894
bool isBypassed() const noexcept
Definition juce_AudioProcessorGraph.cpp:910
AudioProcessor * getProcessor() const noexcept
Definition juce_AudioProcessorGraph.h:110
std::atomic< bool > bypassed
Definition juce_AudioProcessorGraph.h:150
void unprepare()
Definition juce_AudioProcessorGraph.cpp:883
Node(NodeID, std::unique_ptr< AudioProcessor >) noexcept
Definition juce_AudioProcessorGraph.cpp:855
const NodeID nodeID
Definition juce_AudioProcessorGraph.h:107
friend class AudioProcessorGraph
Definition juce_AudioProcessorGraph.h:133
Definition juce_AudioProcessorGraph.h:48
std::unique_ptr< RenderSequenceFloat > renderSequenceFloat
Definition juce_AudioProcessorGraph.h:443
void reset() override
Definition juce_AudioProcessorGraph.cpp:1369
void releaseResources() override
Definition juce_AudioProcessorGraph.cpp:1354
bool supportsDoublePrecisionProcessing() const override
Definition juce_AudioProcessorGraph.cpp:1339
NodeID lastNodeID
Definition juce_AudioProcessorGraph.h:439
bool isLegal(Node *src, int sourceChannel, Node *dest, int destChannel) const noexcept
Definition juce_AudioProcessorGraph.cpp:1220
bool removeIllegalConnections()
Definition juce_AudioProcessorGraph.cpp:1237
static void getNodeConnections(Node &, std::vector< Connection > &)
Definition juce_AudioProcessorGraph.cpp:1047
bool producesMidi() const override
Definition juce_AudioProcessorGraph.cpp:1389
bool isAnInputTo(Node &source, Node &destination) const noexcept
Definition juce_AudioProcessorGraph.cpp:1100
Node::Ptr removeNode(NodeID)
Definition juce_AudioProcessorGraph.cpp:1019
bool disconnectNode(NodeID)
Definition juce_AudioProcessorGraph.cpp:1201
bool isConnectionLegal(const Connection &) const
Definition juce_AudioProcessorGraph.cpp:1228
void handleAsyncUpdate() override
Definition juce_AudioProcessorGraph.cpp:1305
bool isConnected(const Connection &) const noexcept
Definition juce_AudioProcessorGraph.cpp:1079
bool canConnect(const Connection &) const
Definition juce_AudioProcessorGraph.cpp:1146
bool anyNodesNeedPreparing() const noexcept
Definition juce_AudioProcessorGraph.cpp:1267
void processBlock(AudioBuffer< float > &, MidiBuffer &) override
Definition juce_AudioProcessorGraph.cpp:1426
bool acceptsMidi() const override
Definition juce_AudioProcessorGraph.cpp:1388
PrepareSettings prepareSettings
Definition juce_AudioProcessorGraph.h:446
double getTailLengthSeconds() const override
Definition juce_AudioProcessorGraph.cpp:1387
AudioProcessorGraph()
Definition juce_AudioProcessorGraph.cpp:937
~AudioProcessorGraph() override
Definition juce_AudioProcessorGraph.cpp:941
std::unique_ptr< RenderSequenceDouble > renderSequenceDouble
Definition juce_AudioProcessorGraph.h:444
const String getName() const override
Definition juce_AudioProcessorGraph.cpp:948
ReferenceCountedArray< Node > nodes
Definition juce_AudioProcessorGraph.h:438
Node * getNodeForId(NodeID) const
Definition juce_AudioProcessorGraph.cpp:973
void buildRenderingSequence()
Definition juce_AudioProcessorGraph.cpp:1276
void clearRenderingSequence()
Definition juce_AudioProcessorGraph.cpp:1255
Node::Ptr addNode(std::unique_ptr< AudioProcessor > newProcessor, NodeID nodeId={})
Definition juce_AudioProcessorGraph.cpp:982
void setNonRealtime(bool) noexcept override
Definition juce_AudioProcessorGraph.cpp:1377
@ midiChannelIndex
Definition juce_AudioProcessorGraph.h:78
void setStateInformation(const void *data, int sizeInBytes) override
Definition juce_AudioProcessorGraph.cpp:1391
void unprepare()
Definition juce_AudioProcessorGraph.cpp:1344
void clear()
Definition juce_AudioProcessorGraph.cpp:962
void prepareToPlay(double, int) override
Definition juce_AudioProcessorGraph.cpp:1311
bool addConnection(const Connection &)
Definition juce_AudioProcessorGraph.cpp:1156
std::vector< Connection > getConnections() const
Definition juce_AudioProcessorGraph.cpp:1056
bool removeConnection(const Connection &)
Definition juce_AudioProcessorGraph.cpp:1179
void getStateInformation(juce::MemoryBlock &) override
Definition juce_AudioProcessorGraph.cpp:1390
std::atomic< bool > isPrepared
Definition juce_AudioProcessorGraph.h:450
void topologyChanged()
Definition juce_AudioProcessorGraph.cpp:954
Definition juce_AudioProcessor.h:46
int getTotalNumInputChannels() const noexcept
Definition juce_AudioProcessor.h:733
bool isNonRealtime() const noexcept
Definition juce_AudioProcessor.h:930
void updateHostDisplay(const ChangeDetails &details=ChangeDetails::getDefaultFlags())
Definition juce_AudioProcessor.cpp:425
ProcessingPrecision getProcessingPrecision() const noexcept
Definition juce_AudioProcessor.h:681
ProcessingPrecision
Definition juce_AudioProcessor.h:76
@ singlePrecision
Definition juce_AudioProcessor.h:77
const CriticalSection & getCallbackLock() const noexcept
Definition juce_AudioProcessor.h:860
void setPlayConfigDetails(int numIns, int numOuts, double sampleRate, int blockSize)
Definition juce_AudioProcessor.cpp:343
double getSampleRate() const noexcept
Definition juce_AudioProcessor.h:803
int getTotalNumOutputChannels() const noexcept
Definition juce_AudioProcessor.h:747
AudioPlayHead * getPlayHead() const noexcept
Definition juce_AudioProcessor.h:718
int getBlockSize() const noexcept
Definition juce_AudioProcessor.h:814
void setRateAndBufferSizeDetails(double sampleRate, int blockSize) noexcept
Definition juce_AudioProcessor.cpp:370
void sendChangeMessage()
Definition juce_ChangeBroadcaster.cpp:65
Definition juce_HashMap.h:104
Definition juce_HeapBlock.h:87
Definition juce_MemoryBlock.h:33
static MessageManager * getInstance()
Definition juce_MessageManager.cpp:47
Definition juce_MidiBuffer.h:145
void clear() noexcept
Definition juce_MidiBuffer.cpp:110
void addEvents(const MidiBuffer &otherBuffer, int startSample, int numSamples, int sampleDeltaToAdd)
Definition juce_MidiBuffer.cpp:155
Definition juce_OwnedArray.h:51
Definition juce_PluginDescription.h:43
Definition juce_String.h:53
static void JUCE_CALLTYPE sleep(int milliseconds)
Definition juce_posix_SharedCode.h:44
unsigned * m
Definition inflate.c:1559
unsigned d
Definition inflate.c:940
int g
Definition inflate.c:1573
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned f
Definition inflate.c:1572
virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate)=0
JSAMPIMAGE data
Definition jpeglib.h:945
#define JUCE_LEAK_DETECTOR(OwnerClass)
Definition juce_LeakedObjectDetector.h:138
float out
Definition lilv_test.c:1461
Definition carla_juce.cpp:31
CriticalSection::ScopedLockType ScopedLock
Definition juce_CriticalSection.h:186
static void processBlockForBuffer(AudioBuffer< FloatType > &buffer, MidiBuffer &midiMessages, AudioProcessorGraph &graph, std::unique_ptr< SequenceType > &renderSequence, std::atomic< bool > &isPrepared)
Definition juce_AudioProcessorGraph.cpp:1394
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
jack_client_t client jack_client_t client jack_client_t client jack_client_t JackInfoShutdownCallback function
Definition juce_linux_JackAudio.cpp:63
static void updateOnMessageThread(AsyncUpdater &updater)
Definition juce_AudioProcessorGraph.cpp:29
static void processIOBlock(AudioProcessorGraph::AudioGraphIOProcessor &io, SequenceType &sequence, AudioBuffer< FloatType > &buffer, MidiBuffer &midiMessages)
Definition juce_AudioProcessorGraph.cpp:1503
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
Definition juce_AudioProcessorGraph.h:190
NodeAndChannel source
Definition juce_AudioProcessorGraph.h:204
NodeAndChannel destination
Definition juce_AudioProcessorGraph.h:207
Definition juce_AudioProcessorGraph.h:140
int otherChannel
Definition juce_AudioProcessorGraph.h:142
int thisChannel
Definition juce_AudioProcessorGraph.h:142
Node * otherNode
Definition juce_AudioProcessorGraph.h:141
Definition juce_AudioProcessorGraph.h:85
bool isMIDI() const noexcept
Definition juce_AudioProcessorGraph.h:89
Definition juce_AudioProcessorGraph.h:61
uint32 uid
Definition juce_AudioProcessorGraph.h:65
Definition juce_AudioProcessorGraph.h:420
ProcessingPrecision precision
Definition juce_AudioProcessorGraph.h:421
double sampleRate
Definition juce_AudioProcessorGraph.h:422
int blockSize
Definition juce_AudioProcessorGraph.h:423
bool valid
Definition juce_AudioProcessorGraph.h:424
Definition juce_AudioProcessorGraph.cpp:934
Definition juce_AudioProcessorGraph.cpp:933
Definition juce_AudioProcessorGraph.cpp:41
AudioPlayHead * audioPlayHead
Definition juce_AudioProcessorGraph.cpp:44
int numSamples
Definition juce_AudioProcessorGraph.cpp:45
MidiBuffer * midiBuffers
Definition juce_AudioProcessorGraph.cpp:43
FloatType ** audioBuffers
Definition juce_AudioProcessorGraph.cpp:42
Definition juce_AudioProcessorGraph.cpp:216
int writeIndex
Definition juce_AudioProcessorGraph.cpp:241
DelayChannelOp(int chan, int delaySize)
Definition juce_AudioProcessorGraph.cpp:217
HeapBlock< FloatType > buffer
Definition juce_AudioProcessorGraph.cpp:239
const int channel
Definition juce_AudioProcessorGraph.cpp:240
const int bufferSize
Definition juce_AudioProcessorGraph.cpp:240
int readIndex
Definition juce_AudioProcessorGraph.cpp:241
void perform(const Context &c) override
Definition juce_AudioProcessorGraph.cpp:225
Definition juce_AudioProcessorGraph.cpp:248
void callProcess(AudioBuffer< double > &buffer, MidiBuffer &midiMessages)
Definition juce_AudioProcessorGraph.cpp:312
const int midiBufferToUse
Definition juce_AudioProcessorGraph.cpp:340
AudioBuffer< float > tempBufferFloat
Definition juce_AudioProcessorGraph.cpp:339
const AudioProcessorGraph::Node::Ptr node
Definition juce_AudioProcessorGraph.cpp:334
Array< int > audioChannelsToUse
Definition juce_AudioProcessorGraph.cpp:337
ProcessOp(const AudioProcessorGraph::Node::Ptr &n, const Array< int > &audioChannelsUsed, int totalNumChans, int midiBuffer)
Definition juce_AudioProcessorGraph.cpp:249
void perform(const Context &c) override
Definition juce_AudioProcessorGraph.cpp:264
AudioProcessor & processor
Definition juce_AudioProcessorGraph.cpp:335
HeapBlock< FloatType * > audioChannels
Definition juce_AudioProcessorGraph.cpp:338
AudioBuffer< float > tempBufferDouble
Definition juce_AudioProcessorGraph.cpp:339
const int totalChans
Definition juce_AudioProcessorGraph.cpp:340
void callProcess(AudioBuffer< float > &buffer, MidiBuffer &midiMessages)
Definition juce_AudioProcessorGraph.cpp:290
Definition juce_AudioProcessorGraph.cpp:188
virtual ~RenderingOp()
Definition juce_AudioProcessorGraph.cpp:190
RenderingOp() noexcept
Definition juce_AudioProcessorGraph.cpp:189
virtual void perform(const Context &)=0
Definition juce_AudioProcessorGraph.cpp:39
void addCopyChannelOp(int srcIndex, int dstIndex)
Definition juce_AudioProcessorGraph.cpp:101
void addCopyMidiBufferOp(int srcIndex, int dstIndex)
Definition juce_AudioProcessorGraph.cpp:120
void addClearMidiBufferOp(int index)
Definition juce_AudioProcessorGraph.cpp:115
void createOp(LambdaType &&fn)
Definition juce_AudioProcessorGraph.cpp:201
MidiBuffer * currentMidiInputBuffer
Definition juce_AudioProcessorGraph.cpp:179
void addAddMidiBufferOp(int srcIndex, int dstIndex)
Definition juce_AudioProcessorGraph.cpp:125
void addDelayChannelOp(int chan, int delaySize)
Definition juce_AudioProcessorGraph.cpp:131
AudioBuffer< FloatType > renderingBuffer
Definition juce_AudioProcessorGraph.cpp:176
Array< MidiBuffer > midiBuffers
Definition juce_AudioProcessorGraph.cpp:182
void addProcessOp(const AudioProcessorGraph::Node::Ptr &node, const Array< int > &audioChannelsUsed, int totalNumChans, int midiBuffer)
Definition juce_AudioProcessorGraph.cpp:136
AudioBuffer< FloatType > * currentAudioInputBuffer
Definition juce_AudioProcessorGraph.cpp:177
void prepareBuffers(int blockSize)
Definition juce_AudioProcessorGraph.cpp:142
int numMidiBuffersNeeded
Definition juce_AudioProcessorGraph.cpp:174
MidiBuffer midiChunk
Definition juce_AudioProcessorGraph.cpp:183
MidiBuffer currentMidiOutputBuffer
Definition juce_AudioProcessorGraph.cpp:180
void releaseBuffers()
Definition juce_AudioProcessorGraph.cpp:164
void perform(AudioBuffer< FloatType > &buffer, MidiBuffer &midiMessages, AudioPlayHead *audioPlayHead)
Definition juce_AudioProcessorGraph.cpp:48
void addClearChannelOp(int index)
Definition juce_AudioProcessorGraph.cpp:96
void addAddChannelOp(int srcIndex, int dstIndex)
Definition juce_AudioProcessorGraph.cpp:108
AudioBuffer< FloatType > currentAudioOutputBuffer
Definition juce_AudioProcessorGraph.cpp:176
OwnedArray< RenderingOp > renderOps
Definition juce_AudioProcessorGraph.cpp:196
int numBuffersNeeded
Definition juce_AudioProcessorGraph.cpp:174
Definition juce_AudioProcessorGraph.cpp:380
bool isReadOnlyEmpty() const noexcept
Definition juce_AudioProcessorGraph.cpp:386
static NodeID freeNodeID()
Definition juce_AudioProcessorGraph.cpp:396
void setAssignedToNonExistentNode() noexcept
Definition juce_AudioProcessorGraph.cpp:391
static NodeID anonNodeID()
Definition juce_AudioProcessorGraph.cpp:394
bool isFree() const noexcept
Definition juce_AudioProcessorGraph.cpp:387
static AssignedBuffer createReadOnlyEmpty() noexcept
Definition juce_AudioProcessorGraph.cpp:383
AudioProcessorGraph::NodeAndChannel channel
Definition juce_AudioProcessorGraph.cpp:381
static AssignedBuffer createFree() noexcept
Definition juce_AudioProcessorGraph.cpp:384
void setFree() noexcept
Definition juce_AudioProcessorGraph.cpp:390
bool isAssigned() const noexcept
Definition juce_AudioProcessorGraph.cpp:388
static NodeID zeroNodeID()
Definition juce_AudioProcessorGraph.cpp:395
Definition juce_AudioProcessorGraph.cpp:404
NodeID nodeID
Definition juce_AudioProcessorGraph.cpp:405
int delay
Definition juce_AudioProcessorGraph.cpp:406
Definition juce_AudioProcessorGraph.cpp:350
int findBufferForInputMidiChannel(Node &node, int ourRenderingIndex)
Definition juce_AudioProcessorGraph.cpp:612
int getInputLatencyForNode(NodeID nodeID) const
Definition juce_AudioProcessorGraph.cpp:417
RenderSequence & sequence
Definition juce_AudioProcessorGraph.cpp:375
int getBufferContaining(AudioProcessorGraph::NodeAndChannel output) const noexcept
Definition juce_AudioProcessorGraph.cpp:770
AudioProcessorGraph::NodeID NodeID
Definition juce_AudioProcessorGraph.cpp:372
static auto createOrderedNodeList(const AudioProcessorGraph &graph)
Definition juce_AudioProcessorGraph.cpp:455
AudioProcessorGraph & graph
Definition juce_AudioProcessorGraph.cpp:374
int getNodeDelay(NodeID nodeID) const noexcept
Definition juce_AudioProcessorGraph.cpp:412
@ readOnlyEmptyBufferIndex
Definition juce_AudioProcessorGraph.cpp:401
int totalLatency
Definition juce_AudioProcessorGraph.cpp:410
Array< AssignedBuffer > audioBuffers
Definition juce_AudioProcessorGraph.cpp:399
void markAnyUnusedBuffersAsFree(Array< AssignedBuffer > &buffers, const int stepIndex)
Definition juce_AudioProcessorGraph.cpp:785
static void getAllParentsOfNode(const Node *child, std::unordered_set< Node * > &parents, const std::unordered_map< Node *, std::unordered_set< Node * > > &otherParents)
Definition juce_AudioProcessorGraph.cpp:429
void createRenderingOpsForNode(Node &node, const int ourRenderingIndex)
Definition juce_AudioProcessorGraph.cpp:703
Array< AssignedBuffer > midiBuffers
Definition juce_AudioProcessorGraph.cpp:399
static int getFreeBuffer(Array< AssignedBuffer > &buffers)
Definition juce_AudioProcessorGraph.cpp:760
RenderSequenceBuilder(AudioProcessorGraph &g, RenderSequence &s)
Definition juce_AudioProcessorGraph.cpp:351
Array< AudioProcessorGraph::NodeAndChannel > getSourcesForChannel(Node &node, int inputChannelIndex)
Definition juce_AudioProcessorGraph.cpp:748
bool isBufferNeededLater(int stepIndexToSearchFrom, int inputChannelOfIndexToIgnore, AudioProcessorGraph::NodeAndChannel output) const
Definition juce_AudioProcessorGraph.cpp:792
const Array< Node * > orderedNodes
Definition juce_AudioProcessorGraph.cpp:377
AudioProcessorGraph::Node Node
Definition juce_AudioProcessorGraph.cpp:371
int findBufferForInputAudioChannel(Node &node, const int inputChan, const int ourRenderingIndex, const int maxLatency)
Definition juce_AudioProcessorGraph.cpp:480
HashMap< uint32, int > delays
Definition juce_AudioProcessorGraph.cpp:409
const char const char const char const char char * fn
Definition swell-functions.h:168
int n
Definition crypt.c:458
uch * p
Definition crypt.c:594
return c
Definition crypt.c:175
int result
Definition process.c:1455
#define const
Definition zconf.h:137