From bd14afe3477b9e34741116fd04aafbbacf1704e4 Mon Sep 17 00:00:00 2001 From: Eugene Baklanov Date: Sat, 12 Nov 2016 08:11:14 +0700 Subject: [PATCH] Fix for priority order bug if reordering in SetRandom() Fix for the problem where order with priorities gets out of whack in case it's reordered by SetRandom() while another song is currently playing. What happens is, if some song is already playing and you have set some priorities before switching on the random mode, and then turn the mode on, the original code swaps position of the first song in the order (i.e., the highest priority song) with current, so that current is 0 (which it should be). The problem is, the "original" first song then goes to the place "current" song was after reordering, wherever that is, instead of going after the "current" song. This patch fixes the issue. Also the fix makes MoveOrder() public, because why shouldn't it be, anyway. It certainly makes more sense than just having SwapOrders() public for some reason. Signed-off-by: Eugene Baklanov --- src/queue/Playlist.cxx | 2 +- src/queue/Queue.hxx | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/queue/Playlist.cxx b/src/queue/Playlist.cxx index a97c99fa1..2249dc8f3 100644 --- a/src/queue/Playlist.cxx +++ b/src/queue/Playlist.cxx @@ -310,7 +310,7 @@ playlist::SetRandom(PlayerControl &pc, bool status) playlist is played after that */ unsigned current_order = queue.PositionToOrder(current_position); - queue.SwapOrders(0, current_order); + queue.MoveOrder(current_order, 0); current = 0; } else current = -1; diff --git a/src/queue/Queue.hxx b/src/queue/Queue.hxx index f7c07439e..7ca29bfca 100644 --- a/src/queue/Queue.hxx +++ b/src/queue/Queue.hxx @@ -282,6 +282,11 @@ struct Queue { std::swap(order[order1], order[order2]); } + /** + * Moves a song to a new position in the "order" list. + */ + void MoveOrder(unsigned from_order, unsigned to_order); + /** * Moves a song to a new position. */ @@ -350,11 +355,6 @@ struct Queue { uint8_t priority, int after_order); private: - /** - * Moves a song to a new position in the "order" list. - */ - void MoveOrder(unsigned from_order, unsigned to_order); - void MoveItemTo(unsigned from, unsigned to) { unsigned from_id = items[from].id;