Chris@49: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@0: Chris@0: /* Chris@52: Sonic Visualiser Chris@52: An audio file viewer and annotation editor. Chris@52: Centre for Digital Music, Queen Mary, University of London. Chris@0: Chris@52: This program is free software; you can redistribute it and/or Chris@52: modify it under the terms of the GNU General Public License as Chris@52: published by the Free Software Foundation; either version 2 of the Chris@52: License, or (at your option) any later version. See the file Chris@52: COPYING included with this distribution for more information. 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@17: This file copyright 2000-2006 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@26: struct timeval; Chris@26: Chris@26: 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@26: static RealTime fromSeconds(double sec); Chris@26: static RealTime fromMilliseconds(int msec); Chris@26: static RealTime fromTimeval(const struct timeval &); Chris@26: 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@183: RealTime operator*(int m) const; Chris@0: RealTime operator/(int d) const; Chris@0: Chris@350: /** Chris@350: * Return the ratio of two times. Chris@350: */ Chris@0: double operator/(const RealTime &r) const; Chris@0: Chris@350: /** Chris@350: * Return a human-readable debug-type string to full precision Chris@350: * (probably not a format to show to a user directly). If align Chris@350: * is true, prepend " " to the start of positive values so that Chris@350: * they line up with negative ones (which start with "-"). Chris@350: */ Chris@121: std::string toString(bool align = false) const; Chris@0: Chris@350: /** Chris@350: * Convert a string as obtained from toString back to a RealTime Chris@350: * object. Chris@350: */ Chris@350: static RealTime fromString(std::string); Chris@350: Chris@350: /** Chris@350: * Return a user-readable string to the nearest millisecond, in a Chris@350: * form like HH:MM:SS.mmm Chris@350: */ Chris@0: std::string toText(bool fixedDp = false) const; Chris@0: Chris@350: /** Chris@350: * Return a user-readable string to the nearest second, in a form Chris@350: * like "6s" (for less than a minute) or "2:21" (for more). Chris@350: */ Chris@247: std::string toSecText() const; Chris@247: Chris@350: /** Chris@350: * Convert a RealTime into a sample frame at the given sample rate. Chris@350: */ Chris@0: static long realTime2Frame(const RealTime &r, unsigned int sampleRate); Chris@350: Chris@350: /** Chris@350: * Convert a sample frame at the given sample rate into a RealTime. Chris@350: */ 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