correction

git-svn-id: svn://elaine/murooma/trunk@162 d8a302eb-03bc-478d-80e4-98257eca68ef
This commit is contained in:
(no author) 2014-08-09 09:21:59 +00:00
parent 8a43531c77
commit 0b79e540a9
2 changed files with 43 additions and 26 deletions

View file

@ -7,8 +7,8 @@ using namespace std;
Stream::Stream() : sleep(0), median(0), shortMedian(0), lastUpdate(0) Stream::Stream() : sleep(0), median(0), shortMedian(0), lastUpdate(0)
{ {
pBuffer = new DoubleBuffer<int>(30000 / PLAYER_CHUNK_MS); pBuffer = new DoubleBuffer<int>(1000);
pShortBuffer = new DoubleBuffer<int>(5000 / PLAYER_CHUNK_MS); pShortBuffer = new DoubleBuffer<int>(200);
pMiniBuffer = new DoubleBuffer<int>(10); pMiniBuffer = new DoubleBuffer<int>(10);
bufferMs = 500; bufferMs = 500;
} }
@ -100,18 +100,20 @@ void Stream::getPlayerChunk(short* outputBuffer, double outputBufferDacTime, uns
{ {
//cout << "framesPerBuffer: " << framesPerBuffer << "\tms: " << framesPerBuffer*2 / PLAYER_CHUNK_MS_SIZE << "\t" << PLAYER_CHUNK_SIZE << "\n"; //cout << "framesPerBuffer: " << framesPerBuffer << "\tms: " << framesPerBuffer*2 / PLAYER_CHUNK_MS_SIZE << "\t" << PLAYER_CHUNK_SIZE << "\n";
int msBuffer = floor(framesPerBuffer*2 / PLAYER_CHUNK_MS_SIZE); int msBuffer = floor(framesPerBuffer*2 / PLAYER_CHUNK_MS_SIZE);
int correction = 0;
if (sleep != 0) if (sleep != 0)
{ {
resetBuffers(); resetBuffers();
if (sleep < 0) if (sleep < -10)
{ {
// std::cerr << "Sleep: " << sleep << "\n"; // std::cerr << "Sleep: " << sleep << "\n";
sleep += PLAYER_CHUNK_MS; sleep += msBuffer;
if (sleep > -PLAYER_CHUNK_MS/2) if (sleep > -msBuffer/2)
sleep = 0; sleep = 0;
getSilentPlayerChunk(outputBuffer, framesPerBuffer); getSilentPlayerChunk(outputBuffer, framesPerBuffer);
return;
} }
else else if (sleep > 10)
{ {
// for (size_t i=0; i<chunks.size(); ++i) // for (size_t i=0; i<chunks.size(); ++i)
// std::cerr << "Chunk " << i << ": " << chunks[i]->getAge() - bufferMs << "\n"; // std::cerr << "Chunk " << i << ": " << chunks[i]->getAge() - bufferMs << "\n";
@ -122,20 +124,21 @@ void Stream::getPlayerChunk(short* outputBuffer, double outputBufferDacTime, uns
break; break;
} }
sleep = 0; sleep = 0;
}
return; return;
} }
else if (sleep < 0)
int correction(0);
if ((pBuffer->full() && (abs(median) <= msBuffer) && (abs(median) > 1)) ||
(pShortBuffer->full() && (abs(shortMedian) <= msBuffer) && (abs(shortMedian) > max(5, msBuffer))))
{ {
correction = median; ++sleep;
resetBuffers(); correction = -1;
} }
//correction = 0; else if (sleep > 0)
//if (time(NULL) != lastUpdate) {
// correction = 2; --sleep;
correction = 1;
}
}
int age = Chunk::getAge(getNextPlayerChunk(outputBuffer, framesPerBuffer, correction)) - bufferMs;// + outputBufferDacTime*1000; int age = Chunk::getAge(getNextPlayerChunk(outputBuffer, framesPerBuffer, correction)) - bufferMs;// + outputBufferDacTime*1000;
// cout << age << "\t"; // cout << age << "\t";
@ -143,16 +146,29 @@ void Stream::getPlayerChunk(short* outputBuffer, double outputBufferDacTime, uns
age += outputBufferDacTime*1000; age += outputBufferDacTime*1000;
// cout << age << "\t" << outputBufferDacTime*1000 << "\n"; // cout << age << "\t" << outputBufferDacTime*1000 << "\n";
if (pShortBuffer->full() && (abs(shortMedian) > max(10, msBuffer)))
if (sleep == 0)
{
if (pBuffer->full() && (abs(median) <= 10) && (abs(median) > 1))
{
sleep = median;
}
else if (pShortBuffer->full() && (abs(shortMedian) <= 10) && (abs(shortMedian) > 5))
{
sleep = shortMedian;
}
if (pShortBuffer->full() && (abs(shortMedian) > 10))
{ {
sleep = shortMedian; sleep = shortMedian;
std::cerr << "Sleep: " << sleep << "\n";
} }
else if (pMiniBuffer->full() && (abs(age) > 50) && (abs(pMiniBuffer->mean()) > 50)) else if (pMiniBuffer->full() && (abs(age) > 50) && (abs(pMiniBuffer->mean()) > 50))
{ {
sleep = pMiniBuffer->mean(); sleep = pMiniBuffer->mean();
std::cerr << "Sleep: " << sleep << "\n";
} }
}
if (sleep != 0)
std::cerr << "Sleep: " << sleep << "\n";
// std::cerr << "Chunk: " << age << "\t" << outputBufferDacTime*1000 << "\n"; // std::cerr << "Chunk: " << age << "\t" << outputBufferDacTime*1000 << "\n";

View file

@ -27,7 +27,8 @@ private:
void updateBuffers(int age); void updateBuffers(int age);
void resetBuffers(); void resetBuffers();
int sleep; float sleep;
// int correction;
Queue<std::shared_ptr<Chunk>> chunks; Queue<std::shared_ptr<Chunk>> chunks;
DoubleBuffer<int>* pMiniBuffer; DoubleBuffer<int>* pMiniBuffer;
DoubleBuffer<int>* pBuffer; DoubleBuffer<int>* pBuffer;