buffering

git-svn-id: svn://elaine/murooma/trunk@35 d8a302eb-03bc-478d-80e4-98257eca68ef
This commit is contained in:
(no author) 2014-06-29 11:21:04 +00:00
parent 07d2ef5794
commit 4d99cfd70c
2 changed files with 37 additions and 6 deletions

View file

@ -21,7 +21,7 @@
#include "doubleBuffer.h" #include "doubleBuffer.h"
DoubleBuffer<int> buffer(5000 / MS); DoubleBuffer<int> buffer(60000 / MS);
std::deque<Chunk*> chunks; std::deque<Chunk*> chunks;
std::deque<int> timeDiffs; std::deque<int> timeDiffs;
std::mutex mtx; std::mutex mtx;
@ -187,7 +187,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer,
mutex.unlock(); mutex.unlock();
age = getAge(*chunk) + timeInfo->outputBufferDacTime*1000; age = getAge(*chunk) + timeInfo->outputBufferDacTime*1000;
int median = buffer.median(); 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) if (age > bufferMs + 2*MS)
{ {
@ -204,6 +204,22 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer,
usleep(10 * 1000); usleep(10 * 1000);
break; 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 else
{ {
buffer.add(age); buffer.add(age);

View file

@ -8,18 +8,18 @@ template <class T>
class DoubleBuffer class DoubleBuffer
{ {
public: public:
DoubleBuffer(size_t bufferSize) : size(bufferSize) DoubleBuffer(size_t size) : bufferSize(size)
{ {
} }
void add(const T& element) void add(const T& element)
{ {
buffer.push_back(element); buffer.push_back(element);
if (buffer.size() > size) if (buffer.size() > bufferSize)
buffer.pop_front(); buffer.pop_front();
} }
T median() T median() const
{ {
if (buffer.empty()) if (buffer.empty())
return 0; return 0;
@ -28,8 +28,23 @@ public:
return tmpBuffer[tmpBuffer.size() / 2]; return tmpBuffer[tmpBuffer.size() / 2];
} }
bool full() const
{
return (buffer.size() == bufferSize);
}
void clear()
{
buffer.clear();
}
size_t size() const
{
return buffer.size();
}
private: private:
size_t size; size_t bufferSize;
std::deque<T> buffer; std::deque<T> buffer;
}; };