11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
25PROMEKI_NAMESPACE_BEGIN
55 Duration span()
const {
return maxError - minError; }
58 bool isSymmetric()
const {
return minError.nanoseconds() == -maxError.nanoseconds(); }
86 using UPtr = UniquePtr<ClockFilter>;
88 virtual ~ClockFilter() =
default;
95 virtual int64_t filter(int64_t rawNs) = 0;
110enum class ClockPauseMode {
112 PausesRawKeepsRunning,
166 using Ptr = SharedPtr<Clock,
false, Clock>;
179 Clock(
const ClockDomain &domain,
const Duration &fixedOffset = Duration::zero(),
180 ClockPauseMode pauseMode = ClockPauseMode::CannotPause, ClockFilter *filter =
nullptr);
185 Clock(
const Clock &) =
delete;
186 Clock &operator=(
const Clock &) =
delete;
187 Clock(Clock &&) =
delete;
188 Clock &operator=(Clock &&) =
delete;
193 ClockDomain domain()
const {
return _domain; }
196 ClockPauseMode pauseMode()
const {
return _pauseMode; }
199 bool canPause()
const {
return _pauseMode != ClockPauseMode::CannotPause; }
205 virtual int64_t resolutionNs()
const = 0;
211 virtual ClockJitter jitter()
const = 0;
217 virtual double rateRatio()
const {
return 1.0; }
233 Result<MediaTimeStamp> now()
const;
242 Result<int64_t> nowNs()
const;
247 Duration fixedOffset()
const;
258 void setFixedOffset(
const Duration &offset);
263 bool isPaused()
const;
279 Error setPause(
bool paused);
304 Error sleepUntil(
const MediaTimeStamp &deadline)
const;
310 RefCount _promeki_refct;
316 virtual Clock *_promeki_clone()
const {
317 assert(
false &&
"Clock is not copyable");
331 virtual Result<int64_t> raw()
const = 0;
347 virtual Error sleepUntilNs(int64_t targetNs)
const = 0;
361 virtual Error onPause(
bool paused);
364 Result<int64_t> applyFilter(int64_t raw)
const;
367 ClockPauseMode _pauseMode;
368 ClockFilter::UPtr _filter;
370 mutable Mutex _mutex;
371 int64_t _fixedOffsetNs;
372 int64_t _pausedOffsetNs;
373 int64_t _frozenFilteredNs;
376 mutable Atomic<int64_t> _lastNowNs;
389class WallClock :
public Clock {
394 int64_t resolutionNs()
const override;
395 ClockJitter jitter()
const override;
398 Result<int64_t> raw()
const override;
399 Error sleepUntilNs(int64_t targetNs)
const override;