[DEV] add write callback mode and correct write mode

This commit is contained in:
Edouard DUPIN 2015-01-27 22:45:30 +01:00
parent f012027d5b
commit 6ab88e627c
2 changed files with 15 additions and 12 deletions

View File

@ -31,14 +31,12 @@ bool airtalgo::EndPointWrite::process(std::chrono::system_clock::time_point& _ti
//AIRTALGO_INFO(" nb Sample in buffer : " << m_tmpData.size());
if (m_function != nullptr) {
if (m_tmpData.size() <= 20000) {
m_function(_time, _inputNbChunk, m_output.getMap());
m_function(_time, _inputNbChunk, m_output.getMap(), m_output.getFormat());
}
}
// resize output buffer:
//AIRTALGO_INFO(" resize : " << (int32_t)m_formatSize << "*" << (int32_t)_inputNbChunk << "*" << (int32_t)m_outputMap.size());
m_outputData.resize(m_formatSize*_inputNbChunk*m_output.getMap().size());
// clear buffer
memset(&m_outputData[0], 0, m_outputData.size());
m_outputData.resize(m_formatSize*_inputNbChunk*m_output.getMap().size(), 0);
// set output pointer:
_outputNbChunk = m_outputData.size()/(m_formatSize*m_output.getMap().size());
_output = &m_outputData[0];
@ -51,9 +49,9 @@ bool airtalgo::EndPointWrite::process(std::chrono::system_clock::time_point& _ti
}
AIRTALGO_INFO("Write " << _outputNbChunk << " chunks");
// check if we have enought data:
int32_t nbChunkToCopy = std::min(_inputNbChunk, m_outputData.size()/m_output.getMap().size());
int32_t nbChunkToCopy = std::min(_inputNbChunk, m_tmpData.size()/(m_output.getMap().size()*m_formatSize));
AIRTALGO_INFO(" " << nbChunkToCopy << " chunks ==> " << nbChunkToCopy*m_output.getMap().size()*m_formatSize << " Byte");
AIRTALGO_INFO(" " << nbChunkToCopy << " chunks ==> " << nbChunkToCopy*m_output.getMap().size()*m_formatSize << " Byte sizeBuffer=" << m_tmpData.size());
// copy data to the output:
memcpy(_output, &m_tmpData[0], nbChunkToCopy*m_output.getMap().size()*m_formatSize);
// remove old data:
@ -64,9 +62,11 @@ bool airtalgo::EndPointWrite::process(std::chrono::system_clock::time_point& _ti
void airtalgo::EndPointWrite::write(const void* _value, size_t _nbChunk) {
std::unique_lock<std::mutex> lock(m_mutex);
AIRTALGO_INFO("[ASYNC] Get data : " << _nbChunk << " chunks ==> " << _nbChunk*m_output.getMap().size() << " samples formatSize=" << int32_t(m_formatSize));
AIRTALGO_INFO("[ASYNC] Get data : " << _nbChunk << " chunks"
<< " ==> " << _nbChunk*m_output.getMap().size() << " samples"
<< " formatSize=" << int32_t(m_formatSize));
const int8_t* value = static_cast<const int8_t*>(_value);
for (size_t iii=0; iii<_nbChunk*m_formatSize; ++iii) {
for (size_t iii=0; iii<_nbChunk*m_formatSize*m_output.getMap().size(); ++iii) {
m_tmpData.push_back(*value++);
}
}

View File

@ -12,11 +12,14 @@
#include <functional>
namespace airtalgo{
typedef std::function<void (const std::chrono::system_clock::time_point& _playTime, const size_t& _nbChunk, const std::vector<airtalgo::channel>& _map)> writeNeedDataFunction_int16_t;
typedef std::function<void (const std::chrono::system_clock::time_point& _playTime,
const size_t& _nbChunk,
const std::vector<airtalgo::channel>& _map,
enum airtalgo::format _type)> needDataFunctionWrite;
class EndPointWrite : public EndPoint {
private:
std::vector<int16_t> m_tmpData;
writeNeedDataFunction_int16_t m_function;
std::vector<int8_t> m_tmpData;
needDataFunctionWrite m_function;
std::mutex m_mutex;
public:
/**
@ -34,7 +37,7 @@ namespace airtalgo{
void*& _output,
size_t& _outputNbChunk);
virtual void write(const void* _value, size_t _nbChunk);
virtual void setCallback(writeNeedDataFunction_int16_t _function) {
virtual void setCallback(needDataFunctionWrite _function) {
m_function = _function;
}
};