diff --git a/core/deck.cpp b/core/deck.cpp index f74087ef..8528e42c 100644 --- a/core/deck.cpp +++ b/core/deck.cpp @@ -220,7 +220,7 @@ struct track *deck :: next() if (track) { queue_remove_all(&recent_queue, track); queue_add(&recent_queue, track); - recent_queue.q_cur = 0; + _q_iter_set(&recent_queue.q_tracks, &recent_queue.q_cur, 0); } return track; } diff --git a/core/queue.cpp b/core/queue.cpp index 9c17781f..49522b22 100644 --- a/core/queue.cpp +++ b/core/queue.cpp @@ -46,8 +46,8 @@ static inline void __queue_remove(struct queue *queue, struct _q_iter *it) struct track *track = (struct track *)_q_remove_it(&queue->q_tracks, it); queue->q_length -= track->tr_length; - if (queue->q_cur == pos) - queue->q_cur--; + if (queue->q_cur.it_pos == pos) + _q_iter_prev(&queue->q_cur); if (queue->q_ops) queue->q_ops->qop_removed(queue, pos); } @@ -58,6 +58,15 @@ static inline void __queue_updated(struct queue *queue, unsigned int pos) queue->q_ops->qop_updated(queue, pos); } +static inline track *__queue_selected(struct queue *queue) +{ + struct track *track = (struct track *)_q_iter_val(&queue->q_cur); + + if (queue_has_flag(queue, Q_REPEAT) == false) + __queue_remove(queue, &queue->q_cur); + return track; +} + static inline void __queue_save(struct queue *queue, enum queue_flags flag) { if (queue->q_ops && queue_has_flag(queue, flag)) @@ -67,11 +76,13 @@ static inline void __queue_save(struct queue *queue, enum queue_flags flag) void queue_init(struct queue *queue, unsigned int flags, const struct queue_ops *ops) { - queue->q_cur = -1; queue->q_flags = flags; queue->q_length = 0; queue->q_ops = ops; + queue->q_cur.it_pos = -1; + queue->q_cur.it_iter = NULL; + _q_init(&queue->q_tracks); } @@ -134,31 +145,32 @@ void queue_updated(struct queue *queue, struct track *track) void queue_selected(struct queue *queue, unsigned int index) { - queue->q_cur = index; - if (queue_has_flag(queue, Q_REPEAT) == false) - queue_remove(queue, index); + if (queue->q_cur.it_pos != index) + _q_iter_set(&queue->q_tracks, &queue->q_cur, index); + __queue_selected(queue); } struct track *queue_next(struct queue *queue) { - unsigned int size = queue_size(queue); - struct track *res; + unsigned int pos, size = queue_size(queue); if (!queue_has_flag(queue, Q_ENABLED)) return NULL; else if (size == 0) return NULL; - else if (size == 1) - queue->q_cur = 0; - else if (queue_has_flag(queue, Q_RANDOM)) - queue->q_cur += random_range(1, size / 2); - else - queue->q_cur++; - queue->q_cur %= size; - res = queue_at(queue, queue->q_cur); - queue_selected(queue, queue->q_cur); - return res; + if (size == 1) + _q_iter_set(&queue->q_tracks, &queue->q_cur, 0); + else if (queue_has_flag(queue, Q_RANDOM)) { + pos = queue->q_cur.it_pos + random_range(1, size / 2); + _q_iter_set(&queue->q_tracks, &queue->q_cur, pos % size); + } else { + _q_iter_next(&queue->q_cur); + if (!queue->q_cur.it_iter) + _q_iter_set(&queue->q_tracks, &queue->q_cur, 0); + } + + return __queue_selected(queue); } void queue_sort(struct queue *queue, enum compare_t field, bool reset) diff --git a/include/core/queue.h b/include/core/queue.h index 79965c22..07eda4e5 100644 --- a/include/core/queue.h +++ b/include/core/queue.h @@ -62,10 +62,10 @@ struct sort_info { * ... << _flags << _tracks.size() << tracks[N]->index() << ...; */ struct queue { - unsigned int q_cur; /* The queue's last-played index. */ - unsigned int q_flags; /* The queue's set of flags. */ - unsigned int q_length; /* The queue's total runtime (in seconds). */ - struct _queue q_tracks; /* The queue's list of tracks. */ + unsigned int q_flags; /* The queue's set of flags. */ + unsigned int q_length; /* The queue's total runtime (in seconds). */ + struct _queue q_tracks; /* The queue's list of tracks. */ + struct _q_iter q_cur; /* The queue's last-played position. */ std :: vector q_sort; /* The queue's sort settings. */ diff --git a/tests/core/queue.cpp b/tests/core/queue.cpp index 883549e7..28c5e17f 100644 --- a/tests/core/queue.cpp +++ b/tests/core/queue.cpp @@ -86,7 +86,7 @@ static void test_init() __test_init_core(); queue_init(&q, 0, NULL); - test_equal(q.q_cur, (unsigned int)-1); + test_equal(q.q_cur.it_pos, (unsigned int)-1); test_equal(q.q_flags, 0); test_equal(q.q_length, 0); test_equal(q.q_sort.size(), (size_t)0); @@ -95,7 +95,7 @@ static void test_init() queue_init(&q, Q_ENABLED | Q_RANDOM, &test_ops); - test_equal(q.q_cur, (unsigned int )-1); + test_equal(q.q_cur.it_pos, (unsigned int)-1); test_equal(q.q_flags, Q_ENABLED | Q_RANDOM); test_equal(q.q_length, 0); test_equal(q.q_sort.size(), 0); @@ -376,6 +376,7 @@ static void test_sorting() } test_loop_passed(); test_equal(count_sort, 6); + g_queue_clear(&q.q_tracks._queue); __test_deinit_core(); }