diff --git a/RedBookPlayer.Models/Hardware/Player.cs b/RedBookPlayer.Models/Hardware/Player.cs
index d2da495..89cecb0 100644
--- a/RedBookPlayer.Models/Hardware/Player.cs
+++ b/RedBookPlayer.Models/Hardware/Player.cs
@@ -828,12 +828,12 @@ namespace RedBookPlayer.Models.Hardware
/// Select a track by number
///
/// Track number to attempt to load
+ /// True if the track was changed, false otherwise
/// TODO: This needs to reset the pointer in the track playback order
- /// TODO: There needs to be a SelectRelativeTrack variant that follows order and then invokes this
- public void SelectTrack(int trackNumber)
+ public bool SelectTrack(int trackNumber)
{
if(_opticalDiscs[CurrentDisc] == null || !_opticalDiscs[CurrentDisc].Initialized)
- return;
+ return false;
PlayerState wasPlaying = PlayerState;
if(wasPlaying == PlayerState.Playing)
@@ -860,7 +860,7 @@ namespace RedBookPlayer.Models.Hardware
if(wasPlaying == PlayerState.Playing)
Play();
- return;
+ return true;
}
else if((trackNumber < 1 && !LoadHiddenTracks) || (trackNumber < (int)compactDisc.Tracks.Min(t => t.TrackSequence)))
{
@@ -874,7 +874,7 @@ namespace RedBookPlayer.Models.Hardware
if(wasPlaying == PlayerState.Playing)
Play();
- return;
+ return true;
}
}
@@ -912,7 +912,7 @@ namespace RedBookPlayer.Models.Hardware
// Cache the current track for easy access
Track track = compactDisc.GetTrack(cachedTrackNumber);
if(track == null)
- return;
+ return false;
// If the track is playable, just return
if((track.TrackType == TrackType.Audio || DataPlayback != DataPlayback.Skip)
@@ -966,6 +966,40 @@ namespace RedBookPlayer.Models.Hardware
_opticalDiscs[CurrentDisc].LoadTrack(trackNumber);
}
+ if(wasPlaying == PlayerState.Playing)
+ Play();
+
+ return true;
+ }
+
+ ///
+ /// Select a track in the relative track list by number
+ ///
+ /// Relative track number to attempt to load
+ public void SelectRelativeTrack(int relativeTrackNumber)
+ {
+ if(_trackPlaybackOrder == null || _trackPlaybackOrder.Count == 0)
+ return;
+
+ PlayerState wasPlaying = PlayerState;
+ if(wasPlaying == PlayerState.Playing)
+ Pause();
+
+ if(relativeTrackNumber < 0)
+ relativeTrackNumber = _trackPlaybackOrder.Count - 1;
+ else if(relativeTrackNumber >= _trackPlaybackOrder.Count)
+ relativeTrackNumber = 0;
+
+ do
+ {
+ _currentTrackInOrder = relativeTrackNumber;
+ KeyValuePair discTrackPair = _trackPlaybackOrder[relativeTrackNumber];
+ SelectDisc(discTrackPair.Key);
+ if(SelectTrack(discTrackPair.Value))
+ break;
+ }
+ while(true);
+
if(wasPlaying == PlayerState.Playing)
Play();
}