Changeset - r28187:b8f14950e8da
[Not reviewed]
master
0 1 0
Peter Nelson - 10 months ago 2023-11-27 12:52:31
peter1138@openttd.org
Change: Don't restart playback when toggling playlist shuffle.

Instead update the selected playlist entry for the current song.
1 file changed with 22 insertions and 6 deletions:
0 comments (0 inline, 0 general)
src/music_gui.cpp
Show inline comments
 
@@ -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 s
 
	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;
 

	
 
	uint set_index = this->active_playlist[this->playlist_position].set_index;
 
	this->active_playlist = this->displayed_playlist;
 

	
 
	if (_settings_client.music.playing) this->Play();
 
	this->SetPositionBySetIndex(set_index);
 

	
 
	InvalidateWindowData(WC_MUSIC_TRACK_SELECTION, 0);
 
	InvalidateWindowData(WC_MUSIC_WINDOW, 0);
0 comments (0 inline, 0 general)