diff -Nurp audacious-1.5.1-orig/src/audacious/playlist.c audacious-1.5.1-strait/src/audacious/playlist.c
--- audacious-1.5.1-orig/src/audacious/playlist.c	2008-05-23 17:00:34.000000000 -0500
+++ audacious-1.5.1-strait/src/audacious/playlist.c	2008-09-30 15:15:36.158974000 -0500
@@ -2246,48 +2246,55 @@ playlist_reverse(Playlist *playlist)
     PLAYLIST_UNLOCK(playlist);
 }
 
+static void swap(int * a, int * b)
+{
+        int tmp = *a;
+        *a = *b;
+        *b = tmp;
+}
+
 static GList *
 playlist_shuffle_list(Playlist *playlist, GList * list)
 {
-    /*
-     * Note that this doesn't make a copy of the original list.
-     * The pointer to the original list is not valid after this
-     * fuction is run.
-     */
-    gint len = g_list_length(list);
-    gint i, j;
-    GList *node, **ptrs;
+#define CHUNK_SIZE 2
 
-    if (!playlist)
-        return NULL;
-
-    REQUIRE_LOCK(playlist->mutex);
-
-    if (!len)
-        return NULL;
+        /* Caller should hold playlist mutex */
+        int len = g_list_length(list);
+        int i;
+        int offset = random()%CHUNK_SIZE;
+        int slen = len/CHUNK_SIZE + (len%CHUNK_SIZE ? 1 : 0);
+        int scramble[slen];
+        GList *newlist = NULL;
 
-    ptrs = g_new(GList *, len);
+        if (!len)
+                return NULL;
 
-    for (node = list, i = 0; i < len; node = g_list_next(node), i++)
-        ptrs[i] = node;
+        for(i = 0; i < slen; i++)
+                scramble[i] = i;
 
-    j = g_random_int_range(0, len);
-    list = ptrs[j];
-    ptrs[j]->next = NULL;
-    ptrs[j] = ptrs[0];
+        for(i = 0; i < slen - 1; i++)
+        {
+                int r = random()%(slen - i - 1) + 1;
+                swap(&scramble[i], &scramble[i + r]);   
+        }               
 
-    for (i = 1; i < len; i++) {
-        j = g_random_int_range(0, len - i);
-        list->prev = ptrs[i + j];
-        ptrs[i + j]->next = list;
-        list = ptrs[i + j];
-        ptrs[i + j] = ptrs[i];
-    }
-    list->prev = NULL;
+        for(i = 0; i < slen; i++)
+        {
+                PlaylistEntry * foo;
+                int j, n = scramble[i]*CHUNK_SIZE;
 
-    g_free(ptrs);
+                for(j = 0; j < CHUNK_SIZE; j++)
+                {
+                    if(n+j < len)
+                    {
+                        foo = (PlaylistEntry *)g_list_nth_data(list, (n+j+offset)%len);
+                        foo->chunkpos = j;
+                        newlist = g_list_append(newlist, foo);
+                    }
+                }
+        }
 
-    return list;
+        return newlist;
 }
 
 void
diff -Nurp audacious-1.5.1-orig/src/audacious/playlist.h audacious-1.5.1-strait/src/audacious/playlist.h
--- audacious-1.5.1-orig/src/audacious/playlist.h	2008-05-23 17:00:34.000000000 -0500
+++ audacious-1.5.1-strait/src/audacious/playlist.h	2008-09-30 15:15:36.559358000 -0500
@@ -71,6 +71,7 @@ struct _PlaylistEntry {
     InputPlugin *decoder;
     Tuple *tuple;		/* cached entry tuple, if available */
     gboolean title_is_valid;    /* set it to FALSE after title format changing to update title even if tuple is present --asphyx */
+    gint chunkpos;
 };
 
 #define PLAYLIST(x)  ((Playlist *)(x))
