From 720c8e7764b3246c48414bb1673b254d17320ccb Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Thu, 5 Mar 2015 21:28:39 +0100 Subject: [PATCH] [DEV] correct Channel muxer --- river/Interface.cpp | 59 ++++++++++++++++++++------------ river/Interface.h | 1 + river/io/Group.cpp | 6 ++-- river/io/Group.h | 2 +- river/io/Manager.cpp | 45 ++++++++++++++++++------ river/io/Node.cpp | 74 ++++++++++++++++++++++------------------ river/io/Node.h | 4 ++- river/io/NodeAEC.cpp | 50 ++++++++++++++------------- river/io/NodeAirTAudio.h | 3 ++ river/io/NodeMuxer.cpp | 71 ++++++++++++++++++++------------------ river/io/NodeMuxer.h | 24 ++++++------- river/io/NodePortAudio.h | 3 ++ 12 files changed, 205 insertions(+), 137 deletions(-) diff --git a/river/Interface.cpp b/river/Interface.cpp index 19fc97f..938442e 100644 --- a/river/Interface.cpp +++ b/river/Interface.cpp @@ -363,31 +363,46 @@ void river::Interface::systemVolumeChange() { static void link(etk::FSNode& _node, const std::string& _first, const std::string& _op, const std::string& _second, bool _isLink=true) { if (_op == "->") { if (_isLink) { - _node << " " << _first << " -> " << _second << ";\n"; + _node << " " << _first << " -> " << _second << ";\n"; } else { - _node << " " << _first << " -> " << _second << " [style=dashed];\n"; + _node << " " << _first << " -> " << _second << " [style=dashed];\n"; } } else if (_op == "<-") { - _node << " " << _first << " -> " <<_second<< " [color=transparent];\n"; + _node << " " << _first << " -> " <<_second<< " [color=transparent];\n"; if (_isLink) { - _node << " " << _second << " -> " << _first << " [constraint=false];\n"; + _node << " " << _second << " -> " << _first << " [constraint=false];\n"; } else { - _node << " " << _second << " -> " << _first << " [constraint=false, style=dashed];\n"; + _node << " " << _second << " -> " << _first << " [constraint=false, style=dashed];\n"; } } } +std::string river::Interface::getDotNodeName() const { + if (m_mode == river::modeInterface_input) { + return "API_" + etk::to_string(m_uid) + "_input"; + } else if (m_mode == river::modeInterface_feedback) { + return "API_" + etk::to_string(m_uid) + "_feedback"; + } else if (m_mode == river::modeInterface_output) { + return "API_" + etk::to_string(m_uid) + "_output"; + } + return "error"; +} + void river::Interface::generateDot(etk::FSNode& _node, const std::string& _nameIO, bool _isLink) { - _node << "subgraph clusterInterface_" << m_uid << " {\n"; - _node << " color=orange;\n"; - _node << " label=\"[" << m_uid << "] Interface : " << m_name << "\";\n"; + _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=xxx\n freq=yyy\n channelMap={left,right}\n in\" ];\n"; - _node << " INTERFACE_ALGO_" << m_uid << "_out [ label=\"format=xxx\n freq=yyy\n channelMap={left,right}\n out\" ];\n"; - _node << " }\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"; if ( m_mode == river::modeInterface_input || m_mode == river::modeInterface_feedback) { link(_node, _nameIO, "->", "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_in", _isLink); @@ -396,17 +411,17 @@ void river::Interface::generateDot(etk::FSNode& _node, const std::string& _nameI 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"); } - _node << " node [shape=Mdiamond];\n"; + _node << " node [shape=Mdiamond];\n"; if (m_mode == river::modeInterface_input) { - _node << " API_" << m_uid << "_input [ label=\"API\nINPUT\" ];\n"; - link(_node, "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_out", "->", "API_" + etk::to_string(m_uid) + "_input"); + _node << " " << getDotNodeName() << " [ label=\"API\\nINPUT\" ];\n"; + link(_node, "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_out", "->", getDotNodeName()); } else if (m_mode == river::modeInterface_feedback) { - _node << " API_" << m_uid << "_feedback [ label=\"API\nFEEDBACK\" ];\n"; - link(_node, "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_out", "->", "API_" + etk::to_string(m_uid) + "_feedback"); + _node << " " << getDotNodeName() << " [ label=\"API\\nFEEDBACK\" ];\n"; + link(_node, "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_out", "->", getDotNodeName()); } else if (m_mode == river::modeInterface_output) { - _node << " API_" << m_uid << "_output [ label=\"API\nOUTPUT\" ];\n"; - link(_node, "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_in", "<-", "API_" + etk::to_string(m_uid) + "_output"); + _node << " " << getDotNodeName() << " [ label=\"API\\nOUTPUT\" ];\n"; + link(_node, "INTERFACE_ALGO_" + etk::to_string(m_uid) + "_in", "<-", getDotNodeName()); } - _node << "}\n"; + _node << " }\n \n"; } diff --git a/river/Interface.h b/river/Interface.h index a8f4045..74636c0 100644 --- a/river/Interface.h +++ b/river/Interface.h @@ -209,6 +209,7 @@ namespace river { float m_volume; //!< Local channel Volume public: virtual void generateDot(etk::FSNode& _node, const std::string& _nameIO, bool _isLink=true); + virtual std::string getDotNodeName() const; }; }; diff --git a/river/io/Group.cpp b/river/io/Group.cpp index afeeca0..77b434c 100644 --- a/river/io/Group.cpp +++ b/river/io/Group.cpp @@ -133,10 +133,12 @@ void river::io::Group::stop() { } } -void river::io::Group::generateDot(etk::FSNode& _node) { +void river::io::Group::generateDot(etk::FSNode& _node, bool _hardwareNode) { for (size_t iii=0; iiigenerateDot(_node); + if (m_list[iii]->isHarwareNode() == _hardwareNode) { + m_list[iii]->generateDot(_node); + } } } } diff --git a/river/io/Group.h b/river/io/Group.h index 6e261d3..f8e439a 100644 --- a/river/io/Group.h +++ b/river/io/Group.h @@ -27,7 +27,7 @@ namespace river { std11::shared_ptr getNode(const std::string& _name); void start(); void stop(); - void generateDot(etk::FSNode& _node); + void generateDot(etk::FSNode& _node, bool _hardwareNode); }; } } diff --git a/river/io/Manager.cpp b/river/io/Manager.cpp index 3547bcb..ec45567 100644 --- a/river/io/Manager.cpp +++ b/river/io/Manager.cpp @@ -234,20 +234,45 @@ void river::io::Manager::generateDot(const std::string& _filename) { } node << "digraph G {" << "\n"; node << " rankdir=\"LR\";\n"; - // standalone - for (size_t iii=0; iii val = m_list[iii].lock(); - if (val != nullptr) { - val->generateDot(node); + // First Step : Create all HW interface: + { + // standalone + for (size_t iii=0; iii val = m_list[iii].lock(); + if (val != nullptr) { + if (val->isHarwareNode() == true) { + val->generateDot(node); + } + } + } + for (std::map >::iterator it(m_listGroup.begin()); + it != m_listGroup.end(); + ++it) { + if (it->second != nullptr) { + it->second->generateDot(node, true); + } } } - for (std::map >::iterator it(m_listGroup.begin()); - it != m_listGroup.end(); - ++it) { - if (it->second != nullptr) { - it->second->generateDot(node); + // All other ... + { + // standalone + for (size_t iii=0; iii val = m_list[iii].lock(); + if (val != nullptr) { + if (val->isHarwareNode() == false) { + val->generateDot(node); + } + } + } + for (std::map >::iterator it(m_listGroup.begin()); + it != m_listGroup.end(); + ++it) { + if (it->second != nullptr) { + it->second->generateDot(node, false); + } } } + node << "}" << "\n"; node.fileClose(); RIVER_INFO("Generate the DOT files: " << node << " (DONE)"); diff --git a/river/io/Node.cpp b/river/io/Node.cpp index 3eb54b0..bd3bcc5 100644 --- a/river/io/Node.cpp +++ b/river/io/Node.cpp @@ -254,53 +254,61 @@ int32_t river::io::Node::newOutput(void* _outputBuffer, static void link(etk::FSNode& _node, const std::string& _first, const std::string& _op, const std::string& _second) { if (_op == "->") { - _node << " " << _first << " -> " << _second << ";\n"; + _node << " " << _first << " -> " << _second << ";\n"; } else if (_op == "<-") { - _node << " " << _first << " -> " <<_second<< " [color=transparent];\n"; - _node << " " << _second << " -> " << _first << " [constraint=false];\n"; + _node << " " << _first << " -> " <<_second<< " [color=transparent];\n"; + _node << " " << _second << " -> " << _first << " [constraint=false];\n"; } } void river::io::Node::generateDot(etk::FSNode& _node) { - _node << "subgraph clusterNode_" << m_uid << " {\n"; - _node << " color=blue;\n"; - _node << " label=\"[" << m_uid << "] IO::Node : " << m_name << "\";\n"; + _node << " subgraph clusterNode_" << m_uid << " {\n"; + _node << " color=blue;\n"; + _node << " label=\"[" << m_uid << "] IO::Node : " << m_name << "\";\n"; if (m_isInput == true) { - _node << " node [shape=rarrow];\n"; - _node << " NODE_" << m_uid << "_HW_interface [ label=\"HW interface\n interface=ALSA\n stream=MICROPHONE\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=xxx\n freq=yyy\n channelMap={left,right}\" ];\n"; - _node << " node_ALGO_" << m_uid << "_out [ label=\"format=xxx\n freq=yyy\n channelMap={left,right}\" ];\n"; + _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"; - _node << " node [shape=square];\n"; - _node << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\n format=xxx\" ];\n"; + _node << " }\n"; + _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 -> 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"; } 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=SPEAKER\n type=output\" ];\n"; + _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"; 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=xxx\n freq=yyy\n channelMap={left,right}\" ];\n"; - _node << " node_ALGO_" << m_uid << "_in [ label=\"format=xxx\n freq=yyy\n channelMap={left,right}\" ];\n"; - _node << " }\n"; + _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"; } - _node << " node [shape=square];\n"; + _node << " node [shape=square];\n"; if (nbOutput>0) { - _node << " NODE_" << m_uid << "_muxer [ label=\"MUXER\n format=xxx\" ];\n"; + _node << " NODE_" << m_uid << "_muxer [ label=\"MUXER\\n format=" << etk::to_string(m_process.getInputConfig().getFormat()) << "\" ];\n"; } if (nbfeedback>0) { - _node << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\n format=xxx\" ];\n"; + _node << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\\n format=" << etk::to_string(m_process.getOutputConfig().getFormat()) << "\" ];\n"; } // Link all nodes : if (nbOutput>0) { @@ -309,15 +317,15 @@ void river::io::Node::generateDot(etk::FSNode& _node) { link(_node, "node_ALGO_" + etk::to_string(m_uid) + "_in", "<-", "NODE_" + etk::to_string(m_uid) + "_muxer"); } if (nbfeedback>0) { - _node << " NODE_" << m_uid << "_HW_interface -> NODE_" << m_uid << "_demuxer [arrowhead=\"open\"];\n"; + _node << " NODE_" << m_uid << "_HW_interface -> NODE_" << m_uid << "_demuxer [arrowhead=\"open\"];\n"; } if ( nbOutput>0 && nbfeedback>0) { - _node << " { rank=same; NODE_" << m_uid << "_demuxer; NODE_" << m_uid << "_muxer }\n"; + _node << " { rank=same; NODE_" << m_uid << "_demuxer; NODE_" << m_uid << "_muxer }\n"; } } - _node << "}\n"; + _node << " }\n \n"; for (size_t iii=0; iii< m_listAvaillable.size(); ++iii) { if (m_listAvaillable[iii].expired() == true) { diff --git a/river/io/Node.h b/river/io/Node.h index dd1bc5b..c34a4ea 100644 --- a/river/io/Node.h +++ b/river/io/Node.h @@ -41,7 +41,9 @@ namespace river { * @brief Destructor */ virtual ~Node(); - + virtual bool isHarwareNode() { + return false; + }; protected: mutable std11::mutex m_mutex; std11::shared_ptr m_config; diff --git a/river/io/NodeAEC.cpp b/river/io/NodeAEC.cpp index 005ab2d..8852251 100644 --- a/river/io/NodeAEC.cpp +++ b/river/io/NodeAEC.cpp @@ -345,33 +345,37 @@ void river::io::NodeAEC::processAEC(void* _dataMic, void* _dataFB, uint32_t _nbC void river::io::NodeAEC::generateDot(etk::FSNode& _node) { - _node << "subgraph clusterNode_" << m_uid << " {\n"; - _node << " color=blue;\n"; - _node << " label=\"[" << m_uid << "] IO::Node : " << m_name << "\";\n"; + _node << " subgraph clusterNode_" << m_uid << " {\n"; + _node << " color=blue;\n"; + _node << " label=\"[" << m_uid << "] IO::Node : " << m_name << "\";\n"; - _node << " node [shape=box];\n"; + _node << " node [shape=box];\n"; // TODO : Create a structure ... - _node << " NODE_" << m_uid << "_HW_AEC [ label=\"AEC\" ];\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=xxx\n freq=yyy\n channelMap={left,right}\" ];\n"; - _node << " node_ALGO_" << m_uid << "_out [ label=\"format=xxx\n freq=yyy\n channelMap={left,right}\" ];\n"; + _node << " NODE_" << m_uid << "_HW_AEC [ label=\"AEC\" ];\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"; - _node << " node [shape=square];\n"; - _node << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\n format=xxx\" ];\n"; + _node << " }\n"; + _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_AEC -> 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 << "}\n"; - if (m_interfaceMicrophone != nullptr) { - _node << " API_" << m_interfaceMicrophone->m_uid << "_input -> NODE_" << m_uid << "_HW_AEC;\n"; - } - if (m_interfaceFeedBack != nullptr) { - _node << " API_" << m_interfaceFeedBack->m_uid << "_feedback -> NODE_" << m_uid << "_HW_AEC;\n"; - } + _node << " NODE_" << m_uid << "_HW_AEC -> 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 << " }\n"; + if (m_interfaceMicrophone != nullptr) { + _node << " " << m_interfaceMicrophone->getDotNodeName() << " -> NODE_" << m_uid << "_HW_AEC;\n"; + } + if (m_interfaceFeedBack != nullptr) { + _node << " " << m_interfaceFeedBack->getDotNodeName() << " -> NODE_" << m_uid << "_HW_AEC;\n"; + } for (size_t iii=0; iiisetInputCallback(std11::bind(&river::io::NodeMuxer::onDataReceivedFeedBack, + m_interfaceInput1->setInputCallback(std11::bind(&river::io::NodeMuxer::onDataReceivedInput1, this, std11::placeholders::_1, std11::placeholders::_2, @@ -137,7 +137,7 @@ river::io::NodeMuxer::NodeMuxer(const std::string& _name, const std11::shared_pt std11::placeholders::_5, std11::placeholders::_6)); // set callback mode ... - m_interfaceInput2->setInputCallback(std11::bind(&river::io::NodeMuxer::onDataReceivedMicrophone, + m_interfaceInput2->setInputCallback(std11::bind(&river::io::NodeMuxer::onDataReceivedInput2, this, std11::placeholders::_1, std11::placeholders::_2, @@ -187,12 +187,12 @@ void river::io::NodeMuxer::stop() { } -void river::io::NodeMuxer::onDataReceivedMicrophone(const void* _data, - const std11::chrono::system_clock::time_point& _time, - size_t _nbChunk, - enum audio::format _format, - uint32_t _frequency, - const std::vector& _map) { +void river::io::NodeMuxer::onDataReceivedInput1(const void* _data, + const std11::chrono::system_clock::time_point& _time, + size_t _nbChunk, + enum audio::format _format, + uint32_t _frequency, + const std::vector& _map) { RIVER_DEBUG("Microphone Time=" << _time << " _nbChunk=" << _nbChunk << " _map=" << _map << " _format=" << _format << " freq=" << _frequency); RIVER_DEBUG(" next=" << _time + std11::chrono::nanoseconds(_nbChunk*1000000000LL/int64_t(_frequency)) ); if (_format != audio::format_int16) { @@ -205,7 +205,7 @@ void river::io::NodeMuxer::onDataReceivedMicrophone(const void* _data, process(); } -void river::io::NodeMuxer::onDataReceivedFeedBack(const void* _data, +void river::io::NodeMuxer::onDataReceivedInput2(const void* _data, const std11::chrono::system_clock::time_point& _time, size_t _nbChunk, enum audio::format _format, @@ -430,34 +430,38 @@ void river::io::NodeMuxer::processMuxer(void* _dataIn1, void* _dataIn2, uint32_t void river::io::NodeMuxer::generateDot(etk::FSNode& _node) { - _node << "subgraph clusterNode_" << m_uid << " {\n"; - _node << " color=blue;\n"; - _node << " label=\"[" << m_uid << "] IO::Node : " << m_name << "\";\n"; + _node << " subgraph clusterNode_" << m_uid << " {\n"; + _node << " color=blue;\n"; + _node << " label=\"[" << m_uid << "] IO::Node : " << m_name << "\";\n"; - _node << " node [shape=box];\n"; + _node << " node [shape=box];\n"; // TODO : Create a structure ... - _node << " NODE_" << m_uid << "_HW_AEC [ label=\"AEC\" ];\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=xxx\n freq=yyy\n channelMap={left,right}\" ];\n"; - _node << " node_ALGO_" << m_uid << "_out [ label=\"format=xxx\n freq=yyy\n channelMap={left,right}\" ];\n"; + _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"; - _node << " node [shape=square];\n"; - _node << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\n format=xxx\" ];\n"; + _node << " }\n"; + _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_AEC -> 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 << "}\n"; - if (m_interfaceInput2 != nullptr) { - _node << " API_" << m_interfaceInput2->m_uid << "_input -> NODE_" << m_uid << "_HW_AEC;\n"; - } - if (m_interfaceInput1 != nullptr) { - _node << " API_" << m_interfaceInput1->m_uid << "_feedback -> NODE_" << m_uid << "_HW_AEC;\n"; - } - + _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 << " }\n"; + if (m_interfaceInput2 != nullptr) { + _node << " " << m_interfaceInput2->getDotNodeName() << " -> NODE_" << m_uid << "_HW_MUXER;\n"; + } + if (m_interfaceInput1 != nullptr) { + _node << " " << m_interfaceInput1->getDotNodeName() << " -> NODE_" << m_uid << "_HW_MUXER;\n"; + } + _node << " \n"; for (size_t iii=0; iiigetMode() == modeInterface_input) { @@ -471,4 +475,5 @@ void river::io::NodeMuxer::generateDot(etk::FSNode& _node) { } } } + _node << "\n"; } \ No newline at end of file diff --git a/river/io/NodeMuxer.h b/river/io/NodeMuxer.h index cba678a..7ff019e 100644 --- a/river/io/NodeMuxer.h +++ b/river/io/NodeMuxer.h @@ -36,18 +36,18 @@ namespace river { audio::format _format, const std::string& _streamName, const std::string& _name); - void onDataReceivedMicrophone(const void* _data, - const std11::chrono::system_clock::time_point& _time, - size_t _nbChunk, - enum audio::format _format, - uint32_t _frequency, - const std::vector& _map); - void onDataReceivedFeedBack(const void* _data, - const std11::chrono::system_clock::time_point& _time, - size_t _nbChunk, - enum audio::format _format, - uint32_t _frequency, - const std::vector& _map); + void onDataReceivedInput1(const void* _data, + const std11::chrono::system_clock::time_point& _time, + size_t _nbChunk, + enum audio::format _format, + uint32_t _frequency, + const std::vector& _map); + void onDataReceivedInput2(const void* _data, + const std11::chrono::system_clock::time_point& _time, + size_t _nbChunk, + enum audio::format _format, + uint32_t _frequency, + const std::vector& _map); std::vector m_mapInput1; std::vector m_mapInput2; river::CircularBuffer m_bufferInput1; diff --git a/river/io/NodePortAudio.h b/river/io/NodePortAudio.h index a29eb00..43486ec 100644 --- a/river/io/NodePortAudio.h +++ b/river/io/NodePortAudio.h @@ -28,6 +28,9 @@ namespace river { * @brief Destructor */ virtual ~NodePortAudio(); + virtual bool isHarwareNode() { + return true; + }; protected: PaStream* m_stream; public: