LMMS
Loading...
Searching...
No Matches
AudioProcessorGraph.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the Water library.
5 Copyright (c) 2015 ROLI Ltd.
6 Copyright (C) 2017-2022 Filipe Coelho <falktx@falktx.com>
7
8 Permission is granted to use this software under the terms of the GNU
9 General Public License as published by the Free Software Foundation;
10 either version 2 of the License, or any later version.
11
12 This program is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15
16 For a full copy of the GNU General Public License see the doc/GPL.txt file.
17
18 ==============================================================================
19*/
20
21#ifndef WATER_AUDIOPROCESSORGRAPH_H_INCLUDED
22#define WATER_AUDIOPROCESSORGRAPH_H_INCLUDED
23
24#include "AudioProcessor.h"
27#include "../midi/MidiBuffer.h"
28
29namespace water {
30
31//==============================================================================
46{
47public:
48 //==============================================================================
51
56
57 //==============================================================================
63 {
64 public:
65 //==============================================================================
70
73
75 struct Properties {
76 bool isAudio;
77 bool isCV;
78 bool isMIDI;
79 bool isOSC;
83
84 struct Position {
85 int x1, x2, y1, y2;
86 bool valid;
87
89 : x1(0),
90 x2(0),
91 y1(0),
92 y2(0),
93 valid(false) {}
95
97 : isAudio(false),
98 isCV(false),
100 isOSC(false),
103 pluginId(0),
104 position() {}
106
107 //==============================================================================
110
111 private:
112 //==============================================================================
114
115 const CarlaScopedPointer<AudioProcessor> processor;
117
118 Node (uint32 nodeId, AudioProcessor*) noexcept;
119
121 void prepare (double newSampleRate, int newBlockSize, AudioProcessorGraph*);
122 void unprepare();
123
125 };
126
127 //==============================================================================
133 {
134 public:
135 //==============================================================================
139
140 //==============================================================================
143
148
157
162
171 };
172
173 //==============================================================================
177 void clear();
178
180 int getNumNodes() const noexcept { return nodes.size(); }
181
186 Node* getNode (const int index) const noexcept { return nodes [index]; }
187
192 Node* getNodeForId (const uint32 nodeId) const;
193
205 Node* addNode (AudioProcessor* newProcessor, uint32 nodeId = 0);
206
211 bool removeNode (uint32 nodeId);
212
217 bool removeNode (Node* node);
218
219 //==============================================================================
221 size_t getNumConnections() const { return connections.size(); }
222
224 const Connection* getConnection (size_t index) const { return connections [index]; }
225
229 const Connection* getConnectionBetween (ChannelType channelType,
230 uint32 sourceNodeId,
231 uint sourceChannelIndex,
232 uint32 destNodeId,
233 uint destChannelIndex) const;
234
238 bool isConnected (uint32 possibleSourceNodeId,
239 uint32 possibleDestNodeId) const;
240
242 bool canConnect (ChannelType channelType,
243 uint32 sourceNodeId, uint sourceChannelIndex,
244 uint32 destNodeId, uint destChannelIndex) const;
245
251 bool addConnection (ChannelType channelType,
252 uint32 sourceNodeId, uint sourceChannelIndex,
253 uint32 destNodeId, uint destChannelIndex);
254
256 void removeConnection (int index);
257
261 bool removeConnection (ChannelType channelType,
262 uint32 sourceNodeId, uint sourceChannelIndex,
263 uint32 destNodeId, uint destChannelIndex);
264
266 bool disconnectNode (uint32 nodeId);
267
273 bool isConnectionLegal (const Connection* connection) const;
274
281
282 //==============================================================================
288 static const uint midiChannelIndex;
289
290
291 //==============================================================================
306 {
307 public:
326
327 //==============================================================================
330
334
336 bool isInput() const noexcept;
338 bool isOutput() const noexcept;
339
340 //==============================================================================
343
345 void prepareToPlay (double newSampleRate, int estimatedSamplesPerBlock) override;
347 void processBlockWithCV (AudioSampleBuffer& audioBuffer,
348 const AudioSampleBuffer& cvInBuffer,
349 AudioSampleBuffer& cvOutBuffer,
350 MidiBuffer& midiMessages) override;
351
354
357
358 private:
361
362 //==============================================================================
363 //void processAudio (AudioSampleBuffer& buffer, MidiBuffer& midiMessages);
364 void processAudioAndCV (AudioSampleBuffer& audioBuffer,
365 const AudioSampleBuffer& cvInBuffer,
366 AudioSampleBuffer& cvOutBuffer,
367 MidiBuffer& midiMessages);
368
370 };
371
372 //==============================================================================
374 void prepareToPlay (double, int) override;
376 //void processBlock (AudioSampleBuffer&, MidiBuffer&) override;
377 void processBlockWithCV (AudioSampleBuffer& audioBuffer,
378 const AudioSampleBuffer& cvInBuffer,
379 AudioSampleBuffer& cvOutBuffer,
380 MidiBuffer& midiMessages) override;
381
382 void reset() override;
383 void setNonRealtime (bool) noexcept override;
384
387
388 void reorderNowIfNeeded();
389 const CarlaRecursiveMutex& getReorderMutex() const;
390
391private:
392 //==============================================================================
393 // void processAudio (AudioSampleBuffer& audioBuffer, MidiBuffer& midiMessages);
394 void processAudioAndCV (AudioSampleBuffer& audioBuffer,
395 const AudioSampleBuffer& cvInBuffer,
396 AudioSampleBuffer& cvOutBuffer,
397 MidiBuffer& midiMessages);
398
399 //==============================================================================
405
409
412
414 CarlaRecursiveMutex reorderMutex;
415
416public:
419 bool isAnInputTo (uint32 possibleInputId, uint32 possibleDestinationId, int recursionCheck) const;
420
422};
423
424}
425
426#endif // WATER_AUDIOPROCESSORGRAPH_H_INCLUDED
unsigned int uint
Definition CarlaDefines.h:327
#define CARLA_DECLARE_NON_COPYABLE(ClassName)
Definition CarlaDefines.h:242
#define noexcept
Definition DistrhoDefines.h:72
#define override
Definition DistrhoDefines.h:73
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
Definition Array.h:57
Definition AudioProcessorGraph.h:306
AudioProcessorGraph * getParentGraph() const noexcept
Definition AudioProcessorGraph.h:333
bool isInput() const noexcept
Definition AudioProcessorGraph.cpp:1832
bool acceptsMidi() const override
Definition AudioProcessorGraph.cpp:1822
IODeviceType
Definition AudioProcessorGraph.h:311
@ audioInputNode
Definition AudioProcessorGraph.h:312
@ cvOutputNode
Definition AudioProcessorGraph.h:324
@ midiInputNode
Definition AudioProcessorGraph.h:318
@ midiOutputNode
Definition AudioProcessorGraph.h:321
@ cvInputNode
Definition AudioProcessorGraph.h:324
@ audioOutputNode
Definition AudioProcessorGraph.h:315
bool producesMidi() const override
Definition AudioProcessorGraph.cpp:1827
void prepareToPlay(double newSampleRate, int estimatedSamplesPerBlock) override
Definition AudioProcessorGraph.cpp:1727
void setParentGraph(AudioProcessorGraph *)
Definition AudioProcessorGraph.cpp:1842
AudioGraphIOProcessor(const IODeviceType type)
Definition AudioProcessorGraph.cpp:1702
IODeviceType getType() const noexcept
Definition AudioProcessorGraph.h:329
void releaseResources() override
Definition AudioProcessorGraph.cpp:1732
const IODeviceType type
Definition AudioProcessorGraph.h:359
const String getName() const override
Definition AudioProcessorGraph.cpp:1711
bool isOutput() const noexcept
Definition AudioProcessorGraph.cpp:1837
AudioProcessorGraph * graph
Definition AudioProcessorGraph.h:360
void processBlockWithCV(AudioSampleBuffer &audioBuffer, const AudioSampleBuffer &cvInBuffer, AudioSampleBuffer &cvOutBuffer, MidiBuffer &midiMessages) override
Definition AudioProcessorGraph.cpp:1814
void processAudioAndCV(AudioSampleBuffer &audioBuffer, const AudioSampleBuffer &cvInBuffer, AudioSampleBuffer &cvOutBuffer, MidiBuffer &midiMessages)
Definition AudioProcessorGraph.cpp:1736
Definition AudioProcessorGraph.h:63
ReferenceCountedObjectPtr< Node > Ptr
Definition AudioProcessorGraph.h:109
Node(uint32 nodeId, AudioProcessor *) noexcept
Definition AudioProcessorGraph.cpp:1105
struct water::AudioProcessorGraph::Node::Properties properties
void setParentGraph(AudioProcessorGraph *) const
Definition AudioProcessorGraph.cpp:1133
AudioProcessor * getProcessor() const noexcept
Definition AudioProcessorGraph.h:72
const CarlaScopedPointer< AudioProcessor > processor
Definition AudioProcessorGraph.h:115
bool isPrepared
Definition AudioProcessorGraph.h:116
void unprepare()
Definition AudioProcessorGraph.cpp:1124
const uint32 nodeId
Definition AudioProcessorGraph.h:69
friend class AudioProcessorGraph
Definition AudioProcessorGraph.h:113
void prepare(double newSampleRate, int newBlockSize, AudioProcessorGraph *)
Definition AudioProcessorGraph.cpp:1111
AudioProcessorGraph()
Definition AudioProcessorGraph.cpp:1184
const Connection * getConnectionBetween(ChannelType channelType, uint32 sourceNodeId, uint sourceChannelIndex, uint32 destNodeId, uint destChannelIndex) const
Definition AudioProcessorGraph.cpp:1279
OwnedArray< Connection > connections
Definition AudioProcessorGraph.h:401
ReferenceCountedArray< Node > nodes
Definition AudioProcessorGraph.h:400
Array< void * > renderingOps
Definition AudioProcessorGraph.h:404
MidiBuffer * currentMidiInputBuffer
Definition AudioProcessorGraph.h:410
void reorderNowIfNeeded()
Definition AudioProcessorGraph.cpp:1687
bool canConnect(ChannelType channelType, uint32 sourceNodeId, uint sourceChannelIndex, uint32 destNodeId, uint destChannelIndex) const
Definition AudioProcessorGraph.cpp:1307
static const uint midiChannelIndex
Definition AudioProcessorGraph.h:288
const CarlaRecursiveMutex & getReorderMutex() const
Definition AudioProcessorGraph.cpp:1696
bool addConnection(ChannelType channelType, uint32 sourceNodeId, uint sourceChannelIndex, uint32 destNodeId, uint destChannelIndex)
Definition AudioProcessorGraph.cpp:1335
bool removeNode(uint32 nodeId)
Definition AudioProcessorGraph.cpp:1251
void buildRenderingSequence()
Definition AudioProcessorGraph.cpp:1475
~AudioProcessorGraph()
Definition AudioProcessorGraph.cpp:1190
MidiBuffer currentMidiOutputBuffer
Definition AudioProcessorGraph.h:411
void prepareToPlay(double, int) override
Definition AudioProcessorGraph.cpp:1534
const Connection * getConnection(size_t index) const
Definition AudioProcessorGraph.h:224
Node * getNodeForId(const uint32 nodeId) const
Definition AudioProcessorGraph.cpp:1209
Node * getNode(const int index) const noexcept
Definition AudioProcessorGraph.h:186
size_t getNumConnections() const
Definition AudioProcessorGraph.h:221
uint32 lastNodeId
Definition AudioProcessorGraph.h:402
bool needsReorder
Definition AudioProcessorGraph.h:413
const String getName() const override
Definition AudioProcessorGraph.cpp:1196
OwnedArray< MidiBuffer > midiBuffers
Definition AudioProcessorGraph.h:403
void removeConnection(int index)
Definition AudioProcessorGraph.cpp:1355
bool isConnected(uint32 possibleSourceNodeId, uint32 possibleDestNodeId) const
Definition AudioProcessorGraph.cpp:1290
CarlaScopedPointer< AudioProcessorGraphBufferHelpers > audioAndCVBuffers
Definition AudioProcessorGraph.h:408
bool producesMidi() const override
Definition AudioProcessorGraph.cpp:1670
bool acceptsMidi() const override
Definition AudioProcessorGraph.cpp:1669
bool isPrepared
Definition AudioProcessorGraph.h:413
CarlaRecursiveMutex reorderMutex
Definition AudioProcessorGraph.h:414
Node * addNode(AudioProcessor *newProcessor, uint32 nodeId=0)
Definition AudioProcessorGraph.cpp:1218
bool removeIllegalConnections()
Definition AudioProcessorGraph.cpp:1420
bool isAnInputTo(uint32 possibleInputId, uint32 possibleDestinationId, int recursionCheck) const
Definition AudioProcessorGraph.cpp:1455
void clear()
Definition AudioProcessorGraph.cpp:1202
bool disconnectNode(uint32 nodeId)
Definition AudioProcessorGraph.cpp:1387
void releaseResources() override
Definition AudioProcessorGraph.cpp:1551
bool isConnectionLegal(const Connection *connection) const
Definition AudioProcessorGraph.cpp:1405
void clearRenderingSequence()
Definition AudioProcessorGraph.cpp:1443
void processBlockWithCV(AudioSampleBuffer &audioBuffer, const AudioSampleBuffer &cvInBuffer, AudioSampleBuffer &cvOutBuffer, MidiBuffer &midiMessages) override
Definition AudioProcessorGraph.cpp:1679
int getNumNodes() const noexcept
Definition AudioProcessorGraph.h:180
Definition AudioProcessor.h:46
virtual void setNonRealtime(bool isNonRealtime) noexcept
Definition AudioProcessor.cpp:72
AudioProcessor()
Definition AudioProcessor.cpp:25
ChannelType
Definition AudioProcessor.h:58
virtual void reset()
Definition AudioProcessor.cpp:89
Definition AudioSampleBuffer.h:42
Definition MidiBuffer.h:48
Definition OwnedArray.h:57
Definition ReferenceCountedArray.h:56
ReferenceCountedObject()
Definition ReferenceCountedObject.h:107
Definition ReferenceCountedObject.h:227
Definition String.h:48
unsigned int uint32_t
Definition mid.cpp:100
Definition AudioSampleBuffer.h:33
unsigned int uint32
Definition water.h:98
#define false
Definition ordinals.h:83
Definition AudioProcessorGraph.h:133
uint sourceChannelIndex
Definition AudioProcessorGraph.h:156
ChannelType channelType
Definition AudioProcessorGraph.h:142
Connection(ChannelType channelType, uint32 sourceNodeId, uint sourceChannelIndex, uint32 destNodeId, uint destChannelIndex) noexcept
Definition AudioProcessorGraph.cpp:1095
uint destChannelIndex
Definition AudioProcessorGraph.h:170
uint32 destNodeId
Definition AudioProcessorGraph.h:161
uint32 sourceNodeId
Definition AudioProcessorGraph.h:147
int y1
Definition AudioProcessorGraph.h:85
Position() noexcept
Definition AudioProcessorGraph.h:88
bool valid
Definition AudioProcessorGraph.h:86
int y2
Definition AudioProcessorGraph.h:85
int x2
Definition AudioProcessorGraph.h:85
int x1
Definition AudioProcessorGraph.h:85
bool isMIDI
Definition AudioProcessorGraph.h:78
bool isOSC
Definition AudioProcessorGraph.h:79
bool isAudio
Definition AudioProcessorGraph.h:76
Properties() noexcept
Definition AudioProcessorGraph.h:96
bool isCV
Definition AudioProcessorGraph.h:77
uint32_t pluginId
Definition AudioProcessorGraph.h:82
bool isPlugin
Definition AudioProcessorGraph.h:81
bool isOutput
Definition AudioProcessorGraph.h:80
struct water::AudioProcessorGraph::Node::Properties::Position position
#define const
Definition zconf.h:137