Browse Source

Stop using NamedValueSet in AudioProcessorGraph

Signed-off-by: falkTX <falktx@falktx.com>
tags/v2.5.1
falkTX 2 years ago
parent
commit
cd0fdbf1e4
2 changed files with 95 additions and 70 deletions
  1. +63
    -62
      source/backend/engine/CarlaEngineGraph.cpp
  2. +32
    -8
      source/modules/water/processors/AudioProcessorGraph.h

+ 63
- 62
source/backend/engine/CarlaEngineGraph.cpp View File

@@ -1,6 +1,6 @@
/* /*
* Carla Plugin Host * Carla Plugin Host
* Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as * modify it under the terms of the GNU General Public License as
@@ -1368,15 +1368,15 @@ void addNodeToPatchbay(const bool sendHost, const bool sendOSC, CarlaEngine* con
proc->getOutputChannelName(AudioProcessor::ChannelTypeMIDI, i).toRawUTF8()); proc->getOutputChannelName(AudioProcessor::ChannelTypeMIDI, i).toRawUTF8());
} }


if (node->properties.contains("x1"))
if (node->properties.position.valid)
{ {
engine->callback(sendHost, sendOSC, engine->callback(sendHost, sendOSC,
ENGINE_CALLBACK_PATCHBAY_CLIENT_POSITION_CHANGED, ENGINE_CALLBACK_PATCHBAY_CLIENT_POSITION_CHANGED,
groupId, groupId,
node->properties.getWithDefault("x1", 0),
node->properties.getWithDefault("y1", 0),
node->properties.getWithDefault("x2", 0),
static_cast<float>(node->properties.getWithDefault("y2", 0)),
node->properties.position.x1,
node->properties.position.y1,
node->properties.position.x2,
static_cast<float>(node->properties.position.y2),
nullptr); nullptr);
} }
} }
@@ -1774,12 +1774,12 @@ PatchbayGraph::PatchbayGraph(CarlaEngine* const engine,
proc->setNames(false, channelNames); proc->setNames(false, channelNames);


AudioProcessorGraph::Node* const node(graph.addNode(proc)); AudioProcessorGraph::Node* const node(graph.addNode(proc));
node->properties.set("isPlugin", false);
node->properties.set("isOutput", false);
node->properties.set("isAudio", true);
node->properties.set("isCV", false);
node->properties.set("isMIDI", false);
node->properties.set("isOSC", false);
node->properties.isPlugin = false;
node->properties.isOutput = false;
node->properties.isAudio = true;
node->properties.isCV = false;
node->properties.isMIDI = false;
node->properties.isOSC = false;
} }


if (numAudioOuts != 0) if (numAudioOuts != 0)
@@ -1789,12 +1789,12 @@ PatchbayGraph::PatchbayGraph(CarlaEngine* const engine,
proc->setNames(true, channelNames); proc->setNames(true, channelNames);


AudioProcessorGraph::Node* const node(graph.addNode(proc)); AudioProcessorGraph::Node* const node(graph.addNode(proc));
node->properties.set("isPlugin", false);
node->properties.set("isOutput", false);
node->properties.set("isAudio", true);
node->properties.set("isCV", false);
node->properties.set("isMIDI", false);
node->properties.set("isOSC", false);
node->properties.isPlugin = false;
node->properties.isOutput = false;
node->properties.isAudio = true;
node->properties.isCV = false;
node->properties.isMIDI = false;
node->properties.isOSC = false;
} }


if (numCVIns != 0) if (numCVIns != 0)
@@ -1804,12 +1804,12 @@ PatchbayGraph::PatchbayGraph(CarlaEngine* const engine,
// proc->setNames(false, channelNames); // proc->setNames(false, channelNames);


AudioProcessorGraph::Node* const node(graph.addNode(proc)); AudioProcessorGraph::Node* const node(graph.addNode(proc));
node->properties.set("isPlugin", false);
node->properties.set("isOutput", false);
node->properties.set("isAudio", false);
node->properties.set("isCV", true);
node->properties.set("isMIDI", false);
node->properties.set("isOSC", false);
node->properties.isPlugin = false;
node->properties.isOutput = false;
node->properties.isAudio = false;
node->properties.isCV = true;
node->properties.isMIDI = false;
node->properties.isOSC = false;
} }


if (numCVOuts != 0) if (numCVOuts != 0)
@@ -1819,36 +1819,36 @@ PatchbayGraph::PatchbayGraph(CarlaEngine* const engine,
// proc->setNames(true, channelNames); // proc->setNames(true, channelNames);


AudioProcessorGraph::Node* const node(graph.addNode(proc)); AudioProcessorGraph::Node* const node(graph.addNode(proc));
node->properties.set("isPlugin", false);
node->properties.set("isOutput", false);
node->properties.set("isAudio", false);
node->properties.set("isCV", true);
node->properties.set("isMIDI", false);
node->properties.set("isOSC", false);
node->properties.isPlugin = false;
node->properties.isOutput = false;
node->properties.isAudio = false;
node->properties.isCV = true;
node->properties.isMIDI = false;
node->properties.isOSC = false;
} }


{ {
NamedAudioGraphIOProcessor* const proc( NamedAudioGraphIOProcessor* const proc(
new NamedAudioGraphIOProcessor(NamedAudioGraphIOProcessor::midiInputNode)); new NamedAudioGraphIOProcessor(NamedAudioGraphIOProcessor::midiInputNode));
AudioProcessorGraph::Node* const node(graph.addNode(proc)); AudioProcessorGraph::Node* const node(graph.addNode(proc));
node->properties.set("isPlugin", false);
node->properties.set("isOutput", false);
node->properties.set("isAudio", false);
node->properties.set("isCV", false);
node->properties.set("isMIDI", true);
node->properties.set("isOSC", false);
node->properties.isPlugin = false;
node->properties.isOutput = false;
node->properties.isAudio = false;
node->properties.isCV = false;
node->properties.isMIDI = true;
node->properties.isOSC = false;
} }


{ {
NamedAudioGraphIOProcessor* const proc( NamedAudioGraphIOProcessor* const proc(
new NamedAudioGraphIOProcessor(NamedAudioGraphIOProcessor::midiOutputNode)); new NamedAudioGraphIOProcessor(NamedAudioGraphIOProcessor::midiOutputNode));
AudioProcessorGraph::Node* const node(graph.addNode(proc)); AudioProcessorGraph::Node* const node(graph.addNode(proc));
node->properties.set("isPlugin", false);
node->properties.set("isOutput", true);
node->properties.set("isAudio", false);
node->properties.set("isCV", false);
node->properties.set("isMIDI", true);
node->properties.set("isOSC", false);
node->properties.isPlugin = false;
node->properties.isOutput = true;
node->properties.isAudio = false;
node->properties.isCV = false;
node->properties.isMIDI = true;
node->properties.isOSC = false;
} }


startRunner(100); startRunner(100);
@@ -1906,8 +1906,8 @@ void PatchbayGraph::addPlugin(const CarlaPluginPtr plugin)


plugin->setPatchbayNodeId(node->nodeId); plugin->setPatchbayNodeId(node->nodeId);


node->properties.set("isPlugin", true);
node->properties.set("pluginId", static_cast<int>(plugin->getId()));
node->properties.isPlugin = true;
node->properties.pluginId = plugin->getId();


addNodeToPatchbay(sendHost, sendOSC, kEngine, node, static_cast<int>(plugin->getId()), instance); addNodeToPatchbay(sendHost, sendOSC, kEngine, node, static_cast<int>(plugin->getId()), instance);
} }
@@ -1938,8 +1938,8 @@ void PatchbayGraph::replacePlugin(const CarlaPluginPtr oldPlugin, const CarlaPlu


newPlugin->setPatchbayNodeId(node->nodeId); newPlugin->setPatchbayNodeId(node->nodeId);


node->properties.set("isPlugin", true);
node->properties.set("pluginId", static_cast<int>(newPlugin->getId()));
node->properties.isPlugin = true;
node->properties.pluginId = newPlugin->getId();


addNodeToPatchbay(sendHost, sendOSC, kEngine, node, static_cast<int>(newPlugin->getId()), instance); addNodeToPatchbay(sendHost, sendOSC, kEngine, node, static_cast<int>(newPlugin->getId()), instance);
} }
@@ -1975,8 +1975,8 @@ void PatchbayGraph::switchPlugins(CarlaPluginPtr pluginA, CarlaPluginPtr pluginB
AudioProcessorGraph::Node* const nodeB(graph.getNodeForId(pluginB->getPatchbayNodeId())); AudioProcessorGraph::Node* const nodeB(graph.getNodeForId(pluginB->getPatchbayNodeId()));
CARLA_SAFE_ASSERT_RETURN(nodeB != nullptr,); CARLA_SAFE_ASSERT_RETURN(nodeB != nullptr,);


nodeA->properties.set("pluginId", static_cast<int>(pluginB->getId()));
nodeB->properties.set("pluginId", static_cast<int>(pluginA->getId()));
nodeA->properties.pluginId = pluginB->getId();
nodeB->properties.pluginId = pluginA->getId();
} }


void PatchbayGraph::reconfigureForCV(const CarlaPluginPtr plugin, const uint portIndex, bool added) void PatchbayGraph::reconfigureForCV(const CarlaPluginPtr plugin, const uint portIndex, bool added)
@@ -2057,8 +2057,8 @@ void PatchbayGraph::removePlugin(const CarlaPluginPtr plugin)


if (AudioProcessorGraph::Node* const node2 = graph.getNodeForId(plugin2->getPatchbayNodeId())) if (AudioProcessorGraph::Node* const node2 = graph.getNodeForId(plugin2->getPatchbayNodeId()))
{ {
CARLA_SAFE_ASSERT_CONTINUE(node2->properties.getWithDefault("pluginId", -1) != water::var(-1));
node2->properties.set("pluginId", static_cast<int>(i-1));
CARLA_SAFE_ASSERT_CONTINUE(node2->properties.isPlugin);
node2->properties.pluginId = i - 1;
} }
} }


@@ -2220,10 +2220,11 @@ void PatchbayGraph::setGroupPos(const bool sendHost, const bool sendOSC, const b
AudioProcessorGraph::Node* const node(graph.getNodeForId(groupId)); AudioProcessorGraph::Node* const node(graph.getNodeForId(groupId));
CARLA_SAFE_ASSERT_RETURN(node != nullptr,); CARLA_SAFE_ASSERT_RETURN(node != nullptr,);


node->properties.set("x1", x1);
node->properties.set("y1", y1);
node->properties.set("x2", x2);
node->properties.set("y2", y2);
node->properties.position.x1 = x1;
node->properties.position.y1 = y1;
node->properties.position.x2 = x2;
node->properties.position.y2 = y2;
node->properties.position.valid = true;


kEngine->callback(sendHost, sendOSC, kEngine->callback(sendHost, sendOSC,
ENGINE_CALLBACK_PATCHBAY_CLIENT_POSITION_CHANGED, ENGINE_CALLBACK_PATCHBAY_CLIENT_POSITION_CHANGED,
@@ -2252,8 +2253,8 @@ void PatchbayGraph::refresh(const bool sendHost, const bool sendOSC, const bool
int pluginId = -1; int pluginId = -1;


// plugin node // plugin node
if (node->properties.getWithDefault("isPlugin", false) == water::var(true))
pluginId = node->properties.getWithDefault("pluginId", -1);
if (node->properties.isPlugin)
pluginId = static_cast<int>(node->properties.pluginId);


addNodeToPatchbay(sendHost, sendOSC, kEngine, node, pluginId, proc); addNodeToPatchbay(sendHost, sendOSC, kEngine, node, pluginId, proc);
} }
@@ -2416,7 +2417,7 @@ const CarlaEngine::PatchbayPosition* PatchbayGraph::getPositions(bool external,
AudioProcessorGraph::Node* const node(graph.getNode(i)); AudioProcessorGraph::Node* const node(graph.getNode(i));
CARLA_SAFE_ASSERT_CONTINUE(node != nullptr); CARLA_SAFE_ASSERT_CONTINUE(node != nullptr);


if (! node->properties.contains("x1"))
if (! node->properties.position.valid)
continue; continue;


AudioProcessor* const proc(node->getProcessor()); AudioProcessor* const proc(node->getProcessor());
@@ -2426,12 +2427,12 @@ const CarlaEngine::PatchbayPosition* PatchbayGraph::getPositions(bool external,


ppos.name = carla_strdup(proc->getName().toRawUTF8()); ppos.name = carla_strdup(proc->getName().toRawUTF8());
ppos.dealloc = true; ppos.dealloc = true;
ppos.pluginId = node->properties.getWithDefault("pluginId", -1);
ppos.pluginId = node->properties.isPlugin ? static_cast<int>(node->properties.pluginId) : -1;


ppos.x1 = node->properties.getWithDefault("x1", 0);
ppos.y1 = node->properties.getWithDefault("y1", 0);
ppos.x2 = node->properties.getWithDefault("x2", 0);
ppos.y2 = node->properties.getWithDefault("y2", 0);
ppos.x1 = node->properties.position.x1;
ppos.y1 = node->properties.position.y1;
ppos.x2 = node->properties.position.x2;
ppos.y2 = node->properties.position.y2;
} }


return ret; return ret;


+ 32
- 8
source/modules/water/processors/AudioProcessorGraph.h View File

@@ -22,7 +22,6 @@
#define WATER_AUDIOPROCESSORGRAPH_H_INCLUDED #define WATER_AUDIOPROCESSORGRAPH_H_INCLUDED
#include "AudioProcessor.h" #include "AudioProcessor.h"
#include "../containers/NamedValueSet.h"
#include "../containers/OwnedArray.h" #include "../containers/OwnedArray.h"
#include "../containers/ReferenceCountedArray.h" #include "../containers/ReferenceCountedArray.h"
#include "../midi/MidiBuffer.h" #include "../midi/MidiBuffer.h"
@@ -72,13 +71,38 @@ public:
/** The actual processor object that this node represents. */ /** The actual processor object that this node represents. */
AudioProcessor* getProcessor() const noexcept { return processor; } AudioProcessor* getProcessor() const noexcept { return processor; }
/** A set of user-definable properties that are associated with this node.
This can be used to attach values to the node for whatever purpose seems
useful. For example, you might store an x and y position if your application
is displaying the nodes on-screen.
*/
NamedValueSet properties;
/** Custom properties for Carla usage. */
struct Properties {
bool isAudio;
bool isCV;
bool isMIDI;
bool isOSC;
bool isOutput;
bool isPlugin;
uint32_t pluginId;
struct Position {
int x1, x2, y1, y2;
bool valid;
Position() noexcept
: x1(0),
x2(0),
y1(0),
y2(0),
valid(false) {}
} position;
Properties() noexcept
: isAudio(false),
isCV(false),
isMIDI(false),
isOSC(false),
isOutput(false),
isPlugin(false),
pluginId(0),
position() {}
} properties;
//============================================================================== //==============================================================================
/** A convenient typedef for referring to a pointer to a node object. */ /** A convenient typedef for referring to a pointer to a node object. */


Loading…
Cancel
Save