libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
syntheticclock.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <promeki/atomic.h>
14#include <promeki/namespace.h>
15#include <promeki/clock.h>
16#include <promeki/framenumber.h>
17#include <promeki/framerate.h>
18
19PROMEKI_NAMESPACE_BEGIN
20
59class SyntheticClock : public Clock {
60 public:
65 explicit SyntheticClock(const ClockDomain &domain = ClockDomain(ClockDomain::Synthetic));
66
72 explicit SyntheticClock(const FrameRate &frameRate,
73 const ClockDomain &domain = ClockDomain(ClockDomain::Synthetic));
74
83 void setFrameRate(const FrameRate &frameRate);
84
86 const FrameRate &frameRate() const { return _frameRate; }
87
92 void setCurrentFrame(const FrameNumber &frame);
93
95 FrameNumber currentFrame() const { return FrameNumber(_currentFrame.value()); }
96
101 void advance(int64_t frames = 1);
102
107 void reset(const FrameNumber &frame = FrameNumber(0));
108
109 int64_t resolutionNs() const override;
110 ClockJitter jitter() const override;
111
112 protected:
113 Result<int64_t> raw() const override;
114 Error sleepUntilNs(int64_t targetNs) const override;
115
116 private:
117 void recomputePeriod();
118
119 FrameRate _frameRate;
120 Atomic<int64_t> _framePeriodNs{0};
121 Atomic<int64_t> _currentFrame{0};
122};
123
124PROMEKI_NAMESPACE_END
125
126#endif // PROMEKI_ENABLE_CORE