summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorAmaury Pouly <pamaury@rockbox.org>2010-02-02 20:49:35 +0000
committerAmaury Pouly <pamaury@rockbox.org>2010-02-02 20:49:35 +0000
commit75fc9ee84b73287bdca627f414bc91c964b238d8 (patch)
tree5761f3a0a2373c7f1c283092074ec19ad18af275 /apps
parenta54cacb508b7904d1923135a2d27e31d3f5a4b41 (diff)
downloadrockbox-75fc9ee84b73287bdca627f414bc91c964b238d8.tar.gz
rockbox-75fc9ee84b73287bdca627f414bc91c964b238d8.zip
FS#8967: Fix autoscore computation overflow when the playtime is huge.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24471 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/tagcache.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/apps/tagcache.c b/apps/tagcache.c
index 79c96ff186..9ffb6f86fe 100644
--- a/apps/tagcache.c
+++ b/apps/tagcache.c
@@ -772,9 +772,19 @@ static long check_virtual_tags(int tag, const struct index_entry *idx)
772 } 772 }
773 else 773 else
774 { 774 {
775 data = 100 * idx->tag_seek[tag_playtime] 775 /* A straight calculus gives:
776 / idx->tag_seek[tag_length] 776 autoscore = 100 * playtime / length / playcout (1)
777 / idx->tag_seek[tag_playcount]; 777 Now, consider the euclidian division of playtime by length:
778 playtime = alpha * length + beta
779 With:
780 0 <= beta < length
781 Now, (1) becomes:
782 autoscore = 100 * (alpha / playcout + beta / length / playcount)
783 Both terms should be small enough to avoid any overflow
784 */
785 data = 100 * (idx->tag_seek[tag_playtime] / idx->tag_seek[tag_length])
786 + (100 * (idx->tag_seek[tag_playtime] % idx->tag_seek[tag_length])) / idx->tag_seek[tag_length];
787 data /= idx->tag_seek[tag_playcount];
778 } 788 }
779 break; 789 break;
780 790