From 26293f4882d7476459a0aa90e992ad67a4585375 Mon Sep 17 00:00:00 2001 From: waker Date: Fri, 6 Apr 2012 10:32:38 +0200 Subject: added random sort (based on patch from defusix) --- playlist.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) (limited to 'playlist.c') diff --git a/playlist.c b/playlist.c index d339d1ac..4975faf0 100644 --- a/playlist.c +++ b/playlist.c @@ -3174,7 +3174,13 @@ qsort_cmp_func (const void *a, const void *b) { } void -plt_sort (playlist_t *playlist, int iter, int id, const char *format, int ascending) { +plt_sort (playlist_t *playlist, int iter, int id, const char *format, int order) { + if (order == DDB_SORT_RANDOM) { + plt_sort_random (playlist, iter); + return; + } + int ascending = order == DDB_SORT_DESCENDING ? 0 : 1; + if (id == DB_COLUMN_FILENUMBER || !playlist->head[iter] || !playlist->head[iter]->next[iter]) { return; } @@ -3233,6 +3239,56 @@ plt_sort (playlist_t *playlist, int iter, int id, const char *format, int ascend UNLOCK; } +void +plt_sort_random (playlist_t *playlist, int iter) { + if (!playlist->head[iter] || !playlist->head[iter]->next[iter]) { + return; + } + + LOCK; + + const int playlist_count = playlist->count[iter]; + playItem_t **array = malloc (playlist_count * sizeof (playItem_t *)); + int idx = 0; + for (playItem_t *it = playlist->head[iter]; it; it = it->next[iter], idx++) { + array[idx] = it; + } + + //randomize array + for (int swap_a = 0; swap_a < playlist_count - 1; swap_a++) { + //select random item above swap_a-1 + const int swap_b = swap_a + (rand() / (float)RAND_MAX * (playlist_count - swap_a)); + + //swap a with b + playItem_t* const swap_temp = array[swap_a]; + array[swap_a] = array[swap_b]; + array[swap_b] = swap_temp; + + } + + playItem_t *prev = NULL; + playlist->head[iter] = 0; + for (idx = 0; idx < playlist->count[iter]; idx++) { + playItem_t *it = array[idx]; + it->prev[iter] = prev; + it->next[iter] = NULL; + if (!prev) { + playlist->head[iter] = it; + } + else { + prev->next[iter] = it; + } + prev = it; + } + playlist->tail[iter] = array[playlist->count[iter]-1]; + + free (array); + + plt_modified (playlist); + + UNLOCK; +} + void plt_reset_cursor (playlist_t *playlist) { int i; -- cgit v1.2.3