[DEV] update new etk Uri API

This commit is contained in:
2018-10-23 22:19:32 +02:00
parent 965df2ee2f
commit 1773297dab
26 changed files with 146 additions and 168 deletions

View File

@@ -130,11 +130,11 @@ void audio::river::io::Group::stop() {
}
}
void audio::river::io::Group::generateDot(etk::FSNode& _node, bool _hardwareNode) {
void audio::river::io::Group::generateDot(ememory::SharedPtr<etk::io::Interface>& _io, bool _hardwareNode) {
for (size_t iii=0; iii<m_list.size(); ++iii) {
if (m_list[iii] != null) {
if (m_list[iii]->isHarwareNode() == _hardwareNode) {
m_list[iii]->generateDot(_node);
m_list[iii]->generateDot(_io);
}
}
}

View File

@@ -9,7 +9,7 @@
#include <etk/String.hpp>
#include <etk/Vector.hpp>
#include <ejson/ejson.hpp>
#include <etk/os/FSNode.hpp>
#include <etk/io/Interface.hpp>
namespace audio {
namespace river {
@@ -65,7 +65,7 @@ namespace audio {
* @param[in] _hardwareNode true if user want only display the hardware
* node and not the software node. false The oposite.
*/
void generateDot(etk::FSNode& _node, bool _hardwareNode);
void generateDot(ememory::SharedPtr<etk::io::Interface>& _node, bool _hardwareNode);
};
}
}

View File

@@ -12,9 +12,10 @@
#include <audio/river/io/NodeMuxer.hpp>
#include <audio/river/io/NodeOrchestra.hpp>
#include <audio/river/io/NodePortAudio.hpp>
#include <etk/os/FSNode.hpp>
#include <ememory/memory.hpp>
#include <etk/types.hpp>
#include <etk/path/fileSystem.hpp>
#include <etk/uri/uri.hpp>
#ifdef AUDIO_RIVER_BUILD_PORTAUDIO
extern "C" {
@@ -56,7 +57,7 @@ static etk::String basicAutoConfig =
"}\n";
static etk::String pathToTheRiverConfigInHome("HOME:.local/share/audio-river/config.json");
static etk::Uri pathToTheRiverConfigInHome(etk::path::getHomePath() / ".local" / "share" / "audio-river" / "config.json");
audio::river::io::Manager::Manager() {
#ifdef AUDIO_RIVER_BUILD_PORTAUDIO
@@ -67,18 +68,18 @@ audio::river::io::Manager::Manager() {
#endif
}
void audio::river::io::Manager::init(const etk::String& _filename) {
void audio::river::io::Manager::init(const etk::Uri& _uri) {
RIVER_ERROR("kjqsdhfkjqshdfkjqhsdskjdfhfkqjshqhskdjfhqsdfqsdqsdfqsdqsdfqsdfqsdfqsdfqsdfqsd");
ethread::RecursiveLock lock(m_mutex);
if (_filename == "") {
if (_uri.isEmpty() == true) {
if (m_config.load(pathToTheRiverConfigInHome) == false) {
RIVER_INFO("Load default config");
m_config.parse(basicAutoConfig);
} else {
RIVER_INFO("Load default user configuration: " << pathToTheRiverConfigInHome);
}
} else if (m_config.load(_filename) == false) {
RIVER_ERROR("you must set a basic configuration file for harware configuration: '" << _filename << "'");
} else if (m_config.load(_uri) == false) {
RIVER_ERROR("you must set a basic configuration file for harware configuration: " << _uri);
}
}
@@ -349,16 +350,16 @@ bool audio::river::io::Manager::getMute(const etk::String& _volumeName) {
return volume->getMute();
}
void audio::river::io::Manager::generateDot(const etk::String& _filename) {
void audio::river::io::Manager::generateDot(const etk::Uri& _uri) {
ethread::RecursiveLock lock(m_mutex);
etk::FSNode node(_filename);
RIVER_INFO("Generate the DOT files: " << node);
if (node.fileOpenWrite() == false) {
RIVER_ERROR("Can not Write the dot file (fail to open) : " << node);
ememory::SharedPtr<etk::io::Interface> ioFile = etk::uri::get(_uri);
RIVER_INFO("Generate the DOT files: " << _uri);
if (ioFile->open(etk::io::OpenMode::Write) == false) {
RIVER_ERROR("Can not Write the dot file (fail to open) : " << _uri);
return;
}
node << "digraph G {" << "\n";
node << " rankdir=\"LR\";\n";
*ioFile << "digraph G {" << "\n";
*ioFile << " rankdir=\"LR\";\n";
// First Step : Create all HW interface:
{
// standalone
@@ -366,7 +367,7 @@ void audio::river::io::Manager::generateDot(const etk::String& _filename) {
ememory::SharedPtr<audio::river::io::Node> val = m_list[iii].lock();
if (val != null) {
if (val->isHarwareNode() == true) {
val->generateDot(node);
val->generateDot(ioFile);
}
}
}
@@ -374,7 +375,7 @@ void audio::river::io::Manager::generateDot(const etk::String& _filename) {
it != m_listGroup.end();
++it) {
if (it->second != null) {
it->second->generateDot(node, true);
it->second->generateDot(ioFile, true);
}
}
}
@@ -385,7 +386,7 @@ void audio::river::io::Manager::generateDot(const etk::String& _filename) {
ememory::SharedPtr<audio::river::io::Node> val = m_list[iii].lock();
if (val != null) {
if (val->isHarwareNode() == false) {
val->generateDot(node);
val->generateDot(ioFile);
}
}
}
@@ -393,14 +394,14 @@ void audio::river::io::Manager::generateDot(const etk::String& _filename) {
it != m_listGroup.end();
++it) {
if (it->second != null) {
it->second->generateDot(node, false);
it->second->generateDot(ioFile, false);
}
}
}
node << "}" << "\n";
node.fileClose();
RIVER_INFO("Generate the DOT files: " << node << " (DONE)");
*ioFile << "}" << "\n";
ioFile->close();
RIVER_INFO("Generate the DOT files: " << _uri << " (DONE)");
}
ememory::SharedPtr<audio::river::io::Group> audio::river::io::Manager::getGroup(const etk::String& _name) {

View File

@@ -42,9 +42,9 @@ namespace audio {
~Manager();
/**
* @brief Called by audio::river::init() to set the hardware configuration file.
* @param[in] _filename Name of the file to initialize.
* @param[in] _uri Uri file to initialize.
*/
void init(const etk::String& _filename);
void init(const etk::Uri& _uri);
/**
* @brief Called by audio::river::initString() to set the hardware configuration string.
* @param[in] _data json configuration string.
@@ -132,9 +132,9 @@ namespace audio {
bool getMute(const etk::String& _volumeName);
/**
* @brief Generate the dot file corresponding at the actif nodes.
* @param[in] _filename Name of the file to write data.
* @param[in] _uri Uri of the file to write data.
*/
void generateDot(const etk::String& _filename);
void generateDot(const etk::Uri& _uri);
private:
etk::Map<etk::String, ememory::SharedPtr<audio::river::io::Group> > m_listGroup; //!< List of all groups
/**

View File

@@ -391,63 +391,63 @@ void audio::river::io::Node::newOutput(void* _outputBuffer,
return;
}
static void link(etk::FSNode& _node, const etk::String& _first, const etk::String& _op, const etk::String& _second) {
static void link(ememory::SharedPtr<etk::io::Interface>& _io, const etk::String& _first, const etk::String& _op, const etk::String& _second) {
if (_op == "->") {
_node << " " << _first << " -> " << _second << ";\n";
*_io << " " << _first << " -> " << _second << ";\n";
} else if (_op == "<-") {
_node << " " << _first << " -> " <<_second<< " [color=transparent];\n";
_node << " " << _second << " -> " << _first << " [constraint=false];\n";
*_io << " " << _first << " -> " <<_second<< " [color=transparent];\n";
*_io << " " << _second << " -> " << _first << " [constraint=false];\n";
}
}
void audio::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";
void audio::river::io::Node::generateDot(ememory::SharedPtr<etk::io::Interface>& _io) {
*_io << " subgraph clusterNode_" << m_uid << " {\n";
*_io << " color=blue;\n";
*_io << " 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=" << m_name << "\\n type=input\" ];\n";
*_io << " node [shape=rarrow];\n";
*_io << " NODE_" << m_uid << "_HW_interface [ label=\"HW interface\\n interface=ALSA\\n stream=" << m_name << "\\n type=input\" ];\n";
etk::String nameIn;
etk::String nameOut;
m_process.generateDotProcess(_node, 3, m_uid, nameIn, nameOut, false);
_node << " node [shape=square];\n";
_node << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\\n format=" << etk::toString(m_process.getOutputConfig().getFormat()) << "\" ];\n";
m_process.generateDotProcess(_io, 3, m_uid, nameIn, nameOut, false);
*_io << " node [shape=square];\n";
*_io << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\\n format=" << etk::toString(m_process.getOutputConfig().getFormat()) << "\" ];\n";
// Link all nodes :
_node << " NODE_" << m_uid << "_HW_interface -> " << nameIn << " [arrowhead=\"open\"];\n";
_node << " " << nameOut << " -> NODE_" << m_uid << "_demuxer [arrowhead=\"open\"];\n";
*_io << " NODE_" << m_uid << "_HW_interface -> " << nameIn << " [arrowhead=\"open\"];\n";
*_io << " " << nameOut << " -> NODE_" << m_uid << "_demuxer [arrowhead=\"open\"];\n";
} else {
size_t nbOutput = getNumberOfInterfaceAvaillable(audio::river::modeInterface_output);
size_t nbfeedback = getNumberOfInterfaceAvaillable(audio::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";
*_io << " node [shape=larrow];\n";
*_io << " NODE_" << m_uid << "_HW_interface [ label=\"HW interface\\n interface=ALSA\\n stream=" << m_name << "\\n type=output\" ];\n";
etk::String nameIn;
etk::String nameOut;
if (nbOutput>0) {
m_process.generateDotProcess(_node, 3, m_uid, nameIn, nameOut, true);
m_process.generateDotProcess(_io, 3, m_uid, nameIn, nameOut, true);
}
_node << " node [shape=square];\n";
*_io << " node [shape=square];\n";
if (nbOutput>0) {
_node << " NODE_" << m_uid << "_muxer [ label=\"MUXER\\n format=" << etk::toString(m_process.getInputConfig().getFormat()) << "\" ];\n";
*_io << " NODE_" << m_uid << "_muxer [ label=\"MUXER\\n format=" << etk::toString(m_process.getInputConfig().getFormat()) << "\" ];\n";
}
if (nbfeedback>0) {
_node << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\\n format=" << etk::toString(m_process.getOutputConfig().getFormat()) << "\" ];\n";
*_io << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\\n format=" << etk::toString(m_process.getOutputConfig().getFormat()) << "\" ];\n";
}
// Link all nodes :
if (nbOutput>0) {
link(_node, "NODE_" + etk::toString(m_uid) + "_HW_interface", "<-", nameOut);
link(_node, nameIn, "<-", "NODE_" + etk::toString(m_uid) + "_muxer");
link(_io, "NODE_" + etk::toString(m_uid) + "_HW_interface", "<-", nameOut);
link(_io, nameIn, "<-", "NODE_" + etk::toString(m_uid) + "_muxer");
}
if (nbfeedback>0) {
_node << " NODE_" << m_uid << "_HW_interface -> NODE_" << m_uid << "_demuxer [arrowhead=\"open\"];\n";
*_io << " 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";
*_io << " { rank=same; NODE_" << m_uid << "_demuxer; NODE_" << m_uid << "_muxer }\n";
}
}
_node << " }\n \n";
*_io << " }\n \n";
for (size_t iii=0; iii< m_listAvaillable.size(); ++iii) {
if (m_listAvaillable[iii].expired() == true) {
@@ -465,11 +465,11 @@ void audio::river::io::Node::generateDot(etk::FSNode& _node) {
}
if (element != null) {
if (element->getMode() == modeInterface_input) {
element->generateDot(_node, "NODE_" + etk::toString(m_uid) + "_demuxer", isLink);
element->generateDot(_io, "NODE_" + etk::toString(m_uid) + "_demuxer", isLink);
} else if (element->getMode() == modeInterface_output) {
element->generateDot(_node, "NODE_" + etk::toString(m_uid) + "_muxer", isLink);
element->generateDot(_io, "NODE_" + etk::toString(m_uid) + "_muxer", isLink);
} else if (element->getMode() == modeInterface_feedback) {
element->generateDot(_node, "NODE_" + etk::toString(m_uid) + "_demuxer", isLink);
element->generateDot(_io, "NODE_" + etk::toString(m_uid) + "_demuxer", isLink);
} else {
}

View File

@@ -15,7 +15,7 @@
#include <audio/river/Interface.hpp>
#include <audio/drain/IOFormatInterface.hpp>
#include <audio/drain/Volume.hpp>
#include <etk/os/FSNode.hpp>
#include <etk/io/Interface.hpp>
namespace audio {
namespace river {
@@ -209,9 +209,9 @@ namespace audio {
public:
/**
* @brief Generate the node dot file section
* @param[in] _node File node to generate the data.
* @param[in] _io File interface to dump data.
*/
virtual void generateDot(etk::FSNode& _node);
virtual void generateDot(ememory::SharedPtr<etk::io::Interface>& _io);
};
}
}

View File

@@ -316,27 +316,27 @@ void audio::river::io::NodeAEC::processAEC(void* _dataMic, void* _dataFB, uint32
}
void audio::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 << " NODE_" << m_uid << "_HW_AEC [ label=\"AEC\\n channelMap=" << etk::toString(getInterfaceFormat().getMap()) << "\" ];\n";
void audio::river::io::NodeAEC::generateDot(ememory::SharedPtr<etk::io::Interface>& _io) {
*_io << " subgraph clusterNode_" << m_uid << " {\n";
*_io << " color=blue;\n";
*_io << " label=\"[" << m_uid << "] IO::Node : " << m_name << "\";\n";
*_io << " NODE_" << m_uid << "_HW_AEC [ label=\"AEC\\n channelMap=" << etk::toString(getInterfaceFormat().getMap()) << "\" ];\n";
etk::String nameIn;
etk::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::toString(m_process.getOutputConfig().getFormat()) << "\" ];\n";
m_process.generateDot(_io, 3, m_uid, nameIn, nameOut, false);
*_io << " node [shape=square];\n";
*_io << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\\n format=" << etk::toString(m_process.getOutputConfig().getFormat()) << "\" ];\n";
// Link all nodes :
_node << " NODE_" << m_uid << "_HW_AEC -> " << nameIn << ";\n";
_node << " " << nameOut << " -> NODE_" << m_uid << "_demuxer;\n";
_node << " }\n";
*_io << " NODE_" << m_uid << "_HW_AEC -> " << nameIn << ";\n";
*_io << " " << nameOut << " -> NODE_" << m_uid << "_demuxer;\n";
*_io << " }\n";
if (m_interfaceMicrophone != null) {
_node << " " << m_interfaceMicrophone->getDotNodeName() << " -> NODE_" << m_uid << "_HW_AEC;\n";
*_io << " " << m_interfaceMicrophone->getDotNodeName() << " -> NODE_" << m_uid << "_HW_AEC;\n";
}
if (m_interfaceFeedBack != null) {
_node << " " << m_interfaceFeedBack->getDotNodeName() << " -> NODE_" << m_uid << "_HW_AEC;\n";
*_io << " " << m_interfaceFeedBack->getDotNodeName() << " -> NODE_" << m_uid << "_HW_AEC;\n";
}
_node << " \n";
*_io << " \n";
for (size_t iii=0; iii< m_listAvaillable.size(); ++iii) {
if (m_listAvaillable[iii].expired() == true) {
@@ -354,11 +354,11 @@ void audio::river::io::NodeAEC::generateDot(etk::FSNode& _node) {
}
if (element != null) {
if (element->getMode() == modeInterface_input) {
element->generateDot(_node, "NODE_" + etk::toString(m_uid) + "_demuxer", isLink);
element->generateDot(_io, "NODE_" + etk::toString(m_uid) + "_demuxer", isLink);
} else if (element->getMode() == modeInterface_output) {
element->generateDot(_node, "NODE_" + etk::toString(m_uid) + "_muxer", isLink);
element->generateDot(_io, "NODE_" + etk::toString(m_uid) + "_muxer", isLink);
} else if (element->getMode() == modeInterface_feedback) {
element->generateDot(_node, "NODE_" + etk::toString(m_uid) + "_demuxer", isLink);
element->generateDot(_io, "NODE_" + etk::toString(m_uid) + "_demuxer", isLink);
} else {
}

View File

@@ -87,7 +87,7 @@ namespace audio {
*/
void processAEC(void* _dataMic, void* _dataFB, uint32_t _nbChunk, const audio::Time& _time);
public:
virtual void generateDot(etk::FSNode& _node);
virtual void generateDot(ememory::SharedPtr<etk::io::Interface>& _io);
private:
int32_t m_nbChunk;
int32_t m_gainValue;

View File

@@ -34,12 +34,12 @@ int32_t audio::river::io::NodeFile::playbackCallback(void* _outputBuffer,
ememory::SharedPtr<audio::river::io::NodeFile> audio::river::io::NodeFile::create(const etk::String& _name, const ejson::Object& _config) {
return ememory::SharedPtr<audio::river::io::NodeFile>(ETK_NEW(audio::river::io::NodeFile, _name, _config));
ememory::SharedPtr<audio::river::io::NodeFile> audio::river::io::NodeFile::create(const etk::Path& _path, const ejson::Object& _config) {
return ememory::SharedPtr<audio::river::io::NodeFile>(ETK_NEW(audio::river::io::NodeFile, _path, _config));
}
audio::river::io::NodeFile::NodeFile(const etk::String& _name, const ejson::Object& _config) :
Node(_name, _config) {
audio::river::io::NodeFile::NodeFile(const etk::Path& _path, const ejson::Object& _config) :
Node(_path.getString(), _config) {
audio::drain::IOFormatInterface interfaceFormat = getInterfaceFormat();
audio::drain::IOFormatInterface hardwareFormat = getHarwareFormat();
/**

View File

@@ -24,9 +24,9 @@ namespace audio {
/**
* @brief Constructor
*/
NodeFile(const etk::String& _name, const ejson::Object& _config);
NodeFile(const etk::Path& _path, const ejson::Object& _config);
public:
static ememory::SharedPtr<NodeFile> create(const etk::String& _name, const ejson::Object& _config);
static ememory::SharedPtr<NodeFile> create(const etk::Path& _path, const ejson::Object& _config);
/**
* @brief Destructor
*/
@@ -36,7 +36,7 @@ namespace audio {
};
protected:
audio::Time m_time; //!< time of the flow
etk::FSNode m_file; //!< File interface
ememory::SharedPtr<etk::io::Interface>& m_file; //!< File interface
bool m_restartAtEnd; //!< The read is done in loop
uint32_t m_sampleRate; //!< Sample Rate of the Raw file
audio::format m_format; //!< Format of the file

View File

@@ -433,30 +433,30 @@ void audio::river::io::NodeMuxer::processMuxer(void* _dataIn1, void* _dataIn2, u
}
void audio::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";
void audio::river::io::NodeMuxer::generateDot(ememory::SharedPtr<etk::io::Interface>& _io) {
*_io << " subgraph clusterNode_" << m_uid << " {\n";
*_io << " color=blue;\n";
*_io << " label=\"[" << m_uid << "] IO::Node : " << m_name << "\";\n";
_node << " node [shape=box];\n";
*_io << " node [shape=box];\n";
// TODO : Create a structure ...
_node << " NODE_" << m_uid << "_HW_MUXER [ label=\"Muxer\\n channelMap=" << etk::toString(getInterfaceFormat().getMap()) << "\" ];\n";
*_io << " NODE_" << m_uid << "_HW_MUXER [ label=\"Muxer\\n channelMap=" << etk::toString(getInterfaceFormat().getMap()) << "\" ];\n";
etk::String nameIn;
etk::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::toString(m_process.getOutputConfig().getFormat()) << "\" ];\n";
m_process.generateDot(_io, 3, m_uid, nameIn, nameOut, false);
*_io << " node [shape=square];\n";
*_io << " NODE_" << m_uid << "_demuxer [ label=\"DEMUXER\\n format=" << etk::toString(m_process.getOutputConfig().getFormat()) << "\" ];\n";
// Link all nodes :
_node << " NODE_" << m_uid << "_HW_MUXER -> " << nameIn << ";\n";
_node << " " << nameOut << " -> NODE_" << m_uid << "_demuxer;\n";
_node << " }\n";
*_io << " NODE_" << m_uid << "_HW_MUXER -> " << nameIn << ";\n";
*_io << " " << nameOut << " -> NODE_" << m_uid << "_demuxer;\n";
*_io << " }\n";
if (m_interfaceInput2 != null) {
_node << " " << m_interfaceInput2->getDotNodeName() << " -> NODE_" << m_uid << "_HW_MUXER;\n";
*_io << " " << m_interfaceInput2->getDotNodeName() << " -> NODE_" << m_uid << "_HW_MUXER;\n";
}
if (m_interfaceInput1 != null) {
_node << " " << m_interfaceInput1->getDotNodeName() << " -> NODE_" << m_uid << "_HW_MUXER;\n";
*_io << " " << m_interfaceInput1->getDotNodeName() << " -> NODE_" << m_uid << "_HW_MUXER;\n";
}
_node << " \n";
*_io << " \n";
for (size_t iii=0; iii< m_listAvaillable.size(); ++iii) {
if (m_listAvaillable[iii].expired() == true) {
continue;
@@ -473,15 +473,15 @@ void audio::river::io::NodeMuxer::generateDot(etk::FSNode& _node) {
}
if (element != null) {
if (element->getMode() == modeInterface_input) {
element->generateDot(_node, "NODE_" + etk::toString(m_uid) + "_demuxer", isLink);
element->generateDot(_io, "NODE_" + etk::toString(m_uid) + "_demuxer", isLink);
} else if (element->getMode() == modeInterface_output) {
element->generateDot(_node, "NODE_" + etk::toString(m_uid) + "_muxer", isLink);
element->generateDot(_io, "NODE_" + etk::toString(m_uid) + "_muxer", isLink);
} else if (element->getMode() == modeInterface_feedback) {
element->generateDot(_node, "NODE_" + etk::toString(m_uid) + "_demuxer", isLink);
element->generateDot(_io, "NODE_" + etk::toString(m_uid) + "_demuxer", isLink);
} else {
}
}
}
_node << "\n";
*_io << "\n";
}

View File

@@ -56,7 +56,7 @@ namespace audio {
void processMuxer(void* _dataMic, void* _dataFB, uint32_t _nbChunk, const audio::Time& _time);
etk::Vector<uint8_t> m_data;
public:
virtual void generateDot(etk::FSNode& _node);
virtual void generateDot(ememory::SharedPtr<etk::io::Interface>& _io);
private:
void reorder(void* _output, uint32_t _nbChunk, void* _input, const etk::Vector<audio::channel>& _mapInput);
};