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:
parent
4998b0867b
commit
ea10b7e630
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue