From 1f6bb07dd6391165f1f58c7f1e2c3f531d548981 Mon Sep 17 00:00:00 2001 From: Marcus Weseloh Date: Tue, 18 Jun 2024 15:22:55 +0200 Subject: [PATCH] Use standard timestamping for JackStream chunks --- server/streamreader/jack_stream.cpp | 20 ++++++++------------ server/streamreader/jack_stream.hpp | 4 ++-- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/server/streamreader/jack_stream.cpp b/server/streamreader/jack_stream.cpp index e211d698..9e9b059a 100644 --- a/server/streamreader/jack_stream.cpp +++ b/server/streamreader/jack_stream.cpp @@ -130,7 +130,7 @@ void wait(boost::asio::steady_timer& timer, const std::chrono::duration(now.time_since_epoch()).count() - jackTime; - - LOG(DEBUG, LOG_TAG) << name_ << ": Jack server time adjustment is " << jackTimeAdjust_ << "\n"; - jack_set_process_callback( client_, [](jack_nframes_t nframes, void* arg) { return static_cast(arg)->readJackBuffers(nframes); }, this); jack_on_shutdown( @@ -352,21 +347,22 @@ int JackStream::readJackBuffers(jack_nframes_t nframes) if (silence_ > idle_threshold_) { setState(ReaderState::kIdle); + first_ = true; } } else { silence_ = 0ms; setState(ReaderState::kPlaying); + if (first_) + { + first_ = false; + tvEncodedChunk_ = std::chrono::steady_clock::now(); + } } if ((state_ == ReaderState::kPlaying) || ((state_ == ReaderState::kIdle) && send_silence_)) { - // We use the (adjusted) Jack server time as chunk time, that way all Jack - // streams will play simultaneously (hopefully!) - tvEncodedChunk_ = std::chrono::time_point(static_cast(current_usecs + jackTimeAdjust_)); - - // TODO: should we chunkRead() in a separate thread? chunkRead(*chunk_); } diff --git a/server/streamreader/jack_stream.hpp b/server/streamreader/jack_stream.hpp index 8fbd2881..66ff6e56 100644 --- a/server/streamreader/jack_stream.hpp +++ b/server/streamreader/jack_stream.hpp @@ -65,8 +65,6 @@ protected: jack_client_t* client_; std::vector ports_; - jack_nframes_t jackConnectFrames_; - jack_time_t jackTimeAdjust_; SampleFormat jackSampleFormat_; std::string autoConnectRegex_; @@ -82,6 +80,8 @@ protected: bool send_silence_; /// silence duration before switching the stream to idle std::chrono::milliseconds idle_threshold_; + /// first read after idle => reset chunk timestamp + bool first_; }; } // namespace streamreader