[DEV] Correct synchonizer
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
#include "Node.h"
|
||||
#include "NodeAEC.h"
|
||||
#include "NodeAirTAudio.h"
|
||||
#include <etk/os/FSNode.h>
|
||||
|
||||
#undef __class__
|
||||
#define __class__ "io::Manager"
|
||||
@@ -142,3 +143,24 @@ float river::io::Manager::getVolume(const std::string& _volumeName) {
|
||||
std::pair<float,float> river::io::Manager::getVolumeRange(const std::string& _volumeName) const {
|
||||
return std::make_pair<float,float>(-300, 300);
|
||||
}
|
||||
|
||||
void river::io::Manager::generateDot(const std::string& _filename) {
|
||||
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);
|
||||
return;
|
||||
}
|
||||
node << "digraph G {" << "\n";
|
||||
int32_t id = 0;
|
||||
for (auto &it2 : m_list) {
|
||||
std::shared_ptr<river::io::Node> val = it2.lock();
|
||||
if (val != nullptr) {
|
||||
val->generateDot(node);
|
||||
id++;
|
||||
}
|
||||
}
|
||||
node << "}" << "\n";
|
||||
node.fileClose();
|
||||
RIVER_INFO("Generate the DOT files: " << node << " (DONE)");
|
||||
}
|
||||
|
@@ -68,6 +68,11 @@ namespace river {
|
||||
* @example ret = getVolumeRange("MASTER"); can return something like ret=(-120.0f,0.0f)
|
||||
*/
|
||||
virtual std::pair<float,float> getVolumeRange(const std::string& _volumeName) const;
|
||||
/**
|
||||
* @brief Generate the dot file corresponding at the actif nodes.
|
||||
* @param[in] _filename Name of the file to write data.
|
||||
*/
|
||||
virtual void generateDot(const std::string& _filename);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@@ -223,3 +223,25 @@ int32_t river::io::Node::newOutput(void* _outputBuffer,
|
||||
RIVER_VERBOSE("data Output size request :" << _nbChunk << " [ END ]");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void river::io::Node::generateDot(etk::FSNode& _node) {
|
||||
_node << "subgraph cluster_0 {\n";
|
||||
// configure display:
|
||||
_node << " node [shape=record, fontname=Helvetica, fontsize=10, color=lightsteelblue1, style=filled];\n";
|
||||
//_node << " node [shape=diamond, fontname=Helvetica, fontsize=10, color=orangered, style=filled];\n"
|
||||
//_node << " node [shape=ellipse, fontname=Helvetica, fontsize=8, color=aquamarine2, style=filled];\n";
|
||||
// add elements
|
||||
int32_t idNode = 0;
|
||||
_node << " NODE_" << idNode << " [ label=\"name=" << m_name << "\" ];\n";
|
||||
// add IO
|
||||
_node << " node [shape=ellipse, fontname=Helvetica, fontsize=8, color=aquamarine2, style=filled];\n";
|
||||
int32_t id = 0;
|
||||
for (auto &it : m_list) {
|
||||
if (it != nullptr) {
|
||||
_node << " interface_" << id << " [ label=\"name=" << it->getName() << "\" ];\n";
|
||||
_node << " NODE_" << idNode << " -> interface_" << id << " [ arrowhead=\"open\"];\n";
|
||||
}
|
||||
}
|
||||
_node << "}\n";
|
||||
}
|
||||
|
||||
|
@@ -21,6 +21,7 @@
|
||||
#include <airtaudio/Interface.h>
|
||||
#include <drain/IOFormatInterface.h>
|
||||
#include <drain/Volume.h>
|
||||
#include <etk/os/FSNode.h>
|
||||
|
||||
namespace river {
|
||||
namespace io {
|
||||
@@ -99,6 +100,9 @@ namespace river {
|
||||
int32_t newOutput(void* _outputBuffer,
|
||||
uint32_t _nbChunk,
|
||||
const std::chrono::system_clock::time_point& _time);
|
||||
|
||||
public:
|
||||
virtual void generateDot(etk::FSNode& _node);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@@ -127,6 +127,7 @@ river::io::NodeAEC::NodeAEC(const std::string& _name, const std::shared_ptr<cons
|
||||
Node(_name, _config) {
|
||||
drain::IOFormatInterface interfaceFormat = getInterfaceFormat();
|
||||
drain::IOFormatInterface hardwareFormat = getHarwareFormat();
|
||||
m_sampleTime = std::chrono::nanoseconds(1000000000*int64_t(hardwareFormat.getFrequency()));
|
||||
/**
|
||||
# connect in input mode
|
||||
map-on-microphone:{
|
||||
@@ -311,20 +312,21 @@ void river::io::NodeAEC::process() {
|
||||
std::chrono::system_clock::time_point MicTime = m_bufferMicrophone.getReadTimeStamp();
|
||||
std::chrono::system_clock::time_point fbTime = m_bufferFeedBack.getReadTimeStamp();
|
||||
|
||||
// Synchronize if possible
|
||||
if (MicTime < fbTime) {
|
||||
RIVER_INFO("micTime < fbTime : Change Microphone time start " << fbTime);
|
||||
RIVER_INFO(" old time stamp=" << m_bufferMicrophone.getReadTimeStamp());
|
||||
m_bufferMicrophone.setReadPosition(fbTime);
|
||||
RIVER_INFO(" new time stamp=" << m_bufferMicrophone.getReadTimeStamp());
|
||||
if (MicTime-fbTime > m_sampleTime) {
|
||||
// Synchronize if possible
|
||||
if (MicTime < fbTime) {
|
||||
RIVER_INFO("micTime < fbTime : Change Microphone time start " << fbTime);
|
||||
RIVER_INFO(" old time stamp=" << m_bufferMicrophone.getReadTimeStamp());
|
||||
m_bufferMicrophone.setReadPosition(fbTime);
|
||||
RIVER_INFO(" new time stamp=" << m_bufferMicrophone.getReadTimeStamp());
|
||||
}
|
||||
if (MicTime > fbTime) {
|
||||
RIVER_INFO("micTime > fbTime : Change FeedBack time start " << MicTime);
|
||||
RIVER_INFO(" old time stamp=" << m_bufferFeedBack.getReadTimeStamp());
|
||||
m_bufferFeedBack.setReadPosition(MicTime);
|
||||
RIVER_INFO(" new time stamp=" << m_bufferFeedBack.getReadTimeStamp());
|
||||
}
|
||||
}
|
||||
/*
|
||||
if (MicTime > fbTime) {
|
||||
RIVER_INFO("micTime > fbTime : Change FeedBack time start " << fbTime);
|
||||
RIVER_INFO(" old time stamp=" << m_bufferFeedBack.getReadTimeStamp());
|
||||
m_bufferFeedBack.setReadPosition(MicTime);
|
||||
RIVER_INFO(" new time stamp=" << m_bufferFeedBack.getReadTimeStamp());
|
||||
}*/
|
||||
// check if enought time after synchronisation ...
|
||||
if (m_bufferMicrophone.getSize() <= 256) {
|
||||
return;
|
||||
@@ -336,7 +338,7 @@ void river::io::NodeAEC::process() {
|
||||
MicTime = m_bufferMicrophone.getReadTimeStamp();
|
||||
fbTime = m_bufferFeedBack.getReadTimeStamp();
|
||||
|
||||
if (MicTime != fbTime) {
|
||||
if (MicTime-fbTime > m_sampleTime) {
|
||||
RIVER_ERROR("Can not synchronize flow ... : " << MicTime << " != " << fbTime << " delta = " << (MicTime-fbTime).count()/1000 << " µs");
|
||||
return;
|
||||
}
|
||||
|
@@ -50,6 +50,7 @@ namespace river {
|
||||
const std::vector<audio::channel>& _map);
|
||||
river::CircularBuffer m_bufferMicrophone;
|
||||
river::CircularBuffer m_bufferFeedBack;
|
||||
std::chrono::nanoseconds m_sampleTime; //!< represent the sample time at the specify frequency.
|
||||
void process();
|
||||
void processAEC(void* _dataMic, void* _dataFB, uint32_t _nbChunk, const std::chrono::system_clock::time_point& _time);
|
||||
};
|
||||
|
Reference in New Issue
Block a user