34 virtual void tick(uint64_t units = 1) = 0;
60 [[nodiscard]]
virtual uint32_t
rate()
const = 0;
110 void tick(uint64_t samples = 1)
override;
119 [[nodiscard]]
inline uint64_t
current_sample()
const {
return current_position(); }
121 [[nodiscard]] uint64_t current_position()
const override;
130 [[nodiscard]]
double current_time()
const override;
139 [[nodiscard]] uint32_t sample_rate()
const;
141 [[nodiscard]] uint32_t rate()
const override;
143 void reset()
override;
188 explicit FrameClock(uint32_t target_fps = 60);
205 void tick(uint64_t forced_frames = 0)
override;
210 [[nodiscard]] uint64_t current_position()
const override;
215 [[nodiscard]]
inline uint64_t
current_frame()
const {
return current_position(); }
220 [[nodiscard]]
double current_time()
const override;
225 [[nodiscard]] uint32_t rate()
const override;
226 [[nodiscard]]
inline uint32_t
frame_rate()
const {
return rate(); }
231 [[nodiscard]]
double get_measured_fps()
const;
237 [[nodiscard]] std::chrono::nanoseconds time_until_next_frame()
const;
248 void wait_for_next_frame();
254 [[nodiscard]]
bool is_frame_late()
const;
260 [[nodiscard]] uint64_t get_frame_lag()
const;
265 void reset()
override;
271 void set_target_fps(uint32_t new_fps);
288 static constexpr double FPS_SMOOTHING_ALPHA = 0.1;
294 void update_fps_measurement(std::chrono::steady_clock::time_point now);
301 [[nodiscard]] uint64_t calculate_elapsed_frames(std::chrono::steady_clock::time_point now)
const;
306 void recalculate_frame_duration();
333 CustomClock(uint64_t processing_rate = 1000,
const std::string& unit_name =
"units");
339 void tick(uint64_t units = 1)
override;
341 [[nodiscard]] uint64_t current_position()
const override;
347 [[nodiscard]]
double current_time()
const override;
349 [[nodiscard]] uint32_t rate()
const override;
355 [[nodiscard]]
const std::string& unit_name()
const;
357 void reset()
override;
uint64_t m_current_position
Current position in custom units.
std::string m_unit_name
Name describing the custom units.
uint64_t m_processing_rate
Custom processing rate in units per second.
Configurable timing system for custom processing domains.
std::chrono::steady_clock::time_point m_last_tick_time
uint32_t frame_rate() const
std::atomic< double > m_measured_fps
std::chrono::nanoseconds m_frame_duration
std::chrono::steady_clock::time_point m_next_frame_time
std::chrono::steady_clock::time_point m_start_time
std::atomic< uint64_t > m_current_frame
uint64_t current_frame() const
Get current frame number (alias for current_position)
Frame-accurate timing system for visual processing domain.
virtual uint32_t rate() const =0
Get the processing rate for this timing domain.
virtual void reset()=0
Reset clock to initial state (position 0)
virtual ~IClock()=default
virtual void tick(uint64_t units=1)=0
Advance the clock by specified processing units.
virtual uint64_t current_position() const =0
Get current position in the domain's timeline.
virtual double current_time() const =0
Get current time converted to seconds.
Abstract base interface for all clock types in the multimodal scheduling system.
uint64_t current_sample() const
Gets the current sample position.
uint64_t m_current_sample
Current sample position counter.
uint32_t m_sample_rate
Audio sample rate in samples per second.
Sample-accurate timing system for audio processing domain.