18 #ifndef RAUL_TIME_STAMP_HPP
19 #define RAUL_TIME_STAMP_HPP
45 assert(type == SECONDS || ppt != 0);
50 static inline TimeUnit frames(uint32_t srate) {
return TimeUnit(FRAMES, srate); }
51 static inline TimeUnit beats(uint32_t ppqn) {
return TimeUnit(BEATS, ppqn); }
52 static inline TimeUnit seconds() {
return TimeUnit(BEATS, std::numeric_limits<uint32_t>::max()); }
54 inline Type type()
const {
return _type; }
55 inline uint32_t ppt()
const {
return _ppt; }
57 inline bool operator==(
const TimeUnit& rhs)
const {
58 return (_type == rhs._type && _ppt == rhs._ppt);
61 inline bool operator!=(
const TimeUnit& rhs)
const {
62 return (_type != rhs._type || _ppt != rhs._ppt);
89 : _ticks(static_cast<uint32_t>(floor(dec)))
90 , _subticks((dec - floor(dec)) * unit.ppt())
94 assert(dec <= std::numeric_limits<uint32_t>::max());
97 inline TimeUnit unit()
const {
return _unit; }
98 inline uint32_t ticks()
const {
return _ticks; }
99 inline uint32_t subticks()
const {
return _subticks; }
101 inline double to_double()
const {
102 return _ticks + (_subticks /
static_cast<double>(_unit.ppt()));
105 inline bool is_zero()
const {
106 return _ticks == 0 && _subticks == 0;
111 _subticks = rhs._subticks;
116 inline TimeStamp& operator=(uint32_t ticks) {
122 inline bool operator==(
const TimeStamp& rhs)
const {
123 return _ticks == rhs._ticks
124 && _subticks == rhs._subticks
125 && _unit == rhs._unit;
128 inline bool operator!=(
const TimeStamp& rhs)
const {
129 return ! operator==(rhs);
132 inline bool operator<(
const TimeStamp& rhs)
const {
133 assert(_unit == rhs._unit);
134 return (_ticks < rhs._ticks
135 || (_ticks == rhs._ticks && _subticks < rhs._subticks));
138 inline bool operator>(
const TimeStamp& rhs)
const {
139 assert(_unit == rhs._unit);
140 return (_ticks > rhs._ticks
141 || (_ticks == rhs._ticks && _subticks > rhs._subticks));
144 inline bool operator<=(
const TimeStamp& rhs)
const {
145 return (*
this == rhs) || ((*this) < rhs);
148 inline bool operator>=(
const TimeStamp& rhs)
const {
149 return (*
this == rhs) || ((*this) > rhs);
153 assert(_unit == rhs._unit);
154 _ticks += rhs._ticks;
155 if (_subticks + rhs._subticks <= _unit.ppt()) {
156 _subticks += rhs._subticks;
157 }
else if (rhs._subticks > 0) {
159 _subticks = rhs._subticks + _subticks - _unit.ppt();
165 assert(_unit == rhs._unit);
166 assert(rhs <= *
this);
167 _ticks -= rhs._ticks;
168 if (_subticks >= rhs._subticks) {
169 _subticks -= rhs._subticks;
170 }
else if (rhs._subticks > 0) {
172 _subticks = _unit.ppt() - (rhs._subticks - _subticks);
178 assert(_unit == rhs._unit);
185 assert(_unit == rhs._unit);
198 static inline std::ostream&
199 operator<<(std::ostream& os,
const TimeStamp& t)
201 os << t.ticks() <<
":" << t.subticks();
202 switch (t.unit().type()) {
203 case TimeUnit::FRAMES:
206 case TimeUnit::BEATS:
209 case TimeUnit::SECONDS:
217 class FrameStamp :
public TimeStamp {
219 inline FrameStamp(uint32_t rate, uint32_t ticks=0, uint32_t subticks=0)
220 : TimeStamp(TimeUnit(TimeUnit::FRAMES, rate), ticks, subticks)
225 class BeatStamp :
public TimeStamp {
227 inline BeatStamp(uint32_t ppqn, uint32_t ticks=0, uint32_t subticks=0)
228 : TimeStamp(TimeUnit(TimeUnit::BEATS, ppqn), ticks, subticks)
235 typedef TimeStamp TimeDuration;
240 #endif // RAUL_TIME_STAMP_HPP