core/playlist: Improve average playcount calculation

The track database now tallys total play count and unplayed track count,
so we can use this information for calculating averages.  I also changed
the least played tracks playlist to allow tracks with play count equal
to the average.

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2016-04-02 13:29:31 -04:00
parent 4998b0867b
commit ea10b7e630
2 changed files with 6 additions and 18 deletions

View File

@ -26,19 +26,6 @@ static inline bool __playlist_is_dynamic(enum playlist_t plist)
return !__playlist_is_static(plist);
}
static unsigned int __playlist_find_average()
{
struct db_entry *track, *next;
unsigned int total = 0;
if (track_db_get()->db_size == 0)
return 0;
db_for_each(track, next, track_db_get())
total += TRACK(track)->tr_count;
return total / track_db_get()->db_size;
}
static void __playlist_fill_static(enum playlist_t plist)
{
struct index_entry *ent = __playlist_lookup(plist);
@ -56,7 +43,7 @@ static void __playlist_fill_dynamic(enum playlist_t plist)
struct db_entry *track, *next;
if (plist == PL_MOST_PLAYED || plist == PL_LEAST_PLAYED)
average = __playlist_find_average();
average = track_db_average_plays();
db_for_each(track, next, track_db_get()) {
count = TRACK(track)->tr_count;
@ -64,7 +51,7 @@ static void __playlist_fill_dynamic(enum playlist_t plist)
queue_add(&playlist_q, TRACK(track));
else if (plist == PL_MOST_PLAYED && count > average)
queue_add(&playlist_q, TRACK(track));
else if (plist == PL_LEAST_PLAYED && count < average && count > 0)
else if (plist == PL_LEAST_PLAYED && count <= average && count > 0)
queue_add(&playlist_q, TRACK(track));
}
}

View File

@ -112,7 +112,8 @@ static void test_dynamic()
/* Set play count to (track_number - 1) (average = 6) */
db_for_each(dbe, next, track_db_get()) {
TRACK(dbe)->tr_count = TRACK(dbe)->tr_track - 1;
for (i = 1; i < TRACK(dbe)->tr_track; i++)
track_played(TRACK(dbe));
average += TRACK(dbe)->tr_count;
}
average /= track_db_get()->db_size;
@ -125,10 +126,10 @@ static void test_dynamic()
test_equal(queue_at(q, 0)->tr_track, 1);
test_equal(queue_at(q, 0)->tr_count, 0);
/* Five tracks have tr_count < average && tr_count > 0 */
/* Six tracks have tr_count <= average && tr_count > 0 */
playlist_select(PL_LEAST_PLAYED);
test_equal(playlist_add(PL_LEAST_PLAYED, track_get(0)), (bool)false);
test_equal(queue_size(q), 5);
test_equal(queue_size(q), 6);
for (i = 0; i < queue_size(q); i++) {
track = queue_at(q, i);
test_loop_equal(track->tr_track, i + 2, i);