lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: This is a modified version of a source file from the lbajardsilogic@0: Rosegarden MIDI and audio sequencer and notation editor. lbajardsilogic@0: This file copyright 2000-2006 Chris Cannam. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #ifndef _REAL_TIME_H_ lbajardsilogic@0: #define _REAL_TIME_H_ lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: struct timeval; lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * RealTime represents time values to nanosecond precision lbajardsilogic@0: * with accurate arithmetic and frame-rate conversion functions. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: struct RealTime lbajardsilogic@0: { lbajardsilogic@0: int sec; lbajardsilogic@0: int nsec; lbajardsilogic@0: lbajardsilogic@0: int usec() const { return nsec / 1000; } lbajardsilogic@0: int msec() const { return nsec / 1000000; } lbajardsilogic@0: lbajardsilogic@0: RealTime(): sec(0), nsec(0) {} lbajardsilogic@0: RealTime(int s, int n); lbajardsilogic@0: lbajardsilogic@0: RealTime(const RealTime &r) : lbajardsilogic@0: sec(r.sec), nsec(r.nsec) { } lbajardsilogic@0: lbajardsilogic@0: static RealTime fromSeconds(double sec); lbajardsilogic@0: static RealTime fromMilliseconds(int msec); lbajardsilogic@0: static RealTime fromTimeval(const struct timeval &); lbajardsilogic@0: lbajardsilogic@0: RealTime &operator=(const RealTime &r) { lbajardsilogic@0: sec = r.sec; nsec = r.nsec; return *this; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: RealTime operator+(const RealTime &r) const { lbajardsilogic@0: return RealTime(sec + r.sec, nsec + r.nsec); lbajardsilogic@0: } lbajardsilogic@0: RealTime operator-(const RealTime &r) const { lbajardsilogic@0: return RealTime(sec - r.sec, nsec - r.nsec); lbajardsilogic@0: } lbajardsilogic@0: RealTime operator-() const { lbajardsilogic@0: return RealTime(-sec, -nsec); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: bool operator <(const RealTime &r) const { lbajardsilogic@0: if (sec == r.sec) return nsec < r.nsec; lbajardsilogic@0: else return sec < r.sec; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: bool operator >(const RealTime &r) const { lbajardsilogic@0: if (sec == r.sec) return nsec > r.nsec; lbajardsilogic@0: else return sec > r.sec; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: bool operator==(const RealTime &r) const { lbajardsilogic@0: return (sec == r.sec && nsec == r.nsec); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: bool operator!=(const RealTime &r) const { lbajardsilogic@0: return !(r == *this); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: bool operator>=(const RealTime &r) const { lbajardsilogic@0: if (sec == r.sec) return nsec >= r.nsec; lbajardsilogic@0: else return sec >= r.sec; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: bool operator<=(const RealTime &r) const { lbajardsilogic@0: if (sec == r.sec) return nsec <= r.nsec; lbajardsilogic@0: else return sec <= r.sec; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: RealTime operator*(int m) const; lbajardsilogic@0: RealTime operator/(int d) const; lbajardsilogic@0: lbajardsilogic@0: // Find the fractional difference between times lbajardsilogic@0: // lbajardsilogic@0: double operator/(const RealTime &r) const; lbajardsilogic@0: lbajardsilogic@0: // Return a human-readable debug-type string to full precision lbajardsilogic@0: // (probably not a format to show to a user directly). If align lbajardsilogic@0: // is true, prepend " " to the start of positive values so that lbajardsilogic@0: // they line up with negative ones (which start with "-"). lbajardsilogic@0: // lbajardsilogic@0: std::string toString(bool align = false) const; lbajardsilogic@0: lbajardsilogic@0: // Return a user-readable string to the nearest millisecond lbajardsilogic@0: // in a form like HH:MM:SS.mmm lbajardsilogic@0: // lbajardsilogic@0: std::string toText(bool fixedDp = false) const; lbajardsilogic@0: lbajardsilogic@0: // Return a user-readable string to the nearest second in a form lbajardsilogic@0: // like "6s" (for less than a minute) or "2:21" (for more). lbajardsilogic@0: // lbajardsilogic@0: std::string toSecText() const; lbajardsilogic@0: lbajardsilogic@0: // Convenience functions for handling sample frames lbajardsilogic@0: // lbajardsilogic@0: static long realTime2Frame(const RealTime &r, unsigned int sampleRate); lbajardsilogic@0: static RealTime frame2RealTime(long frame, unsigned int sampleRate); lbajardsilogic@0: lbajardsilogic@0: static const RealTime zeroTime; lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: std::ostream &operator<<(std::ostream &out, const RealTime &rt); lbajardsilogic@0: lbajardsilogic@0: #endif