Skip to content

Commit 12a3e27

Browse files
committed
Make all the graph management private to the base class
1 parent a521b68 commit 12a3e27

File tree

4 files changed

+135
-123
lines changed

4 files changed

+135
-123
lines changed

src/LabSoundInterface.cpp

Lines changed: 78 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,17 @@ void DrawSpectrum(std::shared_ptr<lab::AudioNode> audio_node, ImVec2 ul_ws, ImVe
8080

8181
void LabSoundProvider::create_noodle_data_for_node(
8282
std::shared_ptr<lab::AudioNode> audio_node,
83-
lab::noodle::NoodleNode& node)
83+
lab::noodle::NoodleNode *const node)
8484
{
85-
if (!audio_node)
85+
if (!audio_node || !node)
8686
return;
8787

8888
// prep the reverse table if necessary
89-
auto reverse_it = g_node_reverse_lookups.find(node.id);
89+
auto reverse_it = g_node_reverse_lookups.find(node->id);
9090
if (reverse_it == g_node_reverse_lookups.end())
9191
{
92-
g_node_reverse_lookups[node.id] = NodeReverseLookup{};
93-
reverse_it = g_node_reverse_lookups.find(node.id);
92+
g_node_reverse_lookups[node->id] = NodeReverseLookup{};
93+
reverse_it = g_node_reverse_lookups.find(node->id);
9494
}
9595
auto& reverse = reverse_it->second;
9696

@@ -100,7 +100,7 @@ void LabSoundProvider::create_noodle_data_for_node(
100100
if (nullptr != dynamic_cast<lab::AnalyserNode*>(audio_node.get()))
101101
{
102102
g_audio_context->addAutomaticPullNode(audio_node);
103-
node.render =
103+
node->render =
104104
lab::noodle::NodeRender{
105105
[audio_node](ln_Node id, lab::noodle::vec2 ul_ws, lab::noodle::vec2 lr_ws, float scale, void* drawList) {
106106
DrawSpectrum(audio_node, {ul_ws.x, ul_ws.y}, {lr_ws.x, lr_ws.y}, scale, reinterpret_cast<ImDrawList*>(drawList));
@@ -114,19 +114,19 @@ void LabSoundProvider::create_noodle_data_for_node(
114114
for (int i = 0; i < c; ++i)
115115
{
116116
ln_Pin pin_id = { create_entity(), true };
117-
node.pins.push_back(pin_id);
117+
node->pins.push_back(pin_id);
118118
// currently input names are not part of the LabSound API
119119
std::string name = ""; //audio_node->input(i)->name();
120120
reverse.input_pin_map[name] = pin_id; // making this line currently meaningless
121-
_noodlePins[pin_id] = lab::noodle::NoodlePin{
121+
add_pin(pin_id, lab::noodle::NoodlePin{
122122
lab::noodle::NoodlePin::Kind::BusIn,
123123
lab::noodle::NoodlePin::DataType::Bus,
124124
name,
125125
"",
126-
pin_id, node.id,
127-
};
126+
pin_id, node->id,
127+
});
128128

129-
_audioPins[pin_id] = LabSoundPinData{ 0 };
129+
_audioPins[pin_id] = LabSoundPinData{ 0, node->id };
130130
}
131131

132132
//---------- outputs
@@ -135,18 +135,18 @@ void LabSoundProvider::create_noodle_data_for_node(
135135
for (int i = 0; i < c; ++i)
136136
{
137137
ln_Pin pin_id = { create_entity(), true };
138-
node.pins.push_back(pin_id);
138+
node->pins.push_back(pin_id);
139139
std::string name = audio_node->output(i)->name();
140140
reverse.output_pin_map[name] = ln_Pin{ pin_id };
141-
_noodlePins[pin_id] = lab::noodle::NoodlePin{
141+
add_pin(pin_id, lab::noodle::NoodlePin{
142142
lab::noodle::NoodlePin::Kind::BusOut,
143143
lab::noodle::NoodlePin::DataType::Bus,
144144
name,
145145
"",
146-
pin_id, node.id,
147-
};
146+
pin_id, node->id,
147+
});
148148

149-
_audioPins[pin_id] = LabSoundPinData{ 0 };
149+
_audioPins[pin_id] = LabSoundPinData{ 0, node->id };
150150
}
151151

152152
//---------- settings
@@ -190,17 +190,17 @@ void LabSoundProvider::create_noodle_data_for_node(
190190
}
191191

192192
ln_Pin pin_id{ create_entity(), true };
193-
node.pins.push_back(pin_id);
194-
_audioPins[pin_id] = LabSoundPinData{ 0, settings[i] };
195-
_noodlePins[pin_id] = lab::noodle::NoodlePin {
193+
node->pins.push_back(pin_id);
194+
_audioPins[pin_id] = LabSoundPinData{ 0, node->id, settings[i] };
195+
add_pin(pin_id, lab::noodle::NoodlePin{
196196
lab::noodle::NoodlePin::Kind::Setting,
197197
dataType,
198198
names[i],
199199
shortNames[i],
200-
pin_id, node.id,
200+
pin_id, node->id,
201201
std::string{ buff },
202202
enums
203-
};
203+
});
204204
}
205205

206206
//---------- params
@@ -215,20 +215,20 @@ void LabSoundProvider::create_noodle_data_for_node(
215215
sprintf(buff, "%f", params[i]->value());
216216
ln_Pin pin_id { create_entity(), true };
217217
reverse.param_pin_map[names[i]] = pin_id;
218-
node.pins.push_back(pin_id);
219-
_audioPins[pin_id] = LabSoundPinData{ 0,
218+
node->pins.push_back(pin_id);
219+
_audioPins[pin_id] = LabSoundPinData{ 0, node->id,
220220
shared_ptr<lab::AudioSetting>(),
221221
params[i],
222222
};
223223

224-
_noodlePins[pin_id] = lab::noodle::NoodlePin{
224+
add_pin(pin_id, lab::noodle::NoodlePin{
225225
lab::noodle::NoodlePin::Kind::Param,
226226
lab::noodle::NoodlePin::DataType::Float,
227227
names[i],
228228
shortNames[i],
229-
pin_id, node.id,
229+
pin_id, node->id,
230230
buff
231-
};
231+
});
232232
}
233233
}
234234

@@ -263,18 +263,16 @@ void LabSoundProvider::pin_set_bus_from_file(ln_Pin pin_id, const std::string& p
263263
if (!pin_id.valid || !path.length())
264264
return;
265265

266-
auto pin_it = _noodlePins.find(pin_id);
267-
if (pin_it == _noodlePins.end())
266+
lab::noodle::NoodlePin const* const pin = find_pin(pin_id);
267+
if (!pin)
268268
return;
269269

270-
lab::noodle::NoodlePin& pin = pin_it->second;
271-
272270
auto a_pin_it = _audioPins.find(pin_id);
273271
if (a_pin_it == _audioPins.end())
274272
return;
275273

276274
LabSoundPinData& a_pin = a_pin_it->second;
277-
if (pin.kind == lab::noodle::NoodlePin::Kind::Setting && a_pin.setting)
275+
if (pin->kind == lab::noodle::NoodlePin::Kind::Setting && a_pin.setting)
278276
{
279277
auto soundClip = lab::MakeBusFromFile(path.c_str(), false);
280278
a_pin.setting->setBus(soundClip.get());
@@ -314,15 +312,6 @@ void LabSoundProvider::connect_bus_out_to_param_in(ln_Node output_node_id, ln_Pi
314312
if (param_pin_it == _audioPins.end())
315313
return;
316314

317-
LabSoundPinData& param_pin = param_pin_it->second;
318-
319-
auto param_noodle_pin_it = _noodlePins.find(param_pin_id);
320-
if (param_noodle_pin_it == _noodlePins.end())
321-
return;
322-
323-
lab::noodle::NoodlePin& param_noodle_pin = param_noodle_pin_it->second;
324-
if (!param_pin.param)
325-
return;
326315

327316
auto out_it = _audioNodes.find(output_node_id);
328317
if (out_it == _audioNodes.end())
@@ -342,6 +331,7 @@ void LabSoundProvider::connect_bus_out_to_param_in(ln_Node output_node_id, ln_Pi
342331
}
343332
}
344333

334+
LabSoundPinData& param_pin = param_pin_it->second;
345335
g_audio_context->connectParam(param_pin.param, out, output_index);
346336
printf("ConnectBusOutToParamIn %lld %lld, index %d\n", param_pin_id.id, output_node_id.id, output_index);
347337
}
@@ -376,19 +366,20 @@ void LabSoundProvider::disconnect(ln_Connection connection_id_)
376366

377367
LabSoundPinData& a_in_pin = a_pin_it->second;
378368

379-
auto in_pin_it = _noodlePins.find(input_pin);
380-
auto out_pin_it = _noodlePins.find(output_pin);
381-
if (in_pin_it == _noodlePins.end() || out_pin_it == _noodlePins.end())
369+
lab::noodle::NoodlePin const* const in_pin = find_pin(input_pin);
370+
if (!in_pin)
371+
return;
372+
373+
lab::noodle::NoodlePin const* const out_pin = find_pin(output_pin);
374+
if (!out_pin)
382375
return;
383376

384-
lab::noodle::NoodlePin& in_pin = in_pin_it->second;
385-
lab::noodle::NoodlePin& out_pin = out_pin_it->second;
386-
if ((in_pin.kind == lab::noodle::NoodlePin::Kind::BusIn) && (out_pin.kind == lab::noodle::NoodlePin::Kind::BusOut))
377+
if ((in_pin->kind == lab::noodle::NoodlePin::Kind::BusIn) && (out_pin->kind == lab::noodle::NoodlePin::Kind::BusOut))
387378
{
388379
g_audio_context->disconnect(input_node, output_node, 0, 0);
389380
printf("DisconnectInFromOut (bus from bus) %lld %lld\n", input_node_id.id, output_node_id.id);
390381
}
391-
else if ((in_pin.kind == lab::noodle::NoodlePin::Kind::Param) && (out_pin.kind == lab::noodle::NoodlePin::Kind::BusOut))
382+
else if ((in_pin->kind == lab::noodle::NoodlePin::Kind::Param) && (out_pin->kind == lab::noodle::NoodlePin::Kind::BusOut))
392383
{
393384
g_audio_context->disconnectParam(a_in_pin.param, output_node, 0);
394385
printf("DisconnectInFromOut (param from bus) %lld %lld\n", input_node_id.id, output_node_id.id);
@@ -408,12 +399,12 @@ ln_Context LabSoundProvider::create_runtime_context(ln_Node id)
408399

409400
_audioNodes[id] = LabSoundNodeData{ g_audio_context->device() };
410401

411-
auto it = _noodleNodes.find(id);
412-
if (it == _noodleNodes.end()) {
402+
lab::noodle::NoodleNode * const node = find_node(id);
403+
if (!node) {
413404
printf("Could not create runtime context\n");
414405
return ln_Context_null();
415406
}
416-
lab::noodle::NoodleNode& node = it->second;
407+
417408
create_noodle_data_for_node(g_audio_context->device(), node);
418409
printf("CreateRuntimeContext %lld\n", id.id);
419410
return ln_Context{id.id};
@@ -605,12 +596,12 @@ ln_Node LabSoundProvider::node_create(const std::string& kind, ln_Node id)
605596
shared_ptr<lab::AudioNode> n = NodeFactory(kind);
606597
if (n)
607598
{
608-
auto node = _noodleNodes.find(id);
609-
if (node != _noodleNodes.end()) {
610-
node->second.play_controller = n->isScheduledNode();
611-
node->second.bang_controller = !!n->param("gate");
599+
lab::noodle::NoodleNode * const node = find_node(id);
600+
if (node) {
601+
node->play_controller = n->isScheduledNode();
602+
node->bang_controller = !!n->param("gate");
612603
_audioNodes[id] = LabSoundNodeData{ n };
613-
create_noodle_data_for_node(n, node->second);
604+
create_noodle_data_for_node(n, node);
614605
printf("CreateNode [%s] %lld\n", kind.c_str(), id.id);
615606
}
616607
}
@@ -625,41 +616,31 @@ ln_Node LabSoundProvider::node_create(const std::string& kind, ln_Node id)
625616
// override
626617
void LabSoundProvider::node_delete(ln_Node node_id)
627618
{
628-
if (node_id.id != ln_Node_null().id)
629-
{
630-
printf("DeleteNode %lld\n", node_id.id);
631-
632-
// force full disconnection
633-
auto it = _audioNodes.find(node_id);
634-
if (it != _audioNodes.end())
635-
{
636-
shared_ptr<lab::AudioNode> in_node = it->second.node;
637-
g_audio_context->disconnect(in_node);
638-
}
619+
if (node_id.id == ln_Node_null().id)
620+
return;
639621

640-
/// @TODO this bit should be managed in lab_noodle
641-
// delete all the node's pins
622+
printf("DeleteNode %lld\n", node_id.id);
642623

643-
for (auto i = _noodlePins.begin(), last = _noodlePins.end(); i != last; ) {
644-
if (i->second.node_id.id == node_id.id) {
645-
auto j = _audioPins.find(i->second.pin_id);
646-
if (j != _audioPins.end())
647-
_audioPins.erase(j);
624+
// force full disconnection
625+
auto it = _audioNodes.find(node_id);
626+
if (it != _audioNodes.end())
627+
{
628+
shared_ptr<lab::AudioNode> in_node = it->second.node;
629+
g_audio_context->disconnect(in_node);
630+
}
648631

649-
i = _noodlePins.erase(i);
650-
}
651-
else {
652-
++i;
653-
}
632+
for (auto i = _audioPins.begin(), last = _audioPins.end(); i != last; ) {
633+
if (i->second.node_id.id == node_id.id) {
634+
i = _audioPins.erase(i);
635+
}
636+
else {
637+
++i;
654638
}
655-
/// @TODO end plumbing
656-
657-
auto reverse_it = g_node_reverse_lookups.find(node_id);
658-
if (reverse_it != g_node_reverse_lookups.end())
659-
g_node_reverse_lookups.erase(reverse_it);
660-
661-
// note: node_id is to be deleted externally, as it was created externally
662639
}
640+
641+
auto reverse_it = g_node_reverse_lookups.find(node_id);
642+
if (reverse_it != g_node_reverse_lookups.end())
643+
g_node_reverse_lookups.erase(reverse_it);
663644
}
664645

665646
// override
@@ -960,24 +941,24 @@ void LabSoundProvider::pin_create_output(const std::string& node_name, const std
960941

961942
ln_Pin pin_id{ create_entity(), true };
962943

963-
auto node = _noodleNodes.find(node_e);
964-
if (node == _noodleNodes.end()) {
944+
lab::noodle::NoodleNode * const node = find_node(node_e);
945+
if (!node) {
965946
printf("Could not find node %s\n", node_name.c_str());
966947
return;
967948
}
968949

969-
node->second.pins.push_back(pin_id);
950+
node->pins.push_back(pin_id);
970951
reverse.output_pin_map[output_name] = ln_Pin{ pin_id };
971952

972-
_noodlePins[pin_id] = lab::noodle::NoodlePin{
953+
add_pin(pin_id, lab::noodle::NoodlePin{
973954
lab::noodle::NoodlePin::Kind::BusOut,
974955
lab::noodle::NoodlePin::DataType::Bus,
975956
output_name,
976957
"",
977958
pin_id, node_e,
978-
};
959+
});
979960

980-
_audioPins[pin_id] = LabSoundPinData{ n->numberOfOutputs() - 1 };
961+
_audioPins[pin_id] = LabSoundPinData{ n->numberOfOutputs() - 1, node_e };
981962

982963
lab::ContextGraphLock glock(g_audio_context.get(), "AudioHardwareDeviceNode");
983964
n->addOutput(glock, std::unique_ptr<lab::AudioNodeOutput>(new lab::AudioNodeOutput(n.get(), output_name.c_str(), channels)));
@@ -1031,21 +1012,21 @@ void LabSoundProvider::add_osc_addr(char const* const addr, int addr_id, int cha
10311012
auto it = n->key_to_addrData.find(addr_id);
10321013
if (it != n->key_to_addrData.end())
10331014
{
1034-
auto node = _noodleNodes.find(_osc_node);
1035-
if (node == _noodleNodes.end())
1015+
lab::noodle::NoodleNode * const node = find_node(_osc_node);
1016+
if (!node)
10361017
return;
10371018

10381019
ln_Pin pin_id{ create_entity(), true };
1039-
node->second.pins.push_back(pin_id);
1020+
node->pins.push_back(pin_id);
10401021

1041-
_noodlePins[pin_id] = lab::noodle::NoodlePin{
1022+
add_pin(pin_id, lab::noodle::NoodlePin{
10421023
lab::noodle::NoodlePin::Kind::BusOut,
10431024
lab::noodle::NoodlePin::DataType::Bus,
10441025
addr,
10451026
"",
10461027
pin_id, _osc_node,
1047-
};
1028+
});
10481029

1049-
_audioPins[pin_id] = LabSoundPinData{ it->second.output_index };
1030+
_audioPins[pin_id] = LabSoundPinData{ it->second.output_index, _osc_node };
10501031
}
10511032
}

src/LabSoundInterface.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ namespace lab { class AudioNode; class AudioParam; class AudioSetting; }
2323
struct LabSoundPinData
2424
{
2525
int output_index = 0;
26+
ln_Node node_id;
2627
std::shared_ptr<lab::AudioSetting> setting;
2728
std::shared_ptr<lab::AudioParam> param;
2829
};
@@ -86,7 +87,7 @@ class LabSoundProvider final : public lab::noodle::Provider
8687
void add_osc_addr(char const* const addr, int addr_id, int channels, float* data);
8788

8889
private:
89-
void create_noodle_data_for_node(std::shared_ptr<lab::AudioNode> audio_node, lab::noodle::NoodleNode& node);
90+
void create_noodle_data_for_node(std::shared_ptr<lab::AudioNode> audio_node, lab::noodle::NoodleNode *const node);
9091

9192

9293
ln_Node _osc_node = ln_Node_null();

0 commit comments

Comments
 (0)