diff --git a/client/stream.cpp b/client/stream.cpp index 6f4fdd1e..18bf5e6e 100644 --- a/client/stream.cpp +++ b/client/stream.cpp @@ -220,6 +220,7 @@ if (since.count() > 0) while (sleep > chunk->duration()) { cout << "sleep > chunk->getDuration(): " << sleep.count() << " > " << chunk->duration().count() << ", chunks: " << chunks.size() << ", out: " << outputBufferDacTime.count() << ", needed: " << bufferDuration.count() << "\n"; + sleep = std::chrono::duration_cast(TimeProvider::serverNow() - chunk->start() - bufferMs + outputBufferDacTime); if (!chunks.try_pop(chunk, outputBufferDacTime)) { cout << "no chunks available\n"; @@ -227,8 +228,6 @@ if (since.count() > 0) sleep = chronos::usec(0); return false; } - - sleep = std::chrono::duration_cast(TimeProvider::serverNow() - chunk->start() - bufferMs + outputBufferDacTime); } } @@ -260,7 +259,7 @@ if (since.count() > 0) age = std::chrono::duration_cast(TimeProvider::serverNow() - getNextPlayerChunk(outputBuffer, outputBufferDacTime, framesPerBuffer, framesCorrection) - bufferMs + outputBufferDacTime); -// setRealSampleRate(format.rate); + setRealSampleRate(format.rate); if (sleep.count() == 0) { if (buffer.full()) @@ -279,11 +278,22 @@ if (since.count() > 0) setRealSampleRate(format.rate + format.rate / 1000); } */ } - else if (shortBuffer.full() && (chronos::usec(abs(shortMedian)) > chronos::msec(5))) + else if (shortBuffer.full()) { - cout << "pShortBuffer->full() && (abs(shortMedian) > 5): " << shortMedian << "\n"; - sleep = chronos::usec(shortMedian); - } + if (chronos::usec(abs(shortMedian)) > chronos::msec(5)) + { + cout << "pShortBuffer->full() && (abs(shortMedian) > 5): " << shortMedian << "\n"; + sleep = chronos::usec(shortMedian); + } + if (chronos::usec(shortMedian) > chronos::usec(100)) + setRealSampleRate(format.rate * 0.9999); + else if (chronos::usec(shortMedian) < -chronos::usec(100)) + setRealSampleRate(format.rate * 1.0001); +/* else + { + setRealSampleRate(format.rate + -shortMedian / 100); + } +*/ } else if (miniBuffer.full() && (chronos::usec(abs(miniBuffer.median())) > chronos::msec(50))) { cout << "pMiniBuffer->full() && (abs(pMiniBuffer->mean()) > 50): " << miniBuffer.median() << "\n"; diff --git a/client/timeProvider.cpp b/client/timeProvider.cpp index 53b2dd07..4ad121f1 100644 --- a/client/timeProvider.cpp +++ b/client/timeProvider.cpp @@ -3,7 +3,7 @@ TimeProvider::TimeProvider() : diffToServer(0) { - diffBuffer.setSize(100); + diffBuffer.setSize(200); }