diff --git a/client.cpp b/client.cpp index b1ada289..5320a6de 100644 --- a/client.cpp +++ b/client.cpp @@ -18,8 +18,10 @@ #include #include #include "chunk.h" +#include "doubleBuffer.h" +DoubleBuffer buffer(5000 / MS); std::deque chunks; std::deque timeDiffs; std::mutex mtx; @@ -184,7 +186,9 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, // std::cerr << "Chunks: " << chunks->size() << "\n"; mutex.unlock(); age = getAge(*chunk) + timeInfo->outputBufferDacTime*1000; - std::cerr << "age: " << getAge(*chunk) << "\t" << age << "\t" << timeInfo->outputBufferDacTime*1000 << "\n"; + int median = buffer.median(); + std::cerr << "age: " << getAge(*chunk) << "\t" << age << "\t" << median << "\t" << timeInfo->outputBufferDacTime*1000 << "\n"; + if (age > bufferMs + 2*MS) { chunks->pop_front(); @@ -202,6 +206,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, } else { + buffer.add(age); chunks->pop_front(); break; } diff --git a/doubleBuffer.h b/doubleBuffer.h new file mode 100644 index 00000000..dd6a7c5c --- /dev/null +++ b/doubleBuffer.h @@ -0,0 +1,39 @@ +#ifndef DOUBLE_BUFFER_H +#define DOUBLE_BUFFER_H + +#include +#include + +template +class DoubleBuffer +{ +public: + DoubleBuffer(size_t bufferSize) : size(bufferSize) + { + } + + void add(const T& element) + { + buffer.push_back(element); + if (buffer.size() > size) + buffer.pop_front(); + } + + T median() + { + if (buffer.empty()) + return 0; + std::deque tmpBuffer(buffer.begin(), buffer.end()); + std::sort(tmpBuffer.begin(), tmpBuffer.end()); + return tmpBuffer[tmpBuffer.size() / 2]; + } + +private: + size_t size; + std::deque buffer; + +}; + + + +#endif