diff --git a/client/controller.cpp b/client/controller.cpp index e2c63249..822aee00 100644 --- a/client/controller.cpp +++ b/client/controller.cpp @@ -48,10 +48,11 @@ void Controller::onMessageReceived(ClientConnection* connection, const BaseMessa } -void Controller::start(const PcmDevice& pcmDevice, const std::string& _ip, size_t _port) +void Controller::start(const PcmDevice& pcmDevice, const std::string& _ip, size_t _port, size_t latency) { ip = _ip; pcmDevice_ = pcmDevice; + latency_ = latency; clientConnection = new ClientConnection(this, ip, _port); controllerThread = new thread(&Controller::worker, this); } @@ -107,7 +108,7 @@ void Controller::worker() cout << "diff to server [ms]: " << TimeProvider::getInstance().getDiffToServer().count() << "\n"; stream = new Stream(*sampleFormat); - stream->setBufferLen(serverSettings->bufferMs); + stream->setBufferLen(serverSettings->bufferMs - latency_); Player player(pcmDevice_, stream); player.start(); diff --git a/client/controller.h b/client/controller.h index 1f63d577..8468d1ff 100644 --- a/client/controller.h +++ b/client/controller.h @@ -14,7 +14,7 @@ class Controller : public MessageReceiver { public: Controller(); - void start(const PcmDevice& pcmDevice, const std::string& _ip, size_t _port); + void start(const PcmDevice& pcmDevice, const std::string& _ip, size_t _port, size_t latency); void stop(); virtual void onMessageReceived(ClientConnection* connection, const BaseMessage& baseMessage, char* buffer); virtual void onException(ClientConnection* connection, const std::exception& exception); @@ -29,6 +29,7 @@ private: std::shared_ptr sampleFormat; Decoder* decoder; PcmDevice pcmDevice_; + size_t latency_; }; diff --git a/client/snapClient.cpp b/client/snapClient.cpp index a9eaeb3a..559a07b0 100644 --- a/client/snapClient.cpp +++ b/client/snapClient.cpp @@ -50,6 +50,7 @@ int main (int argc, char *argv[]) string ip; // int bufferMs; size_t port; + size_t latency; bool runAsDaemon; bool listPcmDevices; @@ -62,6 +63,7 @@ int main (int argc, char *argv[]) ("soundcard,s", po::value(&soundcard)->default_value("default"), "index or name of the soundcard") // ("buffer,b", po::value(&bufferMs)->default_value(300), "buffer size [ms]") ("daemon,d", po::bool_switch(&runAsDaemon)->default_value(false), "daemonize") + ("latency", po::value(&latency)->default_value(0), "latency") ; po::variables_map vm; @@ -101,7 +103,7 @@ int main (int argc, char *argv[]) Controller controller; - controller.start(pcmDevice, ip, port); + controller.start(pcmDevice, ip, port, latency); while(true) usleep(10000); diff --git a/client/stream.cpp b/client/stream.cpp index 89b8a96a..1ee22efd 100644 --- a/client/stream.cpp +++ b/client/stream.cpp @@ -17,6 +17,7 @@ Stream::Stream(const SampleFormat& sampleFormat) : format(format_), format_(samp bufferMs = msec(500); playedSamples = 0; + playedSamplesTime = time_point_hrc::min(); /* 48000 x ------- = ----- @@ -173,13 +174,17 @@ void Stream::resetBuffers() bool Stream::getPlayerChunk(void* outputBuffer, const chronos::usec& outputBufferDacTime, unsigned long framesPerBuffer) { -/*if (playedSamples == 0) +/*if (playedSamplesTime == time_point_hrc::min()) playedSamplesTime = chronos::hrc::now() + outputBufferDacTime; -playedSamples += framesPerBuffer; -chronos::msec since = std::chrono::duration_cast(chronos::hrc::now() + outputBufferDacTime - playedSamplesTime); -if (since.count() > 0) - cout << (double)playedSamples / (double)since.count() << "\n"; +else +{ + playedSamples += framesPerBuffer; + chronos::msec since = std::chrono::duration_cast(chronos::hrc::now() + outputBufferDacTime - playedSamplesTime); + if (since.count() > 0) + cout << (double)playedSamples / (double)since.count() << "\n"; +} */ + if (outputBufferDacTime > bufferMs) return false;