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);
|
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)
|
static void __playlist_fill_static(enum playlist_t plist)
|
||||||
{
|
{
|
||||||
struct index_entry *ent = __playlist_lookup(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;
|
struct db_entry *track, *next;
|
||||||
|
|
||||||
if (plist == PL_MOST_PLAYED || plist == PL_LEAST_PLAYED)
|
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()) {
|
db_for_each(track, next, track_db_get()) {
|
||||||
count = TRACK(track)->tr_count;
|
count = TRACK(track)->tr_count;
|
||||||
|
@ -64,7 +51,7 @@ static void __playlist_fill_dynamic(enum playlist_t plist)
|
||||||
queue_add(&playlist_q, TRACK(track));
|
queue_add(&playlist_q, TRACK(track));
|
||||||
else if (plist == PL_MOST_PLAYED && count > average)
|
else if (plist == PL_MOST_PLAYED && count > average)
|
||||||
queue_add(&playlist_q, TRACK(track));
|
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));
|
queue_add(&playlist_q, TRACK(track));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,7 +112,8 @@ static void test_dynamic()
|
||||||
|
|
||||||
/* Set play count to (track_number - 1) (average = 6) */
|
/* Set play count to (track_number - 1) (average = 6) */
|
||||||
db_for_each(dbe, next, track_db_get()) {
|
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(dbe)->tr_count;
|
||||||
}
|
}
|
||||||
average /= track_db_get()->db_size;
|
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_track, 1);
|
||||||
test_equal(queue_at(q, 0)->tr_count, 0);
|
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);
|
playlist_select(PL_LEAST_PLAYED);
|
||||||
test_equal(playlist_add(PL_LEAST_PLAYED, track_get(0)), (bool)false);
|
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++) {
|
for (i = 0; i < queue_size(q); i++) {
|
||||||
track = queue_at(q, i);
|
track = queue_at(q, i);
|
||||||
test_loop_equal(track->tr_track, i + 2, i);
|
test_loop_equal(track->tr_track, i + 2, i);
|
||||||
|
|
Loading…
Reference in New Issue