LMMS
Loading...
Searching...
No Matches
juce_AudioProcessorGraph.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
29//==============================================================================
46 public ChangeBroadcaster,
47 private AsyncUpdater
48{
49public:
50 //==============================================================================
53
57 ~AudioProcessorGraph() override;
58
60 struct NodeID
61 {
62 NodeID() {}
63 explicit NodeID (uint32 i) : uid (i) {}
64
66
67 bool operator== (const NodeID& other) const noexcept { return uid == other.uid; }
68 bool operator!= (const NodeID& other) const noexcept { return uid != other.uid; }
69 bool operator< (const NodeID& other) const noexcept { return uid < other.uid; }
70 };
71
72 //==============================================================================
78 enum { midiChannelIndex = 0x1000 };
79
80 //==============================================================================
85 {
88
90
91 bool operator== (const NodeAndChannel& other) const noexcept { return nodeID == other.nodeID && channelIndex == other.channelIndex; }
92 bool operator!= (const NodeAndChannel& other) const noexcept { return ! operator== (other); }
93 };
94
95 //==============================================================================
101 {
102 public:
103 //==============================================================================
108
111
119
120 //==============================================================================
123
125 void setBypassed (bool shouldBeBypassed) noexcept;
126
127 //==============================================================================
130
131 private:
132 //==============================================================================
134 template <typename Float>
135 friend struct GraphRenderSequence;
136 template <typename Float>
138
140 {
143
144 bool operator== (const Connection&) const noexcept;
145 };
146
147 std::unique_ptr<AudioProcessor> processor;
149 bool isPrepared = false;
150 std::atomic<bool> bypassed { false };
151
152 Node (NodeID, std::unique_ptr<AudioProcessor>) noexcept;
153
154 void setParentGraph (AudioProcessorGraph*) const;
155 void prepare (double newSampleRate, int newBlockSize, AudioProcessorGraph*, ProcessingPrecision);
156 void unprepare();
157
158 template <typename Sample>
160 MidiBuffer& midi,
162 {
163 const ScopedLock lock (processorLock);
164 (processor.get()->*function) (audio, midi);
165 }
166
167 template <typename Sample>
172
173 template <typename Sample>
178
180
182 };
183
184 //==============================================================================
190 {
191 //==============================================================================
192 Connection() = default;
194
195 Connection (const Connection&) = default;
196 Connection& operator= (const Connection&) = default;
197
198 bool operator== (const Connection&) const noexcept;
199 bool operator!= (const Connection&) const noexcept;
200 bool operator< (const Connection&) const noexcept;
201
202 //==============================================================================
205
208 };
209
210 //==============================================================================
214 void clear();
215
218
220 int getNumNodes() const noexcept { return nodes.size(); }
221
226 Node::Ptr getNode (int index) const noexcept { return nodes[index]; }
227
232 Node* getNodeForId (NodeID) const;
233
245 Node::Ptr addNode (std::unique_ptr<AudioProcessor> newProcessor, NodeID nodeId = {});
246
250 Node::Ptr removeNode (NodeID);
251
255 Node::Ptr removeNode (Node*);
256
258 std::vector<Connection> getConnections() const;
259
261 bool isConnected (const Connection&) const noexcept;
262
266 bool isConnected (NodeID possibleSourceNodeID, NodeID possibleDestNodeID) const noexcept;
267
271 bool isAnInputTo (Node& source, Node& destination) const noexcept;
272
274 bool canConnect (const Connection&) const;
275
281 bool addConnection (const Connection&);
282
284 bool removeConnection (const Connection&);
285
287 bool disconnectNode (NodeID);
288
294 bool isConnectionLegal (const Connection&) const;
295
301 bool removeIllegalConnections();
302
303 //==============================================================================
318 {
319 public:
337
338 //==============================================================================
341
345
347 bool isInput() const noexcept;
349 bool isOutput() const noexcept;
350
351 //==============================================================================
352 AudioGraphIOProcessor (IODeviceType);
354
356 void fillInPluginDescription (PluginDescription&) const override;
357 void prepareToPlay (double newSampleRate, int estimatedSamplesPerBlock) override;
362
366
367 #if ! JUCE_AUDIOPROCESSOR_NO_GUI
368 bool hasEditor() const override;
370 #endif
371
372 int getNumPrograms() override;
373 int getCurrentProgram() override;
374 void setCurrentProgram (int) override;
375 const String getProgramName (int) override;
376 void changeProgramName (int, const String&) override;
377
378 void getStateInformation (juce::MemoryBlock& destData) override;
379 void setStateInformation (const void* data, int sizeInBytes) override;
380
382 void setParentGraph (AudioProcessorGraph*);
383
384 private:
387
389 };
390
391 //==============================================================================
392 const String getName() const override;
393 void prepareToPlay (double, int) override;
394 void releaseResources() override;
395 void processBlock (AudioBuffer<float>&, MidiBuffer&) override;
397 bool supportsDoublePrecisionProcessing() const override;
398
399 void reset() override;
400 void setNonRealtime (bool) noexcept override;
401
402 double getTailLengthSeconds() const override;
403 bool acceptsMidi() const override;
404 bool producesMidi() const override;
405
406 #if ! JUCE_AUDIOPROCESSOR_NO_GUI
407 bool hasEditor() const override { return false; }
408 AudioProcessorEditor* createEditor() override { return nullptr; }
409 #endif
410 int getNumPrograms() override { return 0; }
411 int getCurrentProgram() override { return 0; }
412 void setCurrentProgram (int) override { }
413 const String getProgramName (int) override { return {}; }
414 void changeProgramName (int, const String&) override { }
415 void getStateInformation (juce::MemoryBlock&) override;
416 void setStateInformation (const void* data, int sizeInBytes) override;
417
418private:
420 {
422 double sampleRate = 0.0;
423 int blockSize = 0;
424 bool valid = false;
425
426 using Tied = std::tuple<const ProcessingPrecision&,
427 const double&,
428 const int&,
429 const bool&>;
430
432
433 bool operator== (const PrepareSettings& other) const noexcept { return tie() == other.tie(); }
434 bool operator!= (const PrepareSettings& other) const noexcept { return tie() != other.tie(); }
435 };
436
437 //==============================================================================
440
441 struct RenderSequenceFloat;
442 struct RenderSequenceDouble;
443 std::unique_ptr<RenderSequenceFloat> renderSequenceFloat;
444 std::unique_ptr<RenderSequenceDouble> renderSequenceDouble;
445
447
449
450 std::atomic<bool> isPrepared { false };
451
452 void topologyChanged();
453 void unprepare();
454 void handleAsyncUpdate() override;
455 void clearRenderingSequence();
456 void buildRenderingSequence();
457 bool anyNodesNeedPreparing() const noexcept;
458 bool isConnected (Node* src, int sourceChannel, Node* dest, int destChannel) const noexcept;
459 bool isAnInputTo (Node& src, Node& dst, int recursionCheck) const noexcept;
460 bool canConnect (Node* src, int sourceChannel, Node* dest, int destChannel) const noexcept;
461 bool isLegal (Node* src, int sourceChannel, Node* dest, int destChannel) const noexcept;
462 static void getNodeConnections (Node&, std::vector<Connection>&);
463
465};
466
467} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
#define override
Definition DistrhoDefines.h:73
Definition juce_Array.h:56
AsyncUpdater()
Definition juce_AsyncUpdater.cpp:44
Definition juce_AudioSampleBuffer.h:34
Definition juce_AudioProcessorEditor.h:43
Definition juce_AudioProcessorGraph.h:318
AudioProcessorGraph * getParentGraph() const noexcept
Definition juce_AudioProcessorGraph.h:344
const IODeviceType type
Definition juce_AudioProcessorGraph.h:385
AudioProcessorGraph * graph
Definition juce_AudioProcessorGraph.h:386
IODeviceType getType() const noexcept
Definition juce_AudioProcessorGraph.h:340
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
AudioGraphIOProcessor(IODeviceType)
Definition juce_AudioProcessorGraph.cpp:1443
Definition juce_AudioProcessorGraph.h:101
CriticalSection processorLock
Definition juce_AudioProcessorGraph.h:179
bool isPrepared
Definition juce_AudioProcessorGraph.h:149
friend struct RenderSequenceBuilder
Definition juce_AudioProcessorGraph.h:137
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
void processBlock(AudioBuffer< Sample > &audio, MidiBuffer &midi)
Definition juce_AudioProcessorGraph.h:168
Array< Connection > inputs
Definition juce_AudioProcessorGraph.h:148
void setBypassed(bool shouldBeBypassed) noexcept
Definition juce_AudioProcessorGraph.cpp:921
friend struct GraphRenderSequence
Definition juce_AudioProcessorGraph.h:135
bool isBypassed() const noexcept
Definition juce_AudioProcessorGraph.cpp:910
AudioProcessor * getProcessor() const noexcept
Definition juce_AudioProcessorGraph.h:110
NamedValueSet properties
Definition juce_AudioProcessorGraph.h:118
std::atomic< bool > bypassed
Definition juce_AudioProcessorGraph.h:150
void processBlockBypassed(AudioBuffer< Sample > &audio, MidiBuffer &midi)
Definition juce_AudioProcessorGraph.h:174
Node(NodeID, std::unique_ptr< AudioProcessor >) noexcept
Definition juce_AudioProcessorGraph.cpp:855
void callProcessFunction(AudioBuffer< Sample > &audio, MidiBuffer &midi, void(AudioProcessor::*function)(AudioBuffer< Sample > &, MidiBuffer &))
Definition juce_AudioProcessorGraph.h:159
const NodeID nodeID
Definition juce_AudioProcessorGraph.h:107
friend class AudioProcessorGraph
Definition juce_AudioProcessorGraph.h:133
Definition juce_AudioProcessorGraph.h:48
int getNumPrograms() override
Definition juce_AudioProcessorGraph.h:410
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
void setCurrentProgram(int) override
Definition juce_AudioProcessorGraph.h:412
bool producesMidi() const override
Definition juce_AudioProcessorGraph.cpp:1389
const ReferenceCountedArray< Node > & getNodes() const noexcept
Definition juce_AudioProcessorGraph.h:217
Node::Ptr getNode(int index) const noexcept
Definition juce_AudioProcessorGraph.h:226
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
void changeProgramName(int, const String &) override
Definition juce_AudioProcessorGraph.h:414
double getTailLengthSeconds() const override
Definition juce_AudioProcessorGraph.cpp:1387
int getCurrentProgram() override
Definition juce_AudioProcessorGraph.h:411
AudioProcessorGraph()
Definition juce_AudioProcessorGraph.cpp:937
std::unique_ptr< RenderSequenceDouble > renderSequenceDouble
Definition juce_AudioProcessorGraph.h:444
const String getName() const override
Definition juce_AudioProcessorGraph.cpp:948
AudioProcessorEditor * createEditor() override
Definition juce_AudioProcessorGraph.h:408
ReferenceCountedArray< Node > nodes
Definition juce_AudioProcessorGraph.h:438
bool hasEditor() const override
Definition juce_AudioProcessorGraph.h:407
void setNonRealtime(bool) noexcept override
Definition juce_AudioProcessorGraph.cpp:1377
@ midiChannelIndex
Definition juce_AudioProcessorGraph.h:78
const String getProgramName(int) override
Definition juce_AudioProcessorGraph.h:413
void setStateInformation(const void *data, int sizeInBytes) override
Definition juce_AudioProcessorGraph.cpp:1391
void unprepare()
Definition juce_AudioProcessorGraph.cpp:1344
int getNumNodes() const noexcept
Definition juce_AudioProcessorGraph.h:220
void prepareToPlay(double, int) override
Definition juce_AudioProcessorGraph.cpp:1311
void getStateInformation(juce::MemoryBlock &) override
Definition juce_AudioProcessorGraph.cpp:1390
std::atomic< bool > isPrepared
Definition juce_AudioProcessorGraph.h:450
virtual void processBlockBypassed(AudioBuffer< float > &buffer, MidiBuffer &midiMessages)
Definition juce_AudioProcessor.cpp:600
ProcessingPrecision
Definition juce_AudioProcessor.h:76
@ singlePrecision
Definition juce_AudioProcessor.h:77
virtual void processBlock(AudioBuffer< float > &buffer, MidiBuffer &midiMessages)=0
AudioProcessor()
Definition juce_AudioProcessor.cpp:36
ChangeBroadcaster() noexcept
Definition juce_ChangeBroadcaster.cpp:26
Definition juce_CriticalSection.h:43
Definition juce_MidiBuffer.h:145
Definition juce_NamedValueSet.h:35
Definition juce_PluginDescription.h:43
Definition juce_ReferenceCountedArray.h:51
Definition juce_ReferenceCountedObject.h:247
Definition juce_String.h:53
register unsigned i
Definition inflate.c:1575
JSAMPIMAGE data
Definition jpeglib.h:945
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
#define JUCE_API
Definition juce_StandardHeader.h:152
Definition carla_juce.cpp:31
CriticalSection::ScopedLockType ScopedLock
Definition juce_CriticalSection.h:186
unsigned int uint32
Definition juce_MathsFunctions.h:45
jack_client_t client jack_client_t client jack_client_t client jack_client_t JackInfoShutdownCallback function
Definition juce_linux_JackAudio.cpp:63
Definition juce_Uuid.h:141
Connection(const Connection &)=default
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
NodeID nodeID
Definition juce_AudioProcessorGraph.h:86
int channelIndex
Definition juce_AudioProcessorGraph.h:87
bool isMIDI() const noexcept
Definition juce_AudioProcessorGraph.h:89
Definition juce_AudioProcessorGraph.h:61
NodeID()
Definition juce_AudioProcessorGraph.h:62
NodeID(uint32 i)
Definition juce_AudioProcessorGraph.h:63
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
Tied tie() const noexcept
Definition juce_AudioProcessorGraph.h:431
int blockSize
Definition juce_AudioProcessorGraph.h:423
std::tuple< const ProcessingPrecision &, const double &, const int &, const bool & > Tied
Definition juce_AudioProcessorGraph.h:426
bool valid
Definition juce_AudioProcessorGraph.h:424
#define const
Definition zconf.h:137