core/queue: Remove Q_ADD_FRONT flag

And replace its use with a queue_add_front() function instead.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2016-09-08 09:08:18 -04:00
parent c59b097638
commit 9b4a1785a1
9 changed files with 50 additions and 43 deletions

View File

@ -34,13 +34,12 @@ static bool __artist_pl_add(void *data)
struct artist *artist = artist_lookup(playlist->pl_name);
struct db_entry *dbe, *next;
queue_set_flag(&playlist->pl_queue, Q_ADD_FRONT);
db_for_each(dbe, next, track_db_get()) {
if (TRACK(dbe)->tr_album->al_artist == artist)
queue_add(&playlist->pl_queue, TRACK(dbe));
queue_add_front(&playlist->pl_queue, TRACK(dbe));
}
queue_unset_flag(&playlist->pl_queue, Q_ADD_FRONT);
queue_resort(&playlist->pl_queue);
return true;
}

View File

@ -59,6 +59,15 @@ bool playlist_generic_add_track(struct playlist *playlist, struct track *track)
return true;
}
bool playlist_generic_add_track_front(struct playlist *playlist,
struct track *track)
{
if (queue_has(&playlist->pl_queue, track))
return false;
queue_add_front(&playlist->pl_queue, track);
return true;
}
bool playlist_generic_remove_track(struct playlist *playlist, struct track *track)
{
return queue_remove_all(&playlist->pl_queue, track);
@ -79,7 +88,7 @@ static bool __playlist_generic_update(void *data)
playlist_generic_remove_track(pud->pud_playlist, TRACK(dbe));
}
queue_unset_flag(&pud->pud_playlist->pl_queue, Q_ADD_FRONT);
queue_resort(&pud->pud_playlist->pl_queue);
g_free(pud);
return true;
}

View File

@ -42,13 +42,12 @@ static bool __lib_pl_add(void *data)
struct library *library = library_lookup(playlist->pl_name);
struct db_entry *dbe, *next;
queue_set_flag(&playlist->pl_queue, Q_ADD_FRONT);
db_for_each(dbe, next, track_db_get()) {
if (TRACK(dbe)->tr_library == library)
queue_add(&playlist->pl_queue, TRACK(dbe));
queue_add_front(&playlist->pl_queue, TRACK(dbe));
}
queue_unset_flag(&playlist->pl_queue, Q_ADD_FRONT);
queue_resort(&playlist->pl_queue);
return true;
}

View File

@ -25,7 +25,7 @@ static struct sys_playlist *sys_playlists[SYS_PL_NUM_PLAYLISTS];
static void sys_pl_generic_init(struct playlist *playlist, unsigned int flags,
struct queue_ops *ops)
{
playlist_generic_init(playlist, Q_REPEAT | Q_ADD_FRONT, ops);
playlist_generic_init(playlist, Q_REPEAT, ops);
}
static void sys_pl_update_init(struct playlist *playlist, unsigned int flags,
@ -65,6 +65,14 @@ static bool sys_pl_generic_add(struct playlist *playlist, struct track *track)
return playlist_generic_add_track(playlist, track);
}
static bool sys_pl_generic_add_front(struct playlist *playlist,
struct track *track)
{
if (queue_has(__sys_pl_queue(SYS_PL_HIDDEN), track))
return false;
return playlist_generic_add_track_front(playlist, track);
}
/*
@ -229,12 +237,12 @@ static struct sys_playlist sys_collection = {
static void sys_pl_history_init(struct playlist *playlist,
unsigned int flags, struct queue_ops *ops)
{
queue_init(&playlist->pl_queue, Q_REPEAT | Q_ADD_FRONT, ops, playlist);
queue_init(&playlist->pl_queue, Q_REPEAT, ops, playlist);
}
static bool sys_pl_history_add(struct playlist *playlist, struct track *track)
{
queue_add(&playlist->pl_queue, track);
queue_add_front(&playlist->pl_queue, track);
queue_iter_set(&playlist->pl_queue, &playlist->pl_queue.q_cur, 0);
return true;
}
@ -269,7 +277,7 @@ static bool sys_pl_unplayed_update(struct playlist *playlist,
{
if (track->tr_count > 0)
return false;
return sys_pl_generic_add(playlist, track) || true;
return sys_pl_generic_add_front(playlist, track) || true;
}
static struct sys_playlist sys_unplayed = {
@ -305,7 +313,7 @@ static bool sys_pl_most_played_update(struct playlist *playlist,
unsigned int average = track_db_average_plays();
if (track->tr_count <= average)
return false;
return sys_pl_generic_add(playlist, track) || true;
return sys_pl_generic_add_front(playlist, track) || true;
}
static struct sys_playlist sys_most_played = {
@ -341,7 +349,7 @@ static bool sys_pl_least_played_update(struct playlist *playlist,
unsigned int average = track_db_average_plays();
if (!track->tr_count || track->tr_count > average)
return false;
return sys_pl_generic_add(playlist, track) || true;
return sys_pl_generic_add_front(playlist, track) || true;
}
static struct sys_playlist sys_least_played = {

View File

@ -226,21 +226,20 @@ void queue_unset_flag(struct queue *queue, enum queue_flags flag)
if (!queue_has_flag(queue, flag))
return;
queue->q_flags &= ~flag;
if (flag == Q_ADD_FRONT) {
queue_resort(queue);
queue_iter_set(queue, &queue->q_cur, queue->q_cur.it_pos);
}
}
unsigned int queue_add(struct queue *queue, struct track *track)
{
if (queue_has_flag(queue, Q_ADD_FRONT))
return __queue_add_head(queue, track);
if (queue->q_sort)
return __queue_add_sorted(queue, track);
return __queue_add_tail(queue, track);
}
unsigned int queue_add_front(struct queue *queue, struct track *track)
{
return __queue_add_head(queue, track);
}
void queue_erase(struct queue *queue, unsigned int index)
{
struct queue_iter it;
@ -353,6 +352,7 @@ void queue_resort(struct queue *queue)
{
g_queue_sort(&queue->q_tracks, track_less_than, queue->q_sort);
queue_iter_set(queue, &queue->q_cur, queue->q_cur.it_pos);
for (unsigned int i = 0; i < queue_size(queue); i++)
__queue_updated(queue, i);
}

View File

@ -93,8 +93,9 @@ bool playlist_generic_can_select(struct playlist *);
/* Generic playlist clear operation. */
void playlist_generic_clear(struct playlist *);
/* Generic playlist add track operation. */
/* Generic playlist add track operations. */
bool playlist_generic_add_track(struct playlist *, struct track *);
bool playlist_generic_add_track_front(struct playlist *, struct track *);
/* Generic playlist remove track operation. */
bool playlist_generic_remove_track(struct playlist *, struct track *);

View File

@ -15,16 +15,16 @@ struct queue;
enum queue_flags {
Q_UNUSED_0 = (1 << 0), /* Removed: 6.5.4 */
Q_RANDOM = (1 << 1), /* Queue will pick songs randomly. */
Q_REPEAT = (1 << 2), /* Queue will not remove songs when picked. */
Q_UNUSED_3 = (1 << 3), /* Removed: 6.5.4 */
Q_UNUSED_4 = (1 << 4), /* Removed: 6.5.4 */
Q_UNUSED_5 = (1 << 5), /* Removed: 6.5.4 */
Q_ADD_FRONT = (1 << 6), /* Queue will add new tracks at the front. */
Q_UNUSED_0 = (1 << 0), /* Removed: 6.5.4 */
Q_RANDOM = (1 << 1), /* Queue will pick songs randomly. */
Q_REPEAT = (1 << 2), /* Queue will not remove songs when picked. */
Q_UNUSED_3 = (1 << 3), /* Removed: 6.5.4 */
Q_UNUSED_4 = (1 << 4), /* Removed: 6.5.4 */
Q_UNUSED_5 = (1 << 5), /* Removed: 6.5.4 */
Q_UNUSED_6 = (1 << 6), /* Removed: 6.5.4 */
};
#define Q_UNUSED_MASK (~(Q_UNUSED_0 | Q_UNUSED_3 | Q_UNUSED_4 | Q_UNUSED_5))
#define Q_UNUSED_MASK (~(Q_UNUSED_0 | Q_UNUSED_3 | Q_UNUSED_4 | Q_UNUSED_5 | Q_UNUSED_6))
struct queue_ops {
@ -158,6 +158,9 @@ static inline struct track *queue_at(struct queue *queue, unsigned int index)
/* Called to add a track to the queue. */
unsigned int queue_add(struct queue *, struct track *);
/* Called to add a track to the front of the queue. */
unsigned int queue_add_front(struct queue *, struct track *);
/*
* Called to erase a track from the queue by index.
* This can be prevented if qop_erase() returns "false".

View File

@ -90,7 +90,6 @@ do { \
g_assert_nonnull(queue); \
__test_playlist_state(name, 0, false, false); \
while (idle_run_task()) {}; \
g_assert_false(queue_has_flag(queue, Q_ADD_FRONT)); \
__test_playlist_state(name, ex_size, ex_track0, ex_track1); \
} while (0)
@ -129,7 +128,6 @@ static void test_favorites()
struct queue *queue = playlist_get_queue(PL_SYSTEM, "Favorites");
g_assert_nonnull(queue);
g_assert_false(queue_has_flag(queue, Q_ADD_FRONT));
g_assert_true(queue_has_flag(queue, Q_REPEAT));
__test_playlist_id("Favorites", SYS_PL_FAVORITES);
@ -151,7 +149,6 @@ static void test_hidden()
g_assert_nonnull(queue);
g_assert_null(playlist_get_queue(PL_SYSTEM, "Banned"));
g_assert_false(queue_has_flag(queue, Q_ADD_FRONT));
g_assert_true(queue_has_flag(queue, Q_REPEAT));
__test_playlist_id("Hidden", SYS_PL_HIDDEN);
@ -172,7 +169,6 @@ static void test_queued()
struct queue *queue = playlist_get_queue(PL_SYSTEM, "Queued Tracks");
g_assert_nonnull(queue);
g_assert_false(queue_has_flag(queue, Q_ADD_FRONT));
g_assert_false(queue_has_flag(queue, Q_REPEAT));
g_assert_cmpuint(g_slist_length(queue->q_sort), ==, 0);
@ -209,7 +205,6 @@ static void test_collection()
pl_system_init(NULL);
g_assert_nonnull(queue);
g_assert_true(queue_has_flag(queue, Q_ADD_FRONT));
g_assert_true(queue_has_flag(queue, Q_REPEAT));
__test_playlist_id("Collection", SYS_PL_COLLECTION);
@ -230,7 +225,6 @@ static void test_history()
struct queue *queue = playlist_get_queue(PL_SYSTEM, "History");
g_assert_nonnull(queue);
g_assert_true(queue_has_flag(queue, Q_ADD_FRONT));
g_assert_true(queue_has_flag(queue, Q_REPEAT));
__test_playlist_id("History", SYS_PL_HISTORY);
__test_playlist_noselect("History");
@ -271,7 +265,6 @@ static void test_unplayed()
pl_system_init(NULL);
g_assert_nonnull(queue);
g_assert_true(queue_has_flag(queue, Q_ADD_FRONT));
g_assert_true(queue_has_flag(queue, Q_REPEAT));
__test_playlist_id("Unplayed", SYS_PL_UNPLAYED);
@ -316,7 +309,6 @@ static void test_most_played()
pl_system_init(NULL);
g_assert_nonnull(most);
g_assert_true(queue_has_flag(most, Q_ADD_FRONT));
g_assert_true(queue_has_flag(most, Q_REPEAT));
__test_playlist_id("Most Played", SYS_PL_MOST_PLAYED);
@ -360,7 +352,6 @@ static void test_least_played()
pl_system_init(NULL);
g_assert_nonnull(least);
g_assert_true(queue_has_flag(least, Q_ADD_FRONT));
g_assert_true(queue_has_flag(least, Q_REPEAT));
__test_playlist_id("Least Played", SYS_PL_LEAST_PLAYED);

View File

@ -118,18 +118,15 @@ static void test_flags()
g_assert_false(queue_has_flag(&q, Q_UNUSED_3));
g_assert_false(queue_has_flag(&q, Q_UNUSED_4));
g_assert_false(queue_has_flag(&q, Q_UNUSED_5));
g_assert_false(queue_has_flag(&q, Q_ADD_FRONT));
g_assert_false(queue_has_flag(&q, Q_UNUSED_6));
queue_set_flag(&q, Q_RANDOM);
queue_set_flag(&q, Q_REPEAT);
queue_set_flag(&q, Q_ADD_FRONT);
g_assert_true(queue_has_flag(&q, Q_RANDOM));
g_assert_true(queue_has_flag(&q, Q_REPEAT));
g_assert_true(queue_has_flag(&q, Q_ADD_FRONT));
queue_unset_flag(&q, Q_RANDOM);
queue_unset_flag(&q, Q_REPEAT);
queue_unset_flag(&q, Q_ADD_FRONT);
g_assert_cmpuint(q.q_flags, ==, 0);
}
@ -343,11 +340,11 @@ static void test_sorting()
unsigned int i;
struct queue q;
queue_init(&q, Q_ADD_FRONT, &test_ops, NULL);
queue_init(&q, 0, &test_ops, NULL);
for (i = 0; i < 13; i++) {
track = track_get(i);
track->tr_count = (track->tr_track <= 6) ? 4 : 2;
queue_add(&q, track);
queue_add_front(&q, track);
}
for (i = 0; i < 13; i++) {