mirror of
https://github.com/badaix/snapcast.git
synced 2025-07-14 15:17:51 +02:00
Use standard timestamping for JackStream chunks
This commit is contained in:
parent
da6041dcfe
commit
1f6bb07dd6
2 changed files with 10 additions and 14 deletions
|
@ -130,7 +130,7 @@ void wait(boost::asio::steady_timer& timer, const std::chrono::duration<Rep, Per
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
JackStream::JackStream(PcmStream::Listener* pcmListener, boost::asio::io_context& ioc, const ServerSettings& server_settings, const StreamUri& uri)
|
JackStream::JackStream(PcmStream::Listener* pcmListener, boost::asio::io_context& ioc, const ServerSettings& server_settings, const StreamUri& uri)
|
||||||
: PcmStream(pcmListener, ioc, server_settings, uri), read_timer_(strand_), silence_(0ms)
|
: PcmStream(pcmListener, ioc, server_settings, uri), read_timer_(strand_), silence_(0ms), first_(true)
|
||||||
{
|
{
|
||||||
|
|
||||||
serverName_ = uri_.getQuery("server_name", "default");
|
serverName_ = uri_.getQuery("server_name", "default");
|
||||||
|
@ -173,6 +173,7 @@ void JackStream::start()
|
||||||
|
|
||||||
// Need to start immediately, otherwise client will fail
|
// Need to start immediately, otherwise client will fail
|
||||||
// due to a zero-length pcm header message
|
// due to a zero-length pcm header message
|
||||||
|
first_ = true;
|
||||||
tvEncodedChunk_ = std::chrono::steady_clock::now();
|
tvEncodedChunk_ = std::chrono::steady_clock::now();
|
||||||
PcmStream::start();
|
PcmStream::start();
|
||||||
|
|
||||||
|
@ -241,12 +242,6 @@ bool JackStream::openJackConnection()
|
||||||
cpt::to_string(jack_sample_rate) + ".");
|
cpt::to_string(jack_sample_rate) + ".");
|
||||||
}
|
}
|
||||||
|
|
||||||
jack_time_t jackTime = jack_get_time();
|
|
||||||
auto now = std::chrono::steady_clock::now();
|
|
||||||
jackTimeAdjust_ = chrono::duration_cast<chrono::microseconds>(now.time_since_epoch()).count() - jackTime;
|
|
||||||
|
|
||||||
LOG(DEBUG, LOG_TAG) << name_ << ": Jack server time adjustment is " << jackTimeAdjust_ << "\n";
|
|
||||||
|
|
||||||
jack_set_process_callback(
|
jack_set_process_callback(
|
||||||
client_, [](jack_nframes_t nframes, void* arg) { return static_cast<JackStream*>(arg)->readJackBuffers(nframes); }, this);
|
client_, [](jack_nframes_t nframes, void* arg) { return static_cast<JackStream*>(arg)->readJackBuffers(nframes); }, this);
|
||||||
jack_on_shutdown(
|
jack_on_shutdown(
|
||||||
|
@ -352,21 +347,22 @@ int JackStream::readJackBuffers(jack_nframes_t nframes)
|
||||||
if (silence_ > idle_threshold_)
|
if (silence_ > idle_threshold_)
|
||||||
{
|
{
|
||||||
setState(ReaderState::kIdle);
|
setState(ReaderState::kIdle);
|
||||||
|
first_ = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
silence_ = 0ms;
|
silence_ = 0ms;
|
||||||
setState(ReaderState::kPlaying);
|
setState(ReaderState::kPlaying);
|
||||||
|
if (first_)
|
||||||
|
{
|
||||||
|
first_ = false;
|
||||||
|
tvEncodedChunk_ = std::chrono::steady_clock::now();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((state_ == ReaderState::kPlaying) || ((state_ == ReaderState::kIdle) && send_silence_))
|
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<std::chrono::steady_clock>(static_cast<chrono::microseconds>(current_usecs + jackTimeAdjust_));
|
|
||||||
|
|
||||||
// TODO: should we chunkRead() in a separate thread?
|
|
||||||
chunkRead(*chunk_);
|
chunkRead(*chunk_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,8 +65,6 @@ protected:
|
||||||
|
|
||||||
jack_client_t* client_;
|
jack_client_t* client_;
|
||||||
std::vector<jack_port_t*> ports_;
|
std::vector<jack_port_t*> ports_;
|
||||||
jack_nframes_t jackConnectFrames_;
|
|
||||||
jack_time_t jackTimeAdjust_;
|
|
||||||
SampleFormat jackSampleFormat_;
|
SampleFormat jackSampleFormat_;
|
||||||
|
|
||||||
std::string autoConnectRegex_;
|
std::string autoConnectRegex_;
|
||||||
|
@ -82,6 +80,8 @@ protected:
|
||||||
bool send_silence_;
|
bool send_silence_;
|
||||||
/// silence duration before switching the stream to idle
|
/// silence duration before switching the stream to idle
|
||||||
std::chrono::milliseconds idle_threshold_;
|
std::chrono::milliseconds idle_threshold_;
|
||||||
|
/// first read after idle => reset chunk timestamp
|
||||||
|
bool first_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace streamreader
|
} // namespace streamreader
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue