From 688880bc0b22d13321da62ae93363e4b85846f68 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Sun, 25 Jan 2009 14:00:51 +0100
Subject: queue: added queue_shuffle_order_last()

This function shuffles the last song of a range.  This is used by
addSongToPlaylist().
---
 src/playlist.c | 9 +++------
 src/queue.c    | 7 +++++++
 src/queue.h    | 8 ++++++++
 3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/src/playlist.c b/src/playlist.c
index 2eecc3bea..6578713db 100644
--- a/src/playlist.c
+++ b/src/playlist.c
@@ -442,12 +442,9 @@ addSongToPlaylist(struct song *song, unsigned *added_id)
 			start = playlist.queued + 1;
 		else
 			start = playlist.current + 1;
-		if (start < queue_length(&playlist.queue)) {
-			unsigned swap = g_rand_int_range(g_rand, start,
-							 queue_length(&playlist.queue));
-			queue_swap_order(&playlist.queue,
-					 queue_length(&playlist.queue) - 1, swap);
-		}
+		if (start < queue_length(&playlist.queue))
+			queue_shuffle_order_last(&playlist.queue, start,
+						 queue_length(&playlist.queue));
 	}
 
 	incrPlaylistVersion();
diff --git a/src/queue.c b/src/queue.c
index 983c5e43c..73adb2f49 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -254,6 +254,13 @@ queue_shuffle_order(struct queue *queue)
 						  queue->length));
 }
 
+void
+queue_shuffle_order_last(struct queue *queue, unsigned start, unsigned end)
+{
+	queue_swap_order(queue, end - 1,
+			 g_rand_int_range(queue->rand, start, end));
+}
+
 void
 queue_shuffle_range(struct queue *queue, unsigned start, unsigned end)
 {
diff --git a/src/queue.h b/src/queue.h
index b355a6a3e..b43e9c1dd 100644
--- a/src/queue.h
+++ b/src/queue.h
@@ -319,6 +319,14 @@ queue_restore_order(struct queue *queue)
 void
 queue_shuffle_order(struct queue *queue);
 
+/**
+ * Shuffles the virtual order of the last song in the specified
+ * (order) range.  This is used in random mode after a song has been
+ * appended by queue_append().
+ */
+void
+queue_shuffle_order_last(struct queue *queue, unsigned start, unsigned end);
+
 /**
  * Shuffles a (position) range in the queue.  The songs are physically
  * shuffled, not by using the "order" mapping.
-- 
cgit v1.2.3