From 972f431ef4efbd9860e86baef65196d499735488 Mon Sep 17 00:00:00 2001 From: Björn Stenberg Date: Fri, 17 Oct 2003 15:11:09 +0000 Subject: Resume rounding error fixes (patch #783078 by Harold Toler) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3978 a1c6a512-1295-4272-9138-f99709370657 --- firmware/mpeg.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/firmware/mpeg.c b/firmware/mpeg.c index cc514baf8c..9d6718dc42 100644 --- a/firmware/mpeg.c +++ b/firmware/mpeg.c @@ -337,17 +337,20 @@ static void set_elapsed(struct mp3entry* id3) remainder = id3->offset - (relpos * (id3->filesize / 256)); - /* set time for this percent */ - id3->elapsed = i * id3->length / 100; + /* set time for this percent (divide before multiply to prevent + overflow on long files. loss of precision is negligible on + short files) */ + id3->elapsed = i * (id3->length / 100); /* calculate remainder time */ plen = (nextpos - relpos) * (id3->filesize / 256); - id3->elapsed += (((remainder * 100) / plen) * id3->length) / 10000; + id3->elapsed += (((remainder * 100) / plen) * + (id3->length / 10000)); } else { /* no TOC exists. set a rough estimate using average bitrate */ int tpk = id3->length / (id3->filesize / 1024); - id3->elapsed = id3->offset * tpk / 1024; + id3->elapsed = id3->offset / 1024 * tpk; } } else -- cgit v1.2.3