From 7fc7fa33c85017ba21391a9d6d30f88fca952ad3 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 17 Jul 2024 17:27:04 -0400 Subject: Avoid use of jack_frame_time() This seems to be broken on the pipewire implementation of Jack, but we use FrameTimer for this on other drivers anyway, so just use that for Jack as well and avoid the issue entirely. Conveniently also exercises the clock and timestamp DLL code, which as it turns out, was itself broken. --- src/server/JackDriver.cpp | 11 +++++++++++ src/server/JackDriver.hpp | 44 ++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/server/JackDriver.cpp b/src/server/JackDriver.cpp index 0589a021..a2a7f951 100644 --- a/src/server/JackDriver.cpp +++ b/src/server/JackDriver.cpp @@ -21,6 +21,7 @@ #include "BufferRef.hpp" #include "DuplexPort.hpp" #include "Engine.hpp" +#include "FrameTimer.hpp" #include "GraphImpl.hpp" #include "PortType.hpp" #include "RunContext.hpp" @@ -42,6 +43,7 @@ #include "raul/Path.hpp" #include "raul/Semaphore.hpp" +#include #include #include @@ -126,6 +128,8 @@ JackDriver::attach(const std::string& server_name, register_port(p); } + _timer = std::make_unique(_block_length, _sample_rate); + return true; } @@ -459,6 +463,12 @@ JackDriver::append_time_events(RunContext& ctx, Buffer& buffer) static_cast(LV2_ATOM_BODY_CONST(lpos))); } +SampleCount +JackDriver::frame_time() const +{ + return _timer->frame_time(_engine.current_time()) + _engine.block_length(); +} + /**** Jack Callbacks ****/ /** Jack process callback, drives entire audio thread. @@ -481,6 +491,7 @@ JackDriver::_process_cb(jack_nframes_t nframes) _transport_state = jack_transport_query(_client, &_position); + _timer->update(_engine.current_time(), start_of_current_cycle - _engine.block_length()); _engine.locate(start_of_current_cycle, nframes); // Read input diff --git a/src/server/JackDriver.hpp b/src/server/JackDriver.hpp index 28931e9e..e811e9c1 100644 --- a/src/server/JackDriver.hpp +++ b/src/server/JackDriver.hpp @@ -28,10 +28,10 @@ #include #include -#include -#include #include +#include + #include #include #include @@ -51,6 +51,7 @@ namespace server { class Buffer; class DuplexPort; class Engine; +class FrameTimer; class RunContext; /** The Jack Driver. @@ -102,9 +103,7 @@ public: uint32_t seq_size() const override { return _seq_size; } SampleCount sample_rate() const override { return _sample_rate; } - SampleCount frame_time() const override { - return _client ? jack_frame_time(_client) : 0; - } + SampleCount frame_time() const override; class PortRegistrationFailedException : public std::exception {}; @@ -148,23 +147,24 @@ protected: using AudioBufPtr = std::unique_ptr>; - Engine& _engine; - Ports _ports; - AudioBufPtr _fallback_buffer; - LV2_Atom_Forge _forge; - raul::Semaphore _sem{0}; - std::atomic _flag{false}; - jack_client_t* _client{nullptr}; - jack_nframes_t _block_length{0}; - uint32_t _seq_size{0}; - jack_nframes_t _sample_rate{0}; - uint32_t _midi_event_type; - bool _is_activated{false}; - jack_position_t _position{}; - jack_transport_state_t _transport_state{}; - double _old_bpm{120.0}; - jack_nframes_t _old_frame{0}; - bool _old_rolling{false}; + Engine& _engine; + Ports _ports; + AudioBufPtr _fallback_buffer; + LV2_Atom_Forge _forge; + raul::Semaphore _sem{0}; + std::unique_ptr _timer; + std::atomic _flag{false}; + jack_client_t* _client{nullptr}; + jack_nframes_t _block_length{0}; + uint32_t _seq_size{0}; + jack_nframes_t _sample_rate{0}; + uint32_t _midi_event_type; + bool _is_activated{false}; + jack_position_t _position{}; + jack_transport_state_t _transport_state{}; + double _old_bpm{120.0}; + jack_nframes_t _old_frame{0}; + bool _old_rolling{false}; }; } // namespace server -- cgit v1.2.1