aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2013-07-31 11:04:06 -0700
committerJosh Blum <josh@joshknows.com>2013-07-31 11:07:01 -0700
commita85fae0b35e79df4c7b37a03b5154880f188f865 (patch)
tree399500813d4754392f402763136afe8606016815
parentbcdf7c371f58853473418495ea0d0382f2e0df03 (diff)
downloaduhd-a85fae0b35e79df4c7b37a03b5154880f188f865.tar.gz
uhd-a85fae0b35e79df4c7b37a03b5154880f188f865.tar.bz2
uhd-a85fae0b35e79df4c7b37a03b5154880f188f865.zip
uhd: time spec rounding fixes
-rw-r--r--host/lib/types/time_spec.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/host/lib/types/time_spec.cpp b/host/lib/types/time_spec.cpp
index 2fce841be..2a5102190 100644
--- a/host/lib/types/time_spec.cpp
+++ b/host/lib/types/time_spec.cpp
@@ -100,9 +100,12 @@ time_spec_t::time_spec_t(time_t full_secs, long tick_count, double tick_rate){
}
time_spec_t time_spec_t::from_ticks(long long ticks, double tick_rate){
- const time_t secs_full = time_t(ticks/tick_rate);
- const double ticks_error = ticks - (secs_full*tick_rate);
- return time_spec_t(secs_full, ticks_error/tick_rate);
+ const long long rate_i = (long long)(tick_rate);
+ const double rate_f = tick_rate - rate_i;
+ const time_t secs_full = time_t(ticks/rate_i);
+ const long long ticks_error = ticks - (secs_full*rate_i);
+ const double ticks_frac = ticks_error - secs_full*rate_f;
+ return time_spec_t(secs_full, ticks_frac/tick_rate);
}
/***********************************************************************
@@ -113,10 +116,12 @@ long time_spec_t::get_tick_count(double tick_rate) const{
}
long long time_spec_t::to_ticks(double tick_rate) const{
- const long long ticks_full = this->get_full_secs()*fast_llround(tick_rate);
- const double secs_error = this->get_full_secs() - (ticks_full/tick_rate);
- const double secs_frac = this->get_frac_secs() + secs_error;
- return ticks_full + fast_llround(secs_frac*tick_rate);
+ const long long rate_i = (long long)(tick_rate);
+ const double rate_f = tick_rate - rate_i;
+ const long long ticks_full = this->get_full_secs()*rate_i;
+ const double ticks_error = this->get_full_secs()*rate_f;
+ const double ticks_frac = this->get_frac_secs()*tick_rate;
+ return ticks_full + ticks_error + ticks_frac;
}
double time_spec_t::get_real_secs(void) const{