diff --git a/RedBookPlayer.Models/Hardware/Player.cs b/RedBookPlayer.Models/Hardware/Player.cs index 517e51f..6f208da 100644 --- a/RedBookPlayer.Models/Hardware/Player.cs +++ b/RedBookPlayer.Models/Hardware/Player.cs @@ -298,9 +298,14 @@ namespace RedBookPlayer.Models.Hardware private OpticalDiscBase[] _opticalDiscs; /// - /// List of available tracks + /// List of available tracks organized by disc /// - private Dictionary> _trackList; + private Dictionary> _availableTrackList; + + /// + /// Current track playback order + /// + private List> _trackPlaybackOrder; /// /// Last volume for mute toggling @@ -343,12 +348,14 @@ namespace RedBookPlayer.Models.Hardware _filterStage = new FilterStage(); _soundOutput = new SoundOutput(defaultVolume); - _trackList = new Dictionary>(); + _availableTrackList = new Dictionary>(); for(int i = 0; i < _numberOfDiscs; i++) { - _trackList.Add(i, new List()); + _availableTrackList.Add(i, new List()); } + _trackPlaybackOrder = new List>(); + PropertyChanged += HandlePlaybackModes; } @@ -407,10 +414,31 @@ namespace RedBookPlayer.Models.Hardware private void LoadTrackList() { OpticalDiscBase opticalDisc = _opticalDiscs[CurrentDisc]; - if (opticalDisc is CompactDisc compactDisc) - _trackList[CurrentDisc] = compactDisc.Tracks.Select(t => (int)t.TrackSequence).OrderBy(s => s).ToList(); + + // If the disc exists, add it to the dictionary + if(_opticalDiscs[CurrentDisc] != null) + { + 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(); + } + + // If the disc is null, then make sure it's removed else - _trackList[CurrentDisc] = Enumerable.Range(1, opticalDisc.TotalTracks).ToList(); + { + _availableTrackList[CurrentDisc] = new List(); + } + + // Loop through the dictionary and repopulate the playback order + for(int i = 0; i < _numberOfDiscs; i++) + { + if(_availableTrackList[i] == null || _availableTrackList[i].Count == 0) + continue; + + List availableTracks = _availableTrackList[i]; + _trackPlaybackOrder.AddRange(availableTracks.Select(t => new KeyValuePair(i, t))); + } } #region Playback (UI) @@ -498,10 +526,20 @@ namespace RedBookPlayer.Models.Hardware return; Stop(); - _soundOutput.Eject(); _opticalDiscs[CurrentDisc] = null; - PlayerState = PlayerState.NoDisc; - Initialized = false; + LoadTrackList(); + + // Only de-initialize the player if all discs are ejected + if(_opticalDiscs.All(d => d == null || !d.Initialized)) + { + _soundOutput.Eject(); + PlayerState = PlayerState.NoDisc; + Initialized = false; + } + else + { + PlayerState = PlayerState.Stopped; + } } ///