mini buffer

git-svn-id: svn://elaine/murooma/trunk@142 d8a302eb-03bc-478d-80e4-98257eca68ef
This commit is contained in:
(no author) 2014-08-04 20:38:59 +00:00
parent d62059aa22
commit ec2fd4d930
2 changed files with 8 additions and 2 deletions

View file

@ -7,6 +7,7 @@ Stream::Stream() : sleep(0), median(0), shortMedian(0), lastUpdate(0)
{ {
pBuffer = new DoubleBuffer<int>(15000 / PLAYER_CHUNK_MS); pBuffer = new DoubleBuffer<int>(15000 / PLAYER_CHUNK_MS);
pShortBuffer = new DoubleBuffer<int>(5000 / PLAYER_CHUNK_MS); pShortBuffer = new DoubleBuffer<int>(5000 / PLAYER_CHUNK_MS);
pMiniBuffer = new DoubleBuffer<int>(10);
pLock = new std::unique_lock<std::mutex>(mtx); pLock = new std::unique_lock<std::mutex>(mtx);
bufferMs = 500; bufferMs = 500;
} }
@ -99,6 +100,7 @@ void Stream::getChunk(short* outputBuffer, double outputBufferDacTime, unsigned
if (sleep != 0) if (sleep != 0)
{ {
pBuffer->clear(); pBuffer->clear();
pMiniBuffer->clear();
pShortBuffer->clear(); pShortBuffer->clear();
if (sleep < 0) if (sleep < 0)
{ {
@ -127,12 +129,14 @@ void Stream::getChunk(short* outputBuffer, double outputBufferDacTime, unsigned
if (pBuffer->full() && (abs(median) <= PLAYER_CHUNK_MS) && (abs(median) > 1)) if (pBuffer->full() && (abs(median) <= PLAYER_CHUNK_MS) && (abs(median) > 1))
{ {
correction = shortMedian; correction = shortMedian;
pMiniBuffer->clear();
pBuffer->clear(); pBuffer->clear();
pShortBuffer->clear(); pShortBuffer->clear();
} }
else if (pShortBuffer->full() && (abs(shortMedian) <= PLAYER_CHUNK_MS) && (abs(shortMedian) > 3)) else if (pShortBuffer->full() && (abs(shortMedian) <= PLAYER_CHUNK_MS) && (abs(shortMedian) > 3))
{ {
correction = shortMedian; correction = shortMedian;
pMiniBuffer->clear();
pBuffer->clear(); pBuffer->clear();
pShortBuffer->clear(); pShortBuffer->clear();
} }
@ -146,15 +150,16 @@ void Stream::getChunk(short* outputBuffer, double outputBufferDacTime, unsigned
sleep = shortMedian; sleep = shortMedian;
std::cerr << "Sleep: " << sleep << "\n"; std::cerr << "Sleep: " << sleep << "\n";
} }
else if (abs(age) > 100) else if (pMiniBuffer->full() && (abs(age) > 50) && (abs(pMiniBuffer->median()) > 50))
{ {
sleep = age; sleep = pMiniBuffer->median();
std::cerr << "Sleep: " << sleep << "\n"; std::cerr << "Sleep: " << sleep << "\n";
} }
// std::cerr << "Chunk: " << age << "\t" << outputBufferDacTime*1000 << "\n"; // std::cerr << "Chunk: " << age << "\t" << outputBufferDacTime*1000 << "\n";
pBuffer->add(age); pBuffer->add(age);
pMiniBuffer->add(age);
pShortBuffer->add(age); pShortBuffer->add(age);
time_t now = time(NULL); time_t now = time(NULL);
if (now != lastUpdate) if (now != lastUpdate)

View file

@ -31,6 +31,7 @@ private:
std::mutex mutex; std::mutex mutex;
std::unique_lock<std::mutex>* pLock; std::unique_lock<std::mutex>* pLock;
std::condition_variable cv; std::condition_variable cv;
DoubleBuffer<int>* pMiniBuffer;
DoubleBuffer<int>* pBuffer; DoubleBuffer<int>* pBuffer;
DoubleBuffer<int>* pShortBuffer; DoubleBuffer<int>* pShortBuffer;