From 6f35f3274f2a845307cbc5c5ef6c5bde952fdcb4 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 29 Nov 2023 02:30:10 +0000 Subject: [PATCH] Fix ab1a4c6c: Crash if the "No Music" set is loaded because there is no current set_index. (#11511) Add a helper function to get the current set_index which which checks it is in range. --- src/music_gui.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/music_gui.cpp b/src/music_gui.cpp index 335b9dd617..ebbc4ddf7b 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -87,6 +87,7 @@ struct MusicSystem { void PlaylistClear(); private: + uint GetSetIndex(); void SetPositionBySetIndex(uint set_index); void ChangePlaylistPosition(int ofs); int playlist_position; @@ -191,6 +192,17 @@ void MusicSystem::SetPositionBySetIndex(uint set_index) if (it != std::end(this->active_playlist)) this->playlist_position = std::distance(std::begin(this->active_playlist), it); } +/** + * Get set index from current playlist position. + * @return current set index, or UINT_MAX if nothing is selected. + */ +uint MusicSystem::GetSetIndex() +{ + return static_cast(this->playlist_position) < this->active_playlist.size() + ? this->active_playlist[this->playlist_position].set_index + : UINT_MAX; +} + /** * Enable shuffle mode. */ @@ -198,7 +210,7 @@ void MusicSystem::Shuffle() { _settings_client.music.shuffle = true; - uint set_index = this->active_playlist[this->playlist_position].set_index; + uint set_index = this->GetSetIndex(); 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); @@ -217,7 +229,7 @@ void MusicSystem::Unshuffle() { _settings_client.music.shuffle = false; - uint set_index = this->active_playlist[this->playlist_position].set_index; + uint set_index = this->GetSetIndex(); this->active_playlist = this->displayed_playlist; this->SetPositionBySetIndex(set_index);