From ab1a4c6c80a98b37c1ffac756f6400e6f185189d Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 27 Nov 2023 12:52:31 +0000 Subject: [PATCH] Change: Don't restart playback when toggling playlist shuffle. Instead update the selected playlist entry for the current song. --- src/music_gui.cpp | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/music_gui.cpp b/src/music_gui.cpp index ef6cc83606..490d80817e 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -87,6 +87,7 @@ struct MusicSystem { void PlaylistClear(); private: + void SetPositionBySetIndex(uint set_index); void ChangePlaylistPosition(int ofs); int playlist_position; @@ -184,30 +185,45 @@ void MusicSystem::ChangeMusicSet(const std::string &set_name) InvalidateWindowData(WC_MUSIC_WINDOW, 0, 1, true); } -/** Enable shuffle mode and restart playback */ +/** + * Set playlist position by set index. + * @param set_index Set index to select. + */ +void MusicSystem::SetPositionBySetIndex(uint set_index) +{ + auto it = std::find_if(std::begin(this->active_playlist), std::end(this->active_playlist), [&set_index](const PlaylistEntry &ple) { return ple.set_index == set_index; }); + if (it != std::end(this->active_playlist)) this->playlist_position = std::distance(std::begin(this->active_playlist), it); +} + +/** + * Enable shuffle mode. + */ void MusicSystem::Shuffle() { _settings_client.music.shuffle = true; + uint set_index = this->active_playlist[this->playlist_position].set_index; this->active_playlist = this->displayed_playlist; for (size_t i = 0; i < this->active_playlist.size(); i++) { size_t shuffle_index = InteractiveRandom() % (this->active_playlist.size() - i); std::swap(this->active_playlist[i], this->active_playlist[i + shuffle_index]); } - - if (_settings_client.music.playing) this->Play(); + this->SetPositionBySetIndex(set_index); InvalidateWindowData(WC_MUSIC_TRACK_SELECTION, 0); InvalidateWindowData(WC_MUSIC_WINDOW, 0); } -/** Disable shuffle and restart playback */ +/** + * Disable shuffle mode. + */ void MusicSystem::Unshuffle() { _settings_client.music.shuffle = false; - this->active_playlist = this->displayed_playlist; - if (_settings_client.music.playing) this->Play(); + uint set_index = this->active_playlist[this->playlist_position].set_index; + this->active_playlist = this->displayed_playlist; + this->SetPositionBySetIndex(set_index); InvalidateWindowData(WC_MUSIC_TRACK_SELECTION, 0); InvalidateWindowData(WC_MUSIC_WINDOW, 0);