mirror of
https://github.com/badaix/snapcast.git
synced 2025-05-15 10:06:43 +02:00
correction
git-svn-id: svn://elaine/murooma/trunk@162 d8a302eb-03bc-478d-80e4-98257eca68ef
This commit is contained in:
parent
8a43531c77
commit
0b79e540a9
2 changed files with 43 additions and 26 deletions
66
stream.cpp
66
stream.cpp
|
@ -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;
|
||||||
|
}
|
||||||
|
else if (sleep < 0)
|
||||||
|
{
|
||||||
|
++sleep;
|
||||||
|
correction = -1;
|
||||||
|
}
|
||||||
|
else if (sleep > 0)
|
||||||
|
{
|
||||||
|
--sleep;
|
||||||
|
correction = 1;
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int correction(0);
|
|
||||||
if ((pBuffer->full() && (abs(median) <= msBuffer) && (abs(median) > 1)) ||
|
|
||||||
(pShortBuffer->full() && (abs(shortMedian) <= msBuffer) && (abs(shortMedian) > max(5, msBuffer))))
|
|
||||||
{
|
|
||||||
correction = median;
|
|
||||||
resetBuffers();
|
|
||||||
}
|
|
||||||
//correction = 0;
|
|
||||||
//if (time(NULL) != lastUpdate)
|
|
||||||
// correction = 2;
|
|
||||||
|
|
||||||
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,17 +146,30 @@ 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)
|
||||||
{
|
{
|
||||||
sleep = shortMedian;
|
if (pBuffer->full() && (abs(median) <= 10) && (abs(median) > 1))
|
||||||
std::cerr << "Sleep: " << sleep << "\n";
|
{
|
||||||
}
|
sleep = median;
|
||||||
else if (pMiniBuffer->full() && (abs(age) > 50) && (abs(pMiniBuffer->mean()) > 50))
|
}
|
||||||
{
|
else if (pShortBuffer->full() && (abs(shortMedian) <= 10) && (abs(shortMedian) > 5))
|
||||||
sleep = pMiniBuffer->mean();
|
{
|
||||||
std::cerr << "Sleep: " << sleep << "\n";
|
sleep = shortMedian;
|
||||||
|
}
|
||||||
|
if (pShortBuffer->full() && (abs(shortMedian) > 10))
|
||||||
|
{
|
||||||
|
sleep = shortMedian;
|
||||||
|
}
|
||||||
|
else if (pMiniBuffer->full() && (abs(age) > 50) && (abs(pMiniBuffer->mean()) > 50))
|
||||||
|
{
|
||||||
|
sleep = pMiniBuffer->mean();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sleep != 0)
|
||||||
|
std::cerr << "Sleep: " << sleep << "\n";
|
||||||
|
|
||||||
|
|
||||||
// std::cerr << "Chunk: " << age << "\t" << outputBufferDacTime*1000 << "\n";
|
// std::cerr << "Chunk: " << age << "\t" << outputBufferDacTime*1000 << "\n";
|
||||||
updateBuffers(age);
|
updateBuffers(age);
|
||||||
|
|
3
stream.h
3
stream.h
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue