core/queue: Convert q_cur into a queue iterator
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
parent
8fb64015b4
commit
6fa78dbf3a
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 <struct sort_info> q_sort; /* The queue's sort settings. */
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue