diff --git a/client.cpp b/client.cpp index 5320a6de..cd6572ce 100644 --- a/client.cpp +++ b/client.cpp @@ -21,7 +21,7 @@ #include "doubleBuffer.h" -DoubleBuffer buffer(5000 / MS); +DoubleBuffer buffer(60000 / MS); std::deque chunks; std::deque timeDiffs; std::mutex mtx; @@ -187,7 +187,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, mutex.unlock(); age = getAge(*chunk) + timeInfo->outputBufferDacTime*1000; int median = buffer.median(); - std::cerr << "age: " << getAge(*chunk) << "\t" << age << "\t" << median << "\t" << timeInfo->outputBufferDacTime*1000 << "\n"; + std::cerr << "age: " << getAge(*chunk) << "\t" << age << "\t" << median << "\t" << buffer.size() << "\t" << timeInfo->outputBufferDacTime*1000 << "\n"; if (age > bufferMs + 2*MS) { @@ -204,6 +204,22 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, usleep(10 * 1000); break; } + else if (buffer.full() && (median > bufferMs + MS)) + { + std::cerr << "median > bufferMs + MS (" << median << " > " << bufferMs + MS << "), dropping chunk\n"; + buffer.clear(); + chunks->pop_front(); + delete chunk; + } + else if (buffer.full() && (median + MS < bufferMs)) + { + std::cerr << "median + MS < bufferMs (" << median + MS << " < " << bufferMs << "), playing silence\n"; + buffer.clear(); + chunk = new Chunk(); + memset(&(chunk->payload[0]), 0, SIZE); + usleep(10 * 1000); + break; + } else { buffer.add(age); diff --git a/doubleBuffer.h b/doubleBuffer.h index dd6a7c5c..a44ca3be 100644 --- a/doubleBuffer.h +++ b/doubleBuffer.h @@ -8,18 +8,18 @@ template class DoubleBuffer { public: - DoubleBuffer(size_t bufferSize) : size(bufferSize) + DoubleBuffer(size_t size) : bufferSize(size) { } void add(const T& element) { buffer.push_back(element); - if (buffer.size() > size) + if (buffer.size() > bufferSize) buffer.pop_front(); } - T median() + T median() const { if (buffer.empty()) return 0; @@ -28,8 +28,23 @@ public: return tmpBuffer[tmpBuffer.size() / 2]; } + bool full() const + { + return (buffer.size() == bufferSize); + } + + void clear() + { + buffer.clear(); + } + + size_t size() const + { + return buffer.size(); + } + private: - size_t size; + size_t bufferSize; std::deque buffer; };