annotate base/RealTime.h @ 1061:c1e43c8d2527 tonioni

Thread-local debug was causing crash on exit with Qt 5.4.x. But we introduced that because QDebug itself was crashing when used from multiple threads. Replace with simpler fstream version
author Chris Cannam
date Tue, 31 Mar 2015 10:36:52 +0100
parents a1cd5abcb38b
children b8a788c9a6f1
rev   line source
Chris@49 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@52 4 Sonic Visualiser
Chris@52 5 An audio file viewer and annotation editor.
Chris@52 6 Centre for Digital Music, Queen Mary, University of London.
Chris@0 7
Chris@52 8 This program is free software; you can redistribute it and/or
Chris@52 9 modify it under the terms of the GNU General Public License as
Chris@52 10 published by the Free Software Foundation; either version 2 of the
Chris@52 11 License, or (at your option) any later version. See the file
Chris@52 12 COPYING included with this distribution for more information.
Chris@0 13 */
Chris@0 14
Chris@0 15 /*
Chris@0 16 This is a modified version of a source file from the
Chris@0 17 Rosegarden MIDI and audio sequencer and notation editor.
Chris@17 18 This file copyright 2000-2006 Chris Cannam.
Chris@0 19 */
Chris@0 20
Chris@0 21 #ifndef _REAL_TIME_H_
Chris@0 22 #define _REAL_TIME_H_
Chris@0 23
Chris@1038 24 #include "BaseTypes.h"
Chris@1038 25
Chris@0 26 #include <iostream>
Chris@0 27 #include <string>
Chris@0 28
Chris@1040 29 #include <vamp-hostsdk/RealTime.h>
Chris@1040 30
Chris@26 31 struct timeval;
Chris@26 32
Chris@0 33 /**
Chris@0 34 * RealTime represents time values to nanosecond precision
Chris@0 35 * with accurate arithmetic and frame-rate conversion functions.
Chris@0 36 */
Chris@0 37
Chris@0 38 struct RealTime
Chris@0 39 {
Chris@0 40 int sec;
Chris@0 41 int nsec;
Chris@0 42
Chris@0 43 int usec() const { return nsec / 1000; }
Chris@0 44 int msec() const { return nsec / 1000000; }
Chris@0 45
Chris@0 46 RealTime(): sec(0), nsec(0) {}
Chris@0 47 RealTime(int s, int n);
Chris@0 48
Chris@0 49 RealTime(const RealTime &r) :
Chris@0 50 sec(r.sec), nsec(r.nsec) { }
Chris@0 51
Chris@1040 52 RealTime(const Vamp::RealTime &r) :
Chris@1040 53 sec(r.sec), nsec(r.nsec) { }
Chris@1040 54
Chris@26 55 static RealTime fromSeconds(double sec);
Chris@26 56 static RealTime fromMilliseconds(int msec);
Chris@26 57 static RealTime fromTimeval(const struct timeval &);
Chris@439 58 static RealTime fromXsdDuration(std::string xsdd);
Chris@439 59
Chris@439 60 double toDouble() const;
Chris@1040 61 Vamp::RealTime toVampRealTime() const { return Vamp::RealTime(sec, nsec); }
Chris@26 62
Chris@0 63 RealTime &operator=(const RealTime &r) {
Chris@0 64 sec = r.sec; nsec = r.nsec; return *this;
Chris@0 65 }
Chris@0 66
Chris@0 67 RealTime operator+(const RealTime &r) const {
Chris@0 68 return RealTime(sec + r.sec, nsec + r.nsec);
Chris@0 69 }
Chris@0 70 RealTime operator-(const RealTime &r) const {
Chris@0 71 return RealTime(sec - r.sec, nsec - r.nsec);
Chris@0 72 }
Chris@0 73 RealTime operator-() const {
Chris@0 74 return RealTime(-sec, -nsec);
Chris@0 75 }
Chris@0 76
Chris@0 77 bool operator <(const RealTime &r) const {
Chris@0 78 if (sec == r.sec) return nsec < r.nsec;
Chris@0 79 else return sec < r.sec;
Chris@0 80 }
Chris@0 81
Chris@0 82 bool operator >(const RealTime &r) const {
Chris@0 83 if (sec == r.sec) return nsec > r.nsec;
Chris@0 84 else return sec > r.sec;
Chris@0 85 }
Chris@0 86
Chris@0 87 bool operator==(const RealTime &r) const {
Chris@0 88 return (sec == r.sec && nsec == r.nsec);
Chris@0 89 }
Chris@0 90
Chris@0 91 bool operator!=(const RealTime &r) const {
Chris@0 92 return !(r == *this);
Chris@0 93 }
Chris@0 94
Chris@0 95 bool operator>=(const RealTime &r) const {
Chris@0 96 if (sec == r.sec) return nsec >= r.nsec;
Chris@0 97 else return sec >= r.sec;
Chris@0 98 }
Chris@0 99
Chris@0 100 bool operator<=(const RealTime &r) const {
Chris@0 101 if (sec == r.sec) return nsec <= r.nsec;
Chris@0 102 else return sec <= r.sec;
Chris@0 103 }
Chris@0 104
Chris@183 105 RealTime operator*(int m) const;
Chris@0 106 RealTime operator/(int d) const;
Chris@0 107
Chris@378 108 RealTime operator*(double m) const;
Chris@378 109 RealTime operator/(double d) const;
Chris@378 110
Chris@350 111 /**
Chris@350 112 * Return the ratio of two times.
Chris@350 113 */
Chris@0 114 double operator/(const RealTime &r) const;
Chris@0 115
Chris@350 116 /**
Chris@350 117 * Return a human-readable debug-type string to full precision
Chris@350 118 * (probably not a format to show to a user directly). If align
Chris@350 119 * is true, prepend " " to the start of positive values so that
Chris@350 120 * they line up with negative ones (which start with "-").
Chris@350 121 */
Chris@121 122 std::string toString(bool align = false) const;
Chris@0 123
Chris@350 124 /**
Chris@350 125 * Convert a string as obtained from toString back to a RealTime
Chris@350 126 * object.
Chris@350 127 */
Chris@350 128 static RealTime fromString(std::string);
Chris@350 129
Chris@350 130 /**
Chris@350 131 * Return a user-readable string to the nearest millisecond, in a
Chris@350 132 * form like HH:MM:SS.mmm
Chris@350 133 */
Chris@0 134 std::string toText(bool fixedDp = false) const;
Chris@0 135
Chris@350 136 /**
Chris@612 137 * Return a user-readable string in which seconds are divided into
Chris@612 138 * frames (presumably at a lower frame rate than audio rate,
Chris@612 139 * e.g. 24 or 25 video frames), in a form like HH:MM:SS:FF. fps
Chris@612 140 * gives the number of frames per second, and must be integral
Chris@612 141 * (29.97 not supported).
Chris@612 142 */
Chris@612 143 std::string toFrameText(int fps) const;
Chris@612 144
Chris@612 145 /**
Chris@350 146 * Return a user-readable string to the nearest second, in a form
Chris@350 147 * like "6s" (for less than a minute) or "2:21" (for more).
Chris@350 148 */
Chris@247 149 std::string toSecText() const;
Chris@247 150
Chris@350 151 /**
Chris@494 152 * Return a string in xsd:duration format.
Chris@494 153 */
Chris@494 154 std::string toXsdDuration() const;
Chris@494 155
Chris@494 156 /**
Chris@350 157 * Convert a RealTime into a sample frame at the given sample rate.
Chris@350 158 */
Chris@1040 159 static sv_frame_t realTime2Frame(const RealTime &r, sv_samplerate_t sampleRate);
Chris@350 160
Chris@350 161 /**
Chris@350 162 * Convert a sample frame at the given sample rate into a RealTime.
Chris@350 163 */
Chris@1040 164 static RealTime frame2RealTime(sv_frame_t frame, sv_samplerate_t sampleRate);
Chris@0 165
Chris@0 166 static const RealTime zeroTime;
Chris@0 167 };
Chris@0 168
Chris@0 169 std::ostream &operator<<(std::ostream &out, const RealTime &rt);
Chris@0 170
Chris@0 171 #endif