summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2003-10-17 15:11:09 +0000
committerBjörn Stenberg <bjorn@haxx.se>2003-10-17 15:11:09 +0000
commit972f431ef4efbd9860e86baef65196d499735488 (patch)
tree135767ea3e241295b41b9ab81ddf7aecff03faf9
parent67a8bdce7c48f9cdda6f27b8dd39c29f6d113473 (diff)
downloadrockbox-972f431ef4efbd9860e86baef65196d499735488.zip
rockbox-972f431ef4efbd9860e86baef65196d499735488.tar.gz
rockbox-972f431ef4efbd9860e86baef65196d499735488.tar.bz2
rockbox-972f431ef4efbd9860e86baef65196d499735488.tar.xz
Resume rounding error fixes (patch #783078 by Harold Toler)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3978 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/mpeg.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index cc514ba..9d6718d 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