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.
This commit is contained in:
Peter Nelson 2023-11-29 02:30:10 +00:00 committed by GitHub
parent 27082f9efa
commit 6f35f3274f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 14 additions and 2 deletions

View File

@ -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<size_t>(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);