comparison vamp-sdk/RealTime.cpp @ 137:dbab8c3a6571

* Improve resilience of frame - real-time - frame round-trip conversions
author cannam
date Mon, 16 Jun 2008 12:22:16 +0000
parents c8b48bc6db3d
children
comparison
equal deleted inserted replaced
136:1b1ebb0f10ac 137:dbab8c3a6571
222 222
223 long 223 long
224 RealTime::realTime2Frame(const RealTime &time, unsigned int sampleRate) 224 RealTime::realTime2Frame(const RealTime &time, unsigned int sampleRate)
225 { 225 {
226 if (time < zeroTime) return -realTime2Frame(-time, sampleRate); 226 if (time < zeroTime) return -realTime2Frame(-time, sampleRate);
227 227 double s = time.sec + double(time.nsec + 1) / 1000000000.0;
228 // We like integers. The last term is always zero unless the 228 return long(s * sampleRate);
229 // sample rate is greater than 1MHz, but hell, you never know...
230
231 long frame =
232 time.sec * sampleRate +
233 (time.msec() * sampleRate) / 1000 +
234 ((time.usec() - 1000 * time.msec()) * sampleRate) / 1000000 +
235 ((time.nsec - 1000 * time.usec()) * sampleRate) / 1000000000;
236
237 return frame;
238 } 229 }
239 230
240 RealTime 231 RealTime
241 RealTime::frame2RealTime(long frame, unsigned int sampleRate) 232 RealTime::frame2RealTime(long frame, unsigned int sampleRate)
242 { 233 {
243 if (frame < 0) return -frame2RealTime(-frame, sampleRate); 234 if (frame < 0) return -frame2RealTime(-frame, sampleRate);
244 235
245 RealTime rt; 236 RealTime rt;
246 rt.sec = frame / long(sampleRate); 237 rt.sec = frame / long(sampleRate);
247 frame -= rt.sec * long(sampleRate); 238 frame -= rt.sec * long(sampleRate);
248 rt.nsec = (int)(((float(frame) * 1000000) / long(sampleRate)) * 1000); 239 rt.nsec = (int)(((double(frame) * 1000000.0) / sampleRate) * 1000.0);
249 return rt; 240 return rt;
250 } 241 }
251 242
252 const RealTime RealTime::zeroTime(0,0); 243 const RealTime RealTime::zeroTime(0,0);
253 244