From 90785a87da575c8a69d6df9f73fd56a3aea11c7a Mon Sep 17 00:00:00 2001 From: badaix Date: Wed, 11 Mar 2020 22:02:35 +0100 Subject: [PATCH] Fix "last seen" timestamp --- client/stream.hpp | 18 ++++++++++++++++++ client/time_provider.cpp | 2 +- common/message/message.hpp | 3 +-- common/time_defs.hpp | 21 ++++++++++++--------- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/client/stream.hpp b/client/stream.hpp index 58dd6d3c..1e8ce688 100644 --- a/client/stream.hpp +++ b/client/stream.hpp @@ -59,8 +59,26 @@ public: bool waitForChunk(const std::chrono::milliseconds& timeout) const; private: + /// Request an audio chunk from the front of the stream. + /// @param outputBuffer will be filled with the chunk + /// @param frames the number of requested frames + /// @return the timepoint when this chunk should be audible chronos::time_point_clk getNextPlayerChunk(void* outputBuffer, uint32_t frames); + + /// Request an audio chunk from the front of the stream with a tempo adaption + /// @param outputBuffer will be filled with the chunk + /// @param frames the number of requested frames + /// @param framesCorrection number of frames that should be added or removed. + /// The function will allways return "frames" frames, but will fit "frames + framesCorrection" frames into "frames" + /// so if frames is 100 and framesCorrection is 2, 102 frames will be read from the stream and 2 frames will be removed. + /// This makes us "fast-forward" by 2 frames, or if framesCorrection is -3, 97 frames will be read from the stream and + /// filled with 3 frames (simply by dublication), this makes us effectively slower + /// @return the timepoint when this chunk should be audible chronos::time_point_clk getNextPlayerChunk(void* outputBuffer, uint32_t frames, int32_t framesCorrection); + + /// Request a silent audio chunk + /// @param outputBuffer will be filled with the chunk + /// @param frames the number of requested frames void getSilentPlayerChunk(void* outputBuffer, uint32_t frames) const; void updateBuffers(int age); diff --git a/client/time_provider.cpp b/client/time_provider.cpp index 46326411..41658e5d 100644 --- a/client/time_provider.cpp +++ b/client/time_provider.cpp @@ -39,7 +39,7 @@ void TimeProvider::setDiffToServer(double ms) { static int32_t lastTimeSync = 0; timeval now; - chronos::systemtimeofday(&now); + chronos::steadytimeofday(&now); /// clear diffBuffer if last update is older than a minute if (!diffBuffer_.empty() && (std::abs(now.tv_sec - lastTimeSync) > 60)) diff --git a/common/message/message.hpp b/common/message/message.hpp index 5f960186..3144dba8 100644 --- a/common/message/message.hpp +++ b/common/message/message.hpp @@ -64,13 +64,12 @@ enum message_type }; - struct tv { tv() { timeval t; - chronos::systemtimeofday(&t); + chronos::steadytimeofday(&t); sec = t.tv_sec; usec = t.tv_usec; } diff --git a/common/time_defs.hpp b/common/time_defs.hpp index d2936955..689d462d 100644 --- a/common/time_defs.hpp +++ b/common/time_defs.hpp @@ -29,13 +29,12 @@ namespace chronos { -typedef std::chrono::steady_clock clk; -// typedef std::chrono::system_clock clk; -typedef std::chrono::time_point time_point_clk; -typedef std::chrono::seconds sec; -typedef std::chrono::milliseconds msec; -typedef std::chrono::microseconds usec; -typedef std::chrono::nanoseconds nsec; +using clk = std::chrono::steady_clock; +using time_point_clk = std::chrono::time_point; +using sec = std::chrono::seconds; +using msec = std::chrono::milliseconds; +using usec = std::chrono::microseconds; +using nsec = std::chrono::nanoseconds; template inline static void timeofday(struct timeval* tv) @@ -46,10 +45,14 @@ inline static void timeofday(struct timeval* tv) tv->tv_usec = microsecs.count() % 1000000; } +inline static void steadytimeofday(struct timeval* tv) +{ + timeofday(tv); +} + inline static void systemtimeofday(struct timeval* tv) { - // gettimeofday(tv, nullptr); - timeofday(tv); + timeofday(tv); } template