@@ -80,17 +80,17 @@ void DrawSpectrum(std::shared_ptr<lab::AudioNode> audio_node, ImVec2 ul_ws, ImVe
80
80
81
81
void LabSoundProvider::create_noodle_data_for_node (
82
82
std::shared_ptr<lab::AudioNode> audio_node,
83
- lab::noodle::NoodleNode& node)
83
+ lab::noodle::NoodleNode * const node)
84
84
{
85
- if (!audio_node)
85
+ if (!audio_node || !node )
86
86
return ;
87
87
88
88
// 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 );
90
90
if (reverse_it == g_node_reverse_lookups.end ())
91
91
{
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 );
94
94
}
95
95
auto & reverse = reverse_it->second ;
96
96
@@ -100,7 +100,7 @@ void LabSoundProvider::create_noodle_data_for_node(
100
100
if (nullptr != dynamic_cast <lab::AnalyserNode*>(audio_node.get ()))
101
101
{
102
102
g_audio_context->addAutomaticPullNode (audio_node);
103
- node. render =
103
+ node-> render =
104
104
lab::noodle::NodeRender{
105
105
[audio_node](ln_Node id, lab::noodle::vec2 ul_ws, lab::noodle::vec2 lr_ws, float scale, void * drawList) {
106
106
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(
114
114
for (int i = 0 ; i < c; ++i)
115
115
{
116
116
ln_Pin pin_id = { create_entity (), true };
117
- node. pins .push_back (pin_id);
117
+ node-> pins .push_back (pin_id);
118
118
// currently input names are not part of the LabSound API
119
119
std::string name = " " ; // audio_node->input(i)->name();
120
120
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{
122
122
lab::noodle::NoodlePin::Kind::BusIn,
123
123
lab::noodle::NoodlePin::DataType::Bus,
124
124
name,
125
125
" " ,
126
- pin_id, node. id ,
127
- };
126
+ pin_id, node-> id ,
127
+ }) ;
128
128
129
- _audioPins[pin_id] = LabSoundPinData{ 0 };
129
+ _audioPins[pin_id] = LabSoundPinData{ 0 , node-> id };
130
130
}
131
131
132
132
// ---------- outputs
@@ -135,18 +135,18 @@ void LabSoundProvider::create_noodle_data_for_node(
135
135
for (int i = 0 ; i < c; ++i)
136
136
{
137
137
ln_Pin pin_id = { create_entity (), true };
138
- node. pins .push_back (pin_id);
138
+ node-> pins .push_back (pin_id);
139
139
std::string name = audio_node->output (i)->name ();
140
140
reverse.output_pin_map [name] = ln_Pin{ pin_id };
141
- _noodlePins[ pin_id] = lab::noodle::NoodlePin{
141
+ add_pin ( pin_id, lab::noodle::NoodlePin{
142
142
lab::noodle::NoodlePin::Kind::BusOut,
143
143
lab::noodle::NoodlePin::DataType::Bus,
144
144
name,
145
145
" " ,
146
- pin_id, node. id ,
147
- };
146
+ pin_id, node-> id ,
147
+ }) ;
148
148
149
- _audioPins[pin_id] = LabSoundPinData{ 0 };
149
+ _audioPins[pin_id] = LabSoundPinData{ 0 , node-> id };
150
150
}
151
151
152
152
// ---------- settings
@@ -190,17 +190,17 @@ void LabSoundProvider::create_noodle_data_for_node(
190
190
}
191
191
192
192
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{
196
196
lab::noodle::NoodlePin::Kind::Setting,
197
197
dataType,
198
198
names[i],
199
199
shortNames[i],
200
- pin_id, node. id ,
200
+ pin_id, node-> id ,
201
201
std::string{ buff },
202
202
enums
203
- };
203
+ }) ;
204
204
}
205
205
206
206
// ---------- params
@@ -215,20 +215,20 @@ void LabSoundProvider::create_noodle_data_for_node(
215
215
sprintf (buff, " %f" , params[i]->value ());
216
216
ln_Pin pin_id { create_entity (), true };
217
217
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 ,
220
220
shared_ptr<lab::AudioSetting>(),
221
221
params[i],
222
222
};
223
223
224
- _noodlePins[ pin_id] = lab::noodle::NoodlePin{
224
+ add_pin ( pin_id, lab::noodle::NoodlePin{
225
225
lab::noodle::NoodlePin::Kind::Param,
226
226
lab::noodle::NoodlePin::DataType::Float,
227
227
names[i],
228
228
shortNames[i],
229
- pin_id, node. id ,
229
+ pin_id, node-> id ,
230
230
buff
231
- };
231
+ }) ;
232
232
}
233
233
}
234
234
@@ -263,18 +263,16 @@ void LabSoundProvider::pin_set_bus_from_file(ln_Pin pin_id, const std::string& p
263
263
if (!pin_id.valid || !path.length ())
264
264
return ;
265
265
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 )
268
268
return ;
269
269
270
- lab::noodle::NoodlePin& pin = pin_it->second ;
271
-
272
270
auto a_pin_it = _audioPins.find (pin_id);
273
271
if (a_pin_it == _audioPins.end ())
274
272
return ;
275
273
276
274
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 )
278
276
{
279
277
auto soundClip = lab::MakeBusFromFile (path.c_str (), false );
280
278
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
314
312
if (param_pin_it == _audioPins.end ())
315
313
return ;
316
314
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 ;
326
315
327
316
auto out_it = _audioNodes.find (output_node_id);
328
317
if (out_it == _audioNodes.end ())
@@ -342,6 +331,7 @@ void LabSoundProvider::connect_bus_out_to_param_in(ln_Node output_node_id, ln_Pi
342
331
}
343
332
}
344
333
334
+ LabSoundPinData& param_pin = param_pin_it->second ;
345
335
g_audio_context->connectParam (param_pin.param , out, output_index);
346
336
printf (" ConnectBusOutToParamIn %lld %lld, index %d\n " , param_pin_id.id , output_node_id.id , output_index);
347
337
}
@@ -376,19 +366,20 @@ void LabSoundProvider::disconnect(ln_Connection connection_id_)
376
366
377
367
LabSoundPinData& a_in_pin = a_pin_it->second ;
378
368
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)
382
375
return ;
383
376
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))
387
378
{
388
379
g_audio_context->disconnect (input_node, output_node, 0 , 0 );
389
380
printf (" DisconnectInFromOut (bus from bus) %lld %lld\n " , input_node_id.id , output_node_id.id );
390
381
}
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))
392
383
{
393
384
g_audio_context->disconnectParam (a_in_pin.param , output_node, 0 );
394
385
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)
408
399
409
400
_audioNodes[id] = LabSoundNodeData{ g_audio_context->device () };
410
401
411
- auto it = _noodleNodes. find (id);
412
- if (it == _noodleNodes. end () ) {
402
+ lab::noodle::NoodleNode * const node = find_node (id);
403
+ if (!node ) {
413
404
printf (" Could not create runtime context\n " );
414
405
return ln_Context_null ();
415
406
}
416
- lab::noodle::NoodleNode& node = it-> second ;
407
+
417
408
create_noodle_data_for_node (g_audio_context->device (), node);
418
409
printf (" CreateRuntimeContext %lld\n " , id.id );
419
410
return ln_Context{id.id };
@@ -605,12 +596,12 @@ ln_Node LabSoundProvider::node_create(const std::string& kind, ln_Node id)
605
596
shared_ptr<lab::AudioNode> n = NodeFactory (kind);
606
597
if (n)
607
598
{
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" );
612
603
_audioNodes[id] = LabSoundNodeData{ n };
613
- create_noodle_data_for_node (n, node-> second );
604
+ create_noodle_data_for_node (n, node);
614
605
printf (" CreateNode [%s] %lld\n " , kind.c_str (), id.id );
615
606
}
616
607
}
@@ -625,41 +616,31 @@ ln_Node LabSoundProvider::node_create(const std::string& kind, ln_Node id)
625
616
// override
626
617
void LabSoundProvider::node_delete (ln_Node node_id)
627
618
{
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 ;
639
621
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 );
642
623
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
+ }
648
631
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;
654
638
}
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
662
639
}
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);
663
644
}
664
645
665
646
// override
@@ -960,24 +941,24 @@ void LabSoundProvider::pin_create_output(const std::string& node_name, const std
960
941
961
942
ln_Pin pin_id{ create_entity (), true };
962
943
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) {
965
946
printf (" Could not find node %s\n " , node_name.c_str ());
966
947
return ;
967
948
}
968
949
969
- node->second . pins .push_back (pin_id);
950
+ node->pins .push_back (pin_id);
970
951
reverse.output_pin_map [output_name] = ln_Pin{ pin_id };
971
952
972
- _noodlePins[ pin_id] = lab::noodle::NoodlePin{
953
+ add_pin ( pin_id, lab::noodle::NoodlePin{
973
954
lab::noodle::NoodlePin::Kind::BusOut,
974
955
lab::noodle::NoodlePin::DataType::Bus,
975
956
output_name,
976
957
" " ,
977
958
pin_id, node_e,
978
- };
959
+ }) ;
979
960
980
- _audioPins[pin_id] = LabSoundPinData{ n->numberOfOutputs () - 1 };
961
+ _audioPins[pin_id] = LabSoundPinData{ n->numberOfOutputs () - 1 , node_e };
981
962
982
963
lab::ContextGraphLock glock (g_audio_context.get (), " AudioHardwareDeviceNode" );
983
964
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
1031
1012
auto it = n->key_to_addrData .find (addr_id);
1032
1013
if (it != n->key_to_addrData .end ())
1033
1014
{
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)
1036
1017
return ;
1037
1018
1038
1019
ln_Pin pin_id{ create_entity (), true };
1039
- node->second . pins .push_back (pin_id);
1020
+ node->pins .push_back (pin_id);
1040
1021
1041
- _noodlePins[ pin_id] = lab::noodle::NoodlePin{
1022
+ add_pin ( pin_id, lab::noodle::NoodlePin{
1042
1023
lab::noodle::NoodlePin::Kind::BusOut,
1043
1024
lab::noodle::NoodlePin::DataType::Bus,
1044
1025
addr,
1045
1026
" " ,
1046
1027
pin_id, _osc_node,
1047
- };
1028
+ }) ;
1048
1029
1049
- _audioPins[pin_id] = LabSoundPinData{ it->second .output_index };
1030
+ _audioPins[pin_id] = LabSoundPinData{ it->second .output_index , _osc_node };
1050
1031
}
1051
1032
}
0 commit comments