32 for (
size_t i=0; i<inputs.size(); ++i)
33 while (inputs[i].links.size())
34 disconnect(inputs[i].links.front().block,inputs[i].links.front().channel,
this,i);
35 for (
size_t i=0; i<outputs.size(); ++i)
36 while (outputs[i].links.size())
37 disconnect(
this,i,outputs[i].links.front().block,outputs[i].links.front().channel);
39 int num_inputs = 0, num_outputs = 0;
40 for (
size_t i = 0; i < size; ++i)
41 if (channel[i].flags & INPUT)
43 else if (channel[i].flags & OUTPUT)
46 inputs = std::vector<struct input_t>(num_inputs);
47 outputs = std::vector<struct output_t>(num_outputs);
49 size_t in = 0, out = 0;
50 for (
size_t i = 0; i < size; ++i)
51 if (channel[i].flags & INPUT)
53 inputs[in].name = channel[i].
name;
56 else if (channel[i].flags & OUTPUT)
58 outputs[out].name = channel[i].
name;
60 outputs[out++].value = 0.0;
71 for (
size_t i=0; i<inputs.size(); ++i)
72 while (inputs[i].links.size())
73 disconnect(inputs[i].links.front().block,inputs[i].links.front().channel,
this,i);
74 for (
size_t i=0; i<outputs.size(); ++i)
75 while (outputs[i].links.size())
76 disconnect(
this,i,outputs[i].links.front().block,outputs[i].links.front().channel);
78 inputs = std::vector<struct input_t>();
79 outputs = std::vector<struct output_t>();
87 return outputs.size();
93 if (type & INPUT && n < inputs.size())
94 return inputs[n].name;
95 if (type & OUTPUT && n < outputs.size())
96 return outputs[n].name;
102 if (type & INPUT && n < inputs.size())
103 return inputs[n].description;
104 if (type & OUTPUT && n < outputs.size())
105 return outputs[n].description;
124 for (std::list<struct link_t>::const_iterator i = inputs[n].links.begin(),end = inputs[n].links.end(); i != end; ++i)
125 v += i->block->output(i->channel);
133 return outputs[n].value;
136 double IO::Block::yogi = 0.0;
148 return outputs[n].value;
151 void IO::Block::connect(
IO::Block *src,
size_t src_num,
IO::Block *dest,
size_t dest_num)
157 ERROR_MSG(
"Block::connect : invalid source\n");
160 if (src_num >= src->outputs.size())
162 ERROR_MSG(
"Block::connect : invalid source channel\n");
168 ERROR_MSG(
"Block::connect : invalid destination\n");
171 if (dest_num >= dest->inputs.size())
173 ERROR_MSG(
"Block::connect : invalid destination channel\n");
178 for (std::list<struct link_t>::const_iterator i=src->outputs[src_num].links.begin(); i != src->outputs[src_num].links.end(); ++i)
179 if (i->block == dest && i->channel == dest_num)
181 ERROR_MSG(
"Block::connect : connection exists\n");
189 link.channel = dest_num;
190 src->outputs[src_num].links.push_back(link);
194 link.channel = src_num;
195 dest->inputs[dest_num].links.push_back(link);
198 event.setParam(
"src",src);
199 event.setParam(
"src_num",&src_num);
200 event.setParam(
"dest",dest);
201 event.setParam(
"dest_num",&dest_num);
205 void IO::Block::disconnect(
IO::Block *src,
size_t src_num,
IO::Block *dest,
size_t dest_num)
211 ERROR_MSG(
"Block::disconnect : invalid source\n");
214 if (src_num >= src->outputs.size())
216 ERROR_MSG(
"Block::disconnect : invalid source channel\n");
222 ERROR_MSG(
"Block::disconnect : invalid destination\n");
225 if (dest_num >= dest->inputs.size())
227 ERROR_MSG(
"Block::disconnect : invalid destination channel\n");
232 event.setParam(
"src",src);
233 event.setParam(
"src_num",&src_num);
234 event.setParam(
"dest",dest);
235 event.setParam(
"dest_num",&dest_num);
239 start_forward_remove:
240 for (std::list<struct link_t>::iterator i=src->outputs[src_num].links.begin(); i != src->outputs[src_num].links.end(); ++i)
241 if (i->block == dest && i->channel == dest_num)
243 src->outputs[src_num].links.erase(i);
244 goto start_forward_remove;
248 start_backward_remove:
249 for (std::list<struct link_t>::iterator i=dest->inputs[dest_num].links.begin(); i != dest->inputs[dest_num].links.end(); ++i)
250 if (i->block == src && i->channel == src_num)
252 dest->inputs[dest_num].links.erase(i);
253 goto start_backward_remove;
260 for (std::list<Block *>::iterator i = blockList.begin(); i != blockList.end(); ++i)
268 for (std::list<Block *>::iterator i = blockList.begin(), iend = blockList.end(); i != iend; ++i)
269 for (
size_t j = 0, jend = (*i)->outputs.size(); j < jend; ++j)
270 for (std::list<Block::link_t>::iterator k = (*i)->outputs[j].links.begin(), kend = (*i)->outputs[j].links.end(); k != kend; ++k)
271 callback(*i,j,k->block,k->channel,param);
280 ERROR_MSG(
"IO::Connector::connect : invalid output block\n");
286 ERROR_MSG(
"IO::Connector::connect : invalid input block\n");
290 IO::Block::connect(src,out,dest,in);
299 ERROR_MSG(
"IO::Connector::disconnect : invalid output block\n");
305 ERROR_MSG(
"IO::Connector::disconnect : invalid input block\n");
309 IO::Block::disconnect(src,out,dest,in);
316 ERROR_MSG(
"Block::connected : invalid source\n");
319 if (src_num >= src->outputs.size())
321 ERROR_MSG(
"Block::connected : invalid source channel\n");
327 ERROR_MSG(
"Block::connected : invalid destination\n");
330 if (dest_num >= dest->inputs.size())
332 ERROR_MSG(
"Block::connected : invalid destination channel\n");
336 for (std::list<IO::Block::link_t>::iterator i=src->outputs[src_num].links.begin(); i != src->outputs[src_num].links.end(); ++i)
337 if (i->block == dest && i->channel == dest_num)
378 void IO::Connector::insertBlock(
IO::Block *block)
382 ERROR_MSG(
"IO::Connector::insertBlock : invalid block\n");
388 if (std::find(blockList.begin(),blockList.end(),block) != blockList.end())
390 ERROR_MSG(
"IO::Connector::insertBlock : block already present\n");
395 event.setParam(
"block",block);
398 blockList.push_back(block);
401 void IO::Connector::removeBlock(
IO::Block *block)
405 ERROR_MSG(
"IO::Connector::insertBlock : invalid block\n");
412 event.setParam(
"block",block);
415 blockList.remove(block);
435 instance = &connector;