X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/763d5e6ad88ef3ba1cd1d7742d060e4f1e54c6b8..0e4472a082cdbb50ee54e1886abc332f3e11bcce:/lib/queue.c diff --git a/lib/queue.c b/lib/queue.c index 1e5c1d4..940fde3 100644 --- a/lib/queue.c +++ b/lib/queue.c @@ -353,7 +353,7 @@ void queue_id(struct queue_entry *q) { struct queue_entry *queue_add(const char *track, const char *submitter, int where) { - struct queue_entry *q; + struct queue_entry *q, *beforeme; q = xmalloc(sizeof *q); q->track = xstrdup(track); @@ -369,11 +369,13 @@ struct queue_entry *queue_add(const char *track, const char *submitter, l_add(qhead.prev, q); break; case WHERE_BEFORE_RANDOM: - if(qhead.prev == &qhead /* Empty queue. */ - || qhead.prev->state != playing_random) /* No random track */ - l_add(qhead.prev, q); - else - l_add(qhead.prev->prev, q); /* Before random track. */ + /* We want to find the point in the queue before the block of random tracks + * at the end. */ + beforeme = &qhead; + while(beforeme->prev != &qhead + && beforeme->prev->state == playing_random) + beforeme = beforeme->prev; + l_add(beforeme->prev, q); break; } /* submitter will be a null pointer for a scratch */