Chris@0: /* -*- c-basic-offset: 4 -*- vi:set ts=8 sts=4 sw=4: */ Chris@0: Chris@0: /* Chris@0: A waveform viewer and audio annotation editor. Chris@0: Chris Cannam, Queen Mary University of London, 2005 Chris@0: Chris@0: This is experimental software. Not for distribution. Chris@0: */ Chris@0: Chris@0: /* Chris@0: This is a modified version of a source file from the Chris@0: Rosegarden MIDI and audio sequencer and notation editor. Chris@0: This file copyright 2000-2005 Chris Cannam. Chris@0: */ Chris@0: Chris@0: #ifndef _REAL_TIME_H_ Chris@0: #define _REAL_TIME_H_ Chris@0: Chris@0: #include Chris@0: #include Chris@0: Chris@0: /** Chris@0: * RealTime represents time values to nanosecond precision Chris@0: * with accurate arithmetic and frame-rate conversion functions. Chris@0: */ Chris@0: Chris@0: struct RealTime Chris@0: { Chris@0: int sec; Chris@0: int nsec; Chris@0: Chris@0: int usec() const { return nsec / 1000; } Chris@0: int msec() const { return nsec / 1000000; } Chris@0: Chris@0: RealTime(): sec(0), nsec(0) {} Chris@0: RealTime(int s, int n); Chris@0: Chris@0: RealTime(const RealTime &r) : Chris@0: sec(r.sec), nsec(r.nsec) { } Chris@0: Chris@0: RealTime &operator=(const RealTime &r) { Chris@0: sec = r.sec; nsec = r.nsec; return *this; Chris@0: } Chris@0: Chris@0: RealTime operator+(const RealTime &r) const { Chris@0: return RealTime(sec + r.sec, nsec + r.nsec); Chris@0: } Chris@0: RealTime operator-(const RealTime &r) const { Chris@0: return RealTime(sec - r.sec, nsec - r.nsec); Chris@0: } Chris@0: RealTime operator-() const { Chris@0: return RealTime(-sec, -nsec); Chris@0: } Chris@0: Chris@0: bool operator <(const RealTime &r) const { Chris@0: if (sec == r.sec) return nsec < r.nsec; Chris@0: else return sec < r.sec; Chris@0: } Chris@0: Chris@0: bool operator >(const RealTime &r) const { Chris@0: if (sec == r.sec) return nsec > r.nsec; Chris@0: else return sec > r.sec; Chris@0: } Chris@0: Chris@0: bool operator==(const RealTime &r) const { Chris@0: return (sec == r.sec && nsec == r.nsec); Chris@0: } Chris@0: Chris@0: bool operator!=(const RealTime &r) const { Chris@0: return !(r == *this); Chris@0: } Chris@0: Chris@0: bool operator>=(const RealTime &r) const { Chris@0: if (sec == r.sec) return nsec >= r.nsec; Chris@0: else return sec >= r.sec; Chris@0: } Chris@0: Chris@0: bool operator<=(const RealTime &r) const { Chris@0: if (sec == r.sec) return nsec <= r.nsec; Chris@0: else return sec <= r.sec; Chris@0: } Chris@0: Chris@0: RealTime operator/(int d) const; Chris@0: Chris@0: // Find the fractional difference between times Chris@0: // Chris@0: double operator/(const RealTime &r) const; Chris@0: Chris@0: // Return a human-readable debug-type string to full precision Chris@0: // (probably not a format to show to a user directly) Chris@0: // Chris@0: std::string toString() const; Chris@0: Chris@0: // Return a user-readable string to the nearest millisecond Chris@0: // in a form like HH:MM:SS.mmm Chris@0: // Chris@0: std::string toText(bool fixedDp = false) const; Chris@0: Chris@0: // Convenience functions for handling sample frames Chris@0: // Chris@0: static long realTime2Frame(const RealTime &r, unsigned int sampleRate); Chris@0: static RealTime frame2RealTime(long frame, unsigned int sampleRate); Chris@0: Chris@0: static const RealTime zeroTime; Chris@0: }; Chris@0: Chris@0: std::ostream &operator<<(std::ostream &out, const RealTime &rt); Chris@0: Chris@0: #endif