comparison src/vamp-sdk/RealTime.cpp @ 475:e2716b9352ca

Fixes to a few unusual cases in RealTime
author Chris Cannam
date Tue, 15 Nov 2016 16:53:46 +0000
parents 35fa4733bc5d
children 15348e89c1d7
comparison
equal deleted inserted replaced
474:8e846c1aed96 475:e2716b9352ca
153 } 153 }
154 154
155 std::string 155 std::string
156 RealTime::toText(bool fixedDp) const 156 RealTime::toText(bool fixedDp) const
157 { 157 {
158 if (*this < RealTime::zeroTime) return "-" + (-*this).toText(); 158 if (*this < RealTime::zeroTime) return "-" + (-*this).toText(fixedDp);
159 159
160 std::stringstream out; 160 std::stringstream out;
161 161
162 if (sec >= 3600) { 162 if (sec >= 3600) {
163 out << (sec / 3600) << ":"; 163 out << (sec / 3600) << ":";
224 224
225 long 225 long
226 RealTime::realTime2Frame(const RealTime &time, unsigned int sampleRate) 226 RealTime::realTime2Frame(const RealTime &time, unsigned int sampleRate)
227 { 227 {
228 if (time < zeroTime) return -realTime2Frame(-time, sampleRate); 228 if (time < zeroTime) return -realTime2Frame(-time, sampleRate);
229 double s = time.sec + double(time.nsec + 1) / 1000000000.0; 229 double s = time.sec + double(time.nsec) / ONE_BILLION;
230 return long(s * sampleRate); 230 return long(s * sampleRate + 0.5);
231 } 231 }
232 232
233 RealTime 233 RealTime
234 RealTime::frame2RealTime(long frame, unsigned int sampleRate) 234 RealTime::frame2RealTime(long frame, unsigned int sampleRate)
235 { 235 {
236 if (frame < 0) return -frame2RealTime(-frame, sampleRate); 236 if (frame < 0) return -frame2RealTime(-frame, sampleRate);
237 237
238 RealTime rt; 238 int sec = int(frame / long(sampleRate));
239 rt.sec = int(frame / long(sampleRate)); 239 frame -= sec * long(sampleRate);
240 frame -= rt.sec * long(sampleRate); 240 int nsec = (int)((double(frame) / double(sampleRate)) * ONE_BILLION + 0.5);
241 rt.nsec = (int)(((double(frame) * 1000000.0) / sampleRate) * 1000.0); 241 // Use ctor here instead of setting data members directly to
242 return rt; 242 // ensure nsec > ONE_BILLION is handled properly. It's extremely
243 // unlikely, but not impossible.
244 return RealTime(sec, nsec);
243 } 245 }
244 246
245 const RealTime RealTime::zeroTime(0,0); 247 const RealTime RealTime::zeroTime(0,0);
246 248
247 } 249 }