diff options
author | Josh Blum <josh@joshknows.com> | 2013-07-31 11:04:06 -0700 |
---|---|---|
committer | Josh Blum <josh@joshknows.com> | 2013-07-31 11:07:01 -0700 |
commit | a85fae0b35e79df4c7b37a03b5154880f188f865 (patch) | |
tree | 399500813d4754392f402763136afe8606016815 | |
parent | bcdf7c371f58853473418495ea0d0382f2e0df03 (diff) | |
download | uhd-a85fae0b35e79df4c7b37a03b5154880f188f865.tar.gz uhd-a85fae0b35e79df4c7b37a03b5154880f188f865.tar.bz2 uhd-a85fae0b35e79df4c7b37a03b5154880f188f865.zip |
uhd: time spec rounding fixes
-rw-r--r-- | host/lib/types/time_spec.cpp | 19 |
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{ |