diff --git a/core/queue.c b/core/queue.c index 94b29b98..ccd1beb9 100644 --- a/core/queue.c +++ b/core/queue.c @@ -51,6 +51,34 @@ static inline unsigned int __queue_added(struct queue *queue, return pos; } +static inline unsigned int __queue_add_head(struct queue *queue, + struct track *track) +{ + g_queue_push_head(&queue->q_tracks._queue, track); + return __queue_added(queue, track, 0); +} + +static inline unsigned int __queue_add_tail(struct queue *queue, + struct track *track) +{ + g_queue_push_tail(&queue->q_tracks._queue, track); + return __queue_added(queue, track, queue_size(queue) - 1); +} + +static inline unsigned int __queue_add_sorted(struct queue *queue, + struct track *track) +{ + struct _q_iter it; + + _q_for_each(&queue->q_tracks, &it) { + if (track_less_than(_q_iter_val(&it), track, queue->q_sort) > 0) { + g_queue_insert_before(&queue->q_tracks._queue, it.it_iter, track); + return __queue_added(queue, track, it.it_pos); + } + } + return __queue_add_tail(queue, track); +} + static inline bool __queue_erase(struct queue *queue, struct _q_iter *it) { struct track *track = (struct track *)_q_iter_val(it); @@ -62,12 +90,14 @@ static inline bool __queue_erase(struct queue *queue, struct _q_iter *it) static inline void __queue_remove(struct queue *queue, struct _q_iter *it) { + struct track *track = (struct track *)_q_iter_val(it); unsigned int pos = it->it_pos; - struct track *track = (struct track *)_q_remove_it(&queue->q_tracks, it); + GList *link = it->it_iter; + + _q_iter_prev(it); + g_queue_delete_link(&queue->q_tracks._queue, link); queue->q_length -= track->tr_length; - if (queue->q_cur.it_pos == pos) - _q_iter_prev(&queue->q_cur); if (queue->q_ops) queue->q_ops->qop_removed(queue, pos); } @@ -112,7 +142,7 @@ void queue_init(struct queue *queue, unsigned int flags, queue->q_cur.it_pos = -1; queue->q_cur.it_iter = NULL; - _q_init(&queue->q_tracks); + g_queue_init(&queue->q_tracks._queue); queue->q_private = __queue_init(queue); } @@ -139,17 +169,11 @@ void queue_unset_flag(struct queue *queue, enum queue_flags flag) unsigned int queue_add(struct queue *queue, struct track *track) { - unsigned int pos; - if (queue_has_flag(queue, Q_ADD_FRONT)) - pos = _q_add_head(&queue->q_tracks, track); - else if (queue->q_sort) - pos = _q_add_sorted(&queue->q_tracks, track, - track_less_than, queue->q_sort); - else - pos = _q_add_tail(&queue->q_tracks, track); - - return __queue_added(queue, track, pos); + return __queue_add_head(queue, track); + if (queue->q_sort) + return __queue_add_sorted(queue, track); + return __queue_add_tail(queue, track); } void queue_erase(struct queue *queue, unsigned int index) @@ -186,7 +210,7 @@ void queue_clear(struct queue *queue) { unsigned int n = queue_size(queue); - _q_clear(&queue->q_tracks); + g_queue_clear(&queue->q_tracks._queue); __queue_clear(queue, n); } @@ -235,7 +259,7 @@ struct track *queue_next(struct queue *queue) void queue_resort(struct queue *queue) { - _q_sort(&queue->q_tracks, track_less_than, queue->q_sort); + g_queue_sort(&queue->q_tracks._queue, track_less_than, queue->q_sort); for (unsigned int i = 0; i < queue_size(queue); i++) __queue_updated(queue, i); diff --git a/include/core/queue.h b/include/core/queue.h index cbc36786..b306c62e 100644 --- a/include/core/queue.h +++ b/include/core/queue.h @@ -87,7 +87,7 @@ static inline bool queue_has_flag(struct queue *queue, enum queue_flags flag) /* Called to find the size of the queue. */ static inline unsigned int queue_size(struct queue *queue) { - return _q_size(&queue->q_tracks); + return g_queue_get_length(&queue->q_tracks._queue); } /* Called to access the queued track at a given index. */