diff options
| author | Björn Stenberg <bjorn@haxx.se> | 2003-10-17 15:11:09 +0000 |
|---|---|---|
| committer | Björn Stenberg <bjorn@haxx.se> | 2003-10-17 15:11:09 +0000 |
| commit | 972f431ef4efbd9860e86baef65196d499735488 (patch) | |
| tree | 135767ea3e241295b41b9ab81ddf7aecff03faf9 | |
| parent | 67a8bdce7c48f9cdda6f27b8dd39c29f6d113473 (diff) | |
| download | rockbox-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.c | 11 |
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 |