From 893cf1d5c02b54cd33063e914b78db8d19a893f0 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Thu, 5 Mar 2015 22:14:07 +0100 Subject: [PATCH] [DEV] modify dot file --- river/Interface.cpp | 75 ++++++++++++++++++++---------------------- river/io/Node.cpp | 37 ++++++--------------- river/io/NodeMuxer.cpp | 52 +++++++++++++++-------------- 3 files changed, 74 insertions(+), 90 deletions(-) diff --git a/river/Interface.cpp b/river/Interface.cpp index 938442e..83e3c97 100644 --- a/river/Interface.cpp +++ b/river/Interface.cpp @@ -58,14 +58,14 @@ bool river::Interface::init(const std::string& _name, if ( m_node->isInput() == true && m_mode == river::modeInterface_input) { m_process.setInputConfig(m_node->getInterfaceFormat()); - // add all time the volume stage : - std11::shared_ptr algo = drain::Volume::create(); - //algo->setInputFormat(m_node->getInterfaceFormat()); - algo->setName("volume"); - m_process.pushBack(algo); - RIVER_INFO("add basic volume stage (1)"); + // Add volume only if the Low level has a volume (otherwise it will be added by the application) std11::shared_ptr tmpVolume = m_node->getVolume(); if (tmpVolume != nullptr) { + // add all time the volume stage : + std11::shared_ptr algo = drain::Volume::create(); + //algo->setInputFormat(m_node->getInterfaceFormat()); + algo->setName("volume"); + m_process.pushBack(algo); RIVER_INFO(" add volume for node"); algo->addVolumeStage(tmpVolume); } @@ -73,14 +73,14 @@ bool river::Interface::init(const std::string& _name, } else if ( m_node->isOutput() == true && m_mode == river::modeInterface_output) { m_process.setInputConfig(drain::IOFormatInterface(map, _format, _freq)); - // add all time the volume stage : - std11::shared_ptr algo = drain::Volume::create(); - //algo->setOutputFormat(m_node->getInterfaceFormat()); - algo->setName("volume"); - m_process.pushBack(algo); - RIVER_INFO("add basic volume stage (2)"); + // Add volume only if the Low level has a volume (otherwise it will be added by the application) std11::shared_ptr tmpVolume = m_node->getVolume(); if (tmpVolume != nullptr) { + // add all time the volume stage : + std11::shared_ptr algo = drain::Volume::create(); + //algo->setOutputFormat(m_node->getInterfaceFormat()); + algo->setName("volume"); + m_process.pushBack(algo); RIVER_INFO(" add volume for node"); algo->addVolumeStage(tmpVolume); } @@ -88,13 +88,6 @@ bool river::Interface::init(const std::string& _name, } else if ( m_node->isOutput() == true && m_mode == river::modeInterface_feedback) { m_process.setInputConfig(m_node->getHarwareFormat()); - /* - // add all time the volume stage : - std11::shared_ptr algo = drain::Volume::create(); - //algo->setInputFormat(m_node->getInterfaceFormat()); - algo->setName("volume"); - m_process.pushBack(algo); - */ // note : feedback has no volume stage ... m_process.setOutputConfig(drain::IOFormatInterface(map, _format, _freq)); } else { @@ -326,8 +319,15 @@ void river::Interface::addVolumeGroup(const std::string& _name) { RIVER_DEBUG("addVolumeGroup(" << _name << ")"); std11::shared_ptr algo = m_process.get("volume"); if (algo == nullptr) { - RIVER_ERROR("addVolumeGroup(" << _name << ") ==> no volume stage ... can not add it ..."); - return; + m_process.removeAlgoDynamic(); + // add all time the volume stage : + algo = drain::Volume::create(); + algo->setName("volume"); + if (m_node->isInput() == true) { + m_process.pushFront(algo); + } else { + m_process.pushBack(algo); + } } if (_name == "FLOW") { // Local volume name @@ -392,35 +392,32 @@ void river::Interface::generateDot(etk::FSNode& _node, const std::string& _nameI _node << " subgraph clusterInterface_" << m_uid << " {\n"; _node << " color=orange;\n"; _node << " label=\"[" << m_uid << "] Interface : " << m_name << "\";\n"; - - _node << " subgraph clusterInterface_" << m_uid << "_process {\n"; - _node << " label=\"Drain::Process\";\n"; - _node << " node [shape=ellipse];\n"; - _node << " INTERFACE_ALGO_" << m_uid << "_in [ label=\"format=" << etk::to_string(m_process.getInputConfig().getFormat()) - << "\\n freq=" << m_process.getInputConfig().getFrequency() - << "\\n channelMap=" << etk::to_string(m_process.getInputConfig().getMap()) << "\\n in\" ];\n"; - _node << " INTERFACE_ALGO_" << m_uid << "_out [ label=\"format=" << etk::to_string(m_process.getOutputConfig().getFormat()) - << "\\n freq=" << m_process.getOutputConfig().getFrequency() - << "\\n channelMap=" << etk::to_string(m_process.getOutputConfig().getMap()) << "\\n out\" ];\n"; - _node << " }\n"; + std::string nameIn; + std::string nameOut; if ( m_mode == river::modeInterface_input || m_mode == river::modeInterface_feedback) { - link(_node, _nameIO, "->", "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_in", _isLink); - link(_node, "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_in", "->", "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_out"); + m_process.generateDot(_node, 3, 10000+m_uid, nameIn, nameOut, false); } else { - link(_node, _nameIO, "<-", "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_out", _isLink); - link(_node, "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_out", "<-", "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_in"); + m_process.generateDot(_node, 3, 10000+m_uid, nameIn, nameOut, true); + } + + + if ( m_mode == river::modeInterface_input + || m_mode == river::modeInterface_feedback) { + link(_node, _nameIO, "->", nameIn, _isLink); + } else { + link(_node, _nameIO, "<-", nameOut, _isLink); } _node << " node [shape=Mdiamond];\n"; if (m_mode == river::modeInterface_input) { _node << " " << getDotNodeName() << " [ label=\"API\\nINPUT\" ];\n"; - link(_node, "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_out", "->", getDotNodeName()); + link(_node, nameOut, "->", getDotNodeName()); } else if (m_mode == river::modeInterface_feedback) { _node << " " << getDotNodeName() << " [ label=\"API\\nFEEDBACK\" ];\n"; - link(_node, "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_out", "->", getDotNodeName()); + link(_node, nameOut, "->", getDotNodeName()); } else if (m_mode == river::modeInterface_output) { _node << " " << getDotNodeName() << " [ label=\"API\\nOUTPUT\" ];\n"; - link(_node, "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_in", "<-", getDotNodeName()); + link(_node, nameIn, "<-", getDotNodeName()); } _node << " }\n \n"; } diff --git a/river/io/Node.cpp b/river/io/Node.cpp index bd3bcc5..2281707 100644 --- a/river/io/Node.cpp +++ b/river/io/Node.cpp @@ -269,39 +269,23 @@ void river::io::Node::generateDot(etk::FSNode& _node) { if (m_isInput == true) { _node << " node [shape=rarrow];\n"; _node << " NODE_" << m_uid << "_HW_interface [ label=\"HW interface\\n interface=ALSA\\n stream=" << m_name << "\\n type=input\" ];\n"; - _node << " subgraph clusterNode_" << m_uid << "_process {\n"; - _node << " label=\"Drain::Process\";\n"; - _node << " node [shape=ellipse];\n"; - _node << " node_ALGO_" << m_uid << "_in [ label=\"format=" << etk::to_string(m_process.getInputConfig().getFormat()) - << "\\n freq=" << m_process.getInputConfig().getFrequency() - << "\\n channelMap=" << etk::to_string(m_process.getInputConfig().getMap()) << "\" ];\n"; - _node << " node_ALGO_" << m_uid << "_out [ label=\"format=" << etk::to_string(m_process.getOutputConfig().getFormat()) - << "\\n freq=" << m_process.getOutputConfig().getFrequency() - << "\\n channelMap=" << etk::to_string(m_process.getOutputConfig().getMap()) << "\" ];\n"; - - _node << " }\n"; + std::string nameIn; + std::string nameOut; + m_process.generateDot(_node, 3, m_uid, nameIn, nameOut, false); _node << " node [shape=square];\n"; _node << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\\n format=" << etk::to_string(m_process.getOutputConfig().getFormat()) << "\" ];\n"; // Link all nodes : - _node << " NODE_" << m_uid << "_HW_interface -> node_ALGO_" << m_uid << "_in [arrowhead=\"open\"];\n"; - _node << " node_ALGO_" << m_uid << "_in -> node_ALGO_" << m_uid << "_out [arrowhead=\"open\"];\n"; - _node << " node_ALGO_" << m_uid << "_out -> NODE_" << m_uid << "_demuxer [arrowhead=\"open\"];\n"; + _node << " NODE_" << m_uid << "_HW_interface -> " << nameIn << " [arrowhead=\"open\"];\n"; + _node << " " << nameOut << " -> NODE_" << m_uid << "_demuxer [arrowhead=\"open\"];\n"; } else { size_t nbOutput = getNumberOfInterfaceAvaillable(river::modeInterface_output); size_t nbfeedback = getNumberOfInterfaceAvaillable(river::modeInterface_feedback); _node << " node [shape=larrow];\n"; _node << " NODE_" << m_uid << "_HW_interface [ label=\"HW interface\\n interface=ALSA\\n stream=" << m_name << "\\n type=output\" ];\n"; + std::string nameIn; + std::string nameOut; if (nbOutput>0) { - _node << " subgraph clusterNode_" << m_uid << "_process {\n"; - _node << " label=\"Drain::Process\";\n"; - _node << " node [shape=ellipse];\n"; - _node << " node_ALGO_" << m_uid << "_out [ label=\"format=" << etk::to_string(m_process.getOutputConfig().getFormat()) - << "\\n freq=" << m_process.getOutputConfig().getFrequency() - << "\\n channelMap=" << etk::to_string(m_process.getOutputConfig().getMap()) << "\" ];\n"; - _node << " node_ALGO_" << m_uid << "_in [ label=\"format=" << etk::to_string(m_process.getInputConfig().getFormat()) - << "\\n freq=" << m_process.getInputConfig().getFrequency() - << "\\n channelMap=" << etk::to_string(m_process.getInputConfig().getMap()) << "\" ];\n"; - _node << " }\n"; + m_process.generateDot(_node, 3, m_uid, nameIn, nameOut, true); } _node << " node [shape=square];\n"; if (nbOutput>0) { @@ -312,9 +296,8 @@ void river::io::Node::generateDot(etk::FSNode& _node) { } // Link all nodes : if (nbOutput>0) { - link(_node, "NODE_" + etk::to_string(m_uid) + "_HW_interface", "<-", "node_ALGO_" + etk::to_string(m_uid) + "_out"); - link(_node, "node_ALGO_" + etk::to_string(m_uid) + "_out", "<-", "node_ALGO_" + etk::to_string(m_uid) + "_in"); - link(_node, "node_ALGO_" + etk::to_string(m_uid) + "_in", "<-", "NODE_" + etk::to_string(m_uid) + "_muxer"); + link(_node, "NODE_" + etk::to_string(m_uid) + "_HW_interface", "<-", nameOut); + link(_node, nameIn, "<-", "NODE_" + etk::to_string(m_uid) + "_muxer"); } if (nbfeedback>0) { _node << " NODE_" << m_uid << "_HW_interface -> NODE_" << m_uid << "_demuxer [arrowhead=\"open\"];\n"; diff --git a/river/io/NodeMuxer.cpp b/river/io/NodeMuxer.cpp index a9ccba0..253188b 100644 --- a/river/io/NodeMuxer.cpp +++ b/river/io/NodeMuxer.cpp @@ -281,8 +281,8 @@ void river::io::NodeMuxer::process() { //RIVER_INFO(" process 256 samples ... in1Time=" << in1Time << " in2Time=" << in2Time << " delta = " << (in1Time-in2Time).count()); m_bufferInput1.read(&dataIn1[0], 256); m_bufferInput2.read(&dataIn2[0], 256); - RIVER_SAVE_FILE_MACRO(int16_t, "REC_INPUT1.raw", &dataIn1[0], 256 * m_mapInput1.size()); - RIVER_SAVE_FILE_MACRO(int16_t, "REC_INPUT2.raw", &dataIn2[0], 256 * m_mapInput2.size()); + //RIVER_SAVE_FILE_MACRO(int16_t, "REC_INPUT1.raw", &dataIn1[0], 256 * m_mapInput1.size()); + //RIVER_SAVE_FILE_MACRO(int16_t, "REC_INPUT2.raw", &dataIn2[0], 256 * m_mapInput2.size()); // if threaded : send event / otherwise, process ... processMuxer(&dataIn1[0], &dataIn2[0], 256, in1Time); if ( m_bufferInput1.getSize() <= 256 @@ -437,23 +437,14 @@ void river::io::NodeMuxer::generateDot(etk::FSNode& _node) { _node << " node [shape=box];\n"; // TODO : Create a structure ... _node << " NODE_" << m_uid << "_HW_MUXER [ label=\"Muxer\\n channelMap=" << etk::to_string(getInterfaceFormat().getMap()) << "\" ];\n"; - _node << " subgraph clusterNode_" << m_uid << "_process {\n"; - _node << " label=\"Drain::Process\";\n"; - _node << " node [shape=ellipse];\n"; - _node << " node_ALGO_" << m_uid << "_in [ label=\"format=" << etk::to_string(m_process.getInputConfig().getFormat()) - << "\\n freq=" << m_process.getInputConfig().getFrequency() - << "\\n channelMap=" << etk::to_string(m_process.getInputConfig().getMap()) << "\" ];\n"; - _node << " node_ALGO_" << m_uid << "_out [ label=\"format=" << etk::to_string(m_process.getOutputConfig().getFormat()) - << "\\n freq=" << m_process.getOutputConfig().getFrequency() - << "\\n channelMap=" << etk::to_string(m_process.getOutputConfig().getMap()) << "\" ];\n"; - - _node << " }\n"; + std::string nameIn; + std::string nameOut; + m_process.generateDot(_node, 3, m_uid, nameIn, nameOut, false); _node << " node [shape=square];\n"; _node << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\\n format=" << etk::to_string(m_process.getOutputConfig().getFormat()) << "\" ];\n"; // Link all nodes : - _node << " NODE_" << m_uid << "_HW_MUXER -> node_ALGO_" << m_uid << "_in;\n"; - _node << " node_ALGO_" << m_uid << "_in -> node_ALGO_" << m_uid << "_out;\n"; - _node << " node_ALGO_" << m_uid << "_out -> NODE_" << m_uid << "_demuxer;\n"; + _node << " NODE_" << m_uid << "_HW_MUXER -> " << nameIn << ";\n"; + _node << " " << nameOut << " -> NODE_" << m_uid << "_demuxer;\n"; _node << " }\n"; if (m_interfaceInput2 != nullptr) { _node << " " << m_interfaceInput2->getDotNodeName() << " -> NODE_" << m_uid << "_HW_MUXER;\n"; @@ -462,14 +453,27 @@ void river::io::NodeMuxer::generateDot(etk::FSNode& _node) { _node << " " << m_interfaceInput1->getDotNodeName() << " -> NODE_" << m_uid << "_HW_MUXER;\n"; } _node << " \n"; - for (size_t iii=0; iiigetMode() == modeInterface_input) { - m_list[iii]->generateDot(_node, "NODE_" + etk::to_string(m_uid) + "_demuxer"); - } else if (m_list[iii]->getMode() == modeInterface_output) { - m_list[iii]->generateDot(_node, "NODE_" + etk::to_string(m_uid) + "_muxer"); - } else if (m_list[iii]->getMode() == modeInterface_feedback) { - m_list[iii]->generateDot(_node, "NODE_" + etk::to_string(m_uid) + "_demuxer"); + for (size_t iii=0; iii< m_listAvaillable.size(); ++iii) { + if (m_listAvaillable[iii].expired() == true) { + continue; + } + std11::shared_ptr element = m_listAvaillable[iii].lock(); + if (element == nullptr) { + continue; + } + bool isLink = false; + for (size_t jjj=0; jjjgetMode() == modeInterface_input) { + element->generateDot(_node, "NODE_" + etk::to_string(m_uid) + "_demuxer", isLink); + } else if (element->getMode() == modeInterface_output) { + element->generateDot(_node, "NODE_" + etk::to_string(m_uid) + "_muxer", isLink); + } else if (element->getMode() == modeInterface_feedback) { + element->generateDot(_node, "NODE_" + etk::to_string(m_uid) + "_demuxer", isLink); } else { }