From 847205923245e08a5ee4ddf0ca7f04ccaea4be2d Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 6 Oct 2021 10:03:25 -0700 Subject: [PATCH] Fix playback order; add shuffle method --- RedBookPlayer.Models/Hardware/Player.cs | 48 ++++++++++++++++++++----- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/RedBookPlayer.Models/Hardware/Player.cs b/RedBookPlayer.Models/Hardware/Player.cs index 6f208da..360ace7 100644 --- a/RedBookPlayer.Models/Hardware/Player.cs +++ b/RedBookPlayer.Models/Hardware/Player.cs @@ -418,7 +418,7 @@ namespace RedBookPlayer.Models.Hardware // If the disc exists, add it to the dictionary if(_opticalDiscs[CurrentDisc] != null) { - if (opticalDisc is CompactDisc compactDisc) + if(opticalDisc is CompactDisc compactDisc) _availableTrackList[CurrentDisc] = compactDisc.Tracks.Select(t => (int)t.TrackSequence).OrderBy(s => s).ToList(); else _availableTrackList[CurrentDisc] = Enumerable.Range(1, opticalDisc.TotalTracks).ToList(); @@ -430,14 +430,22 @@ namespace RedBookPlayer.Models.Hardware _availableTrackList[CurrentDisc] = new List(); } - // Loop through the dictionary and repopulate the playback order - for(int i = 0; i < _numberOfDiscs; i++) + // Repopulate the playback order + _trackPlaybackOrder = new List>(); + if(DiscHandling == DiscHandling.SingleDisc) { - if(_availableTrackList[i] == null || _availableTrackList[i].Count == 0) - continue; - - List availableTracks = _availableTrackList[i]; - _trackPlaybackOrder.AddRange(availableTracks.Select(t => new KeyValuePair(i, t))); + List availableTracks = _availableTrackList[CurrentDisc]; + if(availableTracks != null && availableTracks.Count > 0) + _trackPlaybackOrder.AddRange(availableTracks.Select(t => new KeyValuePair(CurrentDisc, t))); + } + else if(DiscHandling == DiscHandling.MultiDisc) + { + for(int i = 0; i < _numberOfDiscs; i++) + { + List availableTracks = _availableTrackList[i]; + if(availableTracks != null && availableTracks.Count > 0) + _trackPlaybackOrder.AddRange(availableTracks.Select(t => new KeyValuePair(i, t))); + } } } @@ -497,6 +505,24 @@ namespace RedBookPlayer.Models.Hardware } } + /// + /// Shuffle the current track order + /// + public void ShuffleTracks() + { + List> newPlaybackOrder = new List>(); + Random random = new Random(); + + while(_trackPlaybackOrder.Count > 0) + { + int next = random.Next(0, _trackPlaybackOrder.Count - 1); + newPlaybackOrder.Add(_trackPlaybackOrder[next]); + _trackPlaybackOrder.RemoveAt(next); + } + + _trackPlaybackOrder = newPlaybackOrder; + } + /// /// Stop current playback /// @@ -1127,7 +1153,11 @@ namespace RedBookPlayer.Models.Hardware /// Set disc handling method /// /// New playback value - public void SetDiscHandling(DiscHandling discHandling) => DiscHandling = discHandling; + public void SetDiscHandling(DiscHandling discHandling) + { + DiscHandling = discHandling; + LoadTrackList(); + } /// /// Set the value for loading hidden tracks [CompactDisc only]