summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/mpeg.c11
1 files 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)
337 337
338 remainder = id3->offset - (relpos * (id3->filesize / 256)); 338 remainder = id3->offset - (relpos * (id3->filesize / 256));
339 339
340 /* set time for this percent */ 340 /* set time for this percent (divide before multiply to prevent
341 id3->elapsed = i * id3->length / 100; 341 overflow on long files. loss of precision is negligible on
342 short files) */
343 id3->elapsed = i * (id3->length / 100);
342 344
343 /* calculate remainder time */ 345 /* calculate remainder time */
344 plen = (nextpos - relpos) * (id3->filesize / 256); 346 plen = (nextpos - relpos) * (id3->filesize / 256);
345 id3->elapsed += (((remainder * 100) / plen) * id3->length) / 10000; 347 id3->elapsed += (((remainder * 100) / plen) *
348 (id3->length / 10000));
346 } 349 }
347 else { 350 else {
348 /* no TOC exists. set a rough estimate using average bitrate */ 351 /* no TOC exists. set a rough estimate using average bitrate */
349 int tpk = id3->length / (id3->filesize / 1024); 352 int tpk = id3->length / (id3->filesize / 1024);
350 id3->elapsed = id3->offset * tpk / 1024; 353 id3->elapsed = id3->offset / 1024 * tpk;
351 } 354 }
352 } 355 }
353 else 356 else