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;
+ }
}
///