diff --git a/RedBookPlayer.GUI/ViewModels/PlayerViewModel.cs b/RedBookPlayer.GUI/ViewModels/PlayerViewModel.cs index aa8013f..4f7afd3 100644 --- a/RedBookPlayer.GUI/ViewModels/PlayerViewModel.cs +++ b/RedBookPlayer.GUI/ViewModels/PlayerViewModel.cs @@ -17,7 +17,6 @@ using RedBookPlayer.Models.Hardware; namespace RedBookPlayer.GUI.ViewModels { - // TODO: Add direct index selection by number public class PlayerViewModel : ReactiveObject { /// @@ -706,11 +705,20 @@ namespace RedBookPlayer.GUI.ViewModels /// /// Select a particular disc by number /// + /// Disc number to attempt to load public void SelectDisc(int discNumber) => _player?.SelectDisc(discNumber); + /// + /// Select a particular index by number + /// + /// Track index to attempt to load + /// True if index changes can trigger a track change, false otherwise + public void SelectIndex(ushort index, bool changeTrack) => _player?.SelectIndex(index, changeTrack); + /// /// Select a particular track by number /// + /// Track number to attempt to load public void SelectTrack(int trackNumber) => _player?.SelectTrack(trackNumber); /// diff --git a/RedBookPlayer.Models/Enums.cs b/RedBookPlayer.Models/Enums.cs index 472267f..a94aae9 100644 --- a/RedBookPlayer.Models/Enums.cs +++ b/RedBookPlayer.Models/Enums.cs @@ -50,7 +50,6 @@ namespace RedBookPlayer.Models /// /// Playback repeat mode /// - /// TODO: Add cross-disc repeat public enum RepeatMode { /// diff --git a/RedBookPlayer.Models/Hardware/Player.cs b/RedBookPlayer.Models/Hardware/Player.cs index 684d421..4e26d8c 100644 --- a/RedBookPlayer.Models/Hardware/Player.cs +++ b/RedBookPlayer.Models/Hardware/Player.cs @@ -11,7 +11,6 @@ using RedBookPlayer.Models.Factories; namespace RedBookPlayer.Models.Hardware { - // TODO: Add direct index selection by number public class Player : ReactiveObject { /// @@ -694,7 +693,6 @@ namespace RedBookPlayer.Models.Hardware /// Select a track by number /// /// Track number to attempt to load - /// Changing track with RepeatMode.AllMultiDisc should switch discs public void SelectTrack(int trackNumber) { if(_opticalDiscs[CurrentDisc] == null || !_opticalDiscs[CurrentDisc].Initialized) @@ -711,6 +709,38 @@ namespace RedBookPlayer.Models.Hardware int cachedValue = trackNumber; int cachedTrackNumber; + // Take care of disc switching first + if(RepeatMode == RepeatMode.AllMultiDisc) + { + if(trackNumber > (int)compactDisc.Tracks.Max(t => t.TrackSequence)) + { + do + { + NextDisc(); + } + while(_opticalDiscs[CurrentDisc] == null || !_opticalDiscs[CurrentDisc].Initialized); + + if(wasPlaying == PlayerState.Playing) + Play(); + + return; + } + else if((trackNumber < 1 && !LoadHiddenTracks) || (trackNumber < (int)compactDisc.Tracks.Min(t => t.TrackSequence))) + { + do + { + PreviousDisc(); + } + while(_opticalDiscs[CurrentDisc] == null || !_opticalDiscs[CurrentDisc].Initialized); + + SelectTrack(-1); + if(wasPlaying == PlayerState.Playing) + Play(); + + return; + } + } + // If we have an invalid current track number, set it to the minimum if(!compactDisc.Tracks.Any(t => t.TrackSequence == _currentTrackNumber)) _currentTrackNumber = (int)compactDisc.Tracks.Min(t => t.TrackSequence); @@ -769,9 +799,32 @@ namespace RedBookPlayer.Models.Hardware else { if(trackNumber >= _opticalDiscs[CurrentDisc].TotalTracks) + { + if(RepeatMode == RepeatMode.AllMultiDisc) + { + do + { + NextDisc(); + } + while(_opticalDiscs[CurrentDisc] == null || !_opticalDiscs[CurrentDisc].Initialized); + } + trackNumber = 1; + } else if(trackNumber < 1) + { + if(RepeatMode == RepeatMode.AllMultiDisc) + { + do + { + PreviousDisc(); + } + while(_opticalDiscs[CurrentDisc] == null || !_opticalDiscs[CurrentDisc].Initialized); + trackNumber = 1; + } + trackNumber = _opticalDiscs[CurrentDisc].TotalTracks - 1; + } _opticalDiscs[CurrentDisc].LoadTrack(trackNumber); } @@ -1040,7 +1093,7 @@ namespace RedBookPlayer.Models.Hardware { NextDisc(); } - while(_opticalDiscs[CurrentDisc] != null && !_opticalDiscs[CurrentDisc].Initialized); + while(_opticalDiscs[CurrentDisc] == null || !_opticalDiscs[CurrentDisc].Initialized); SelectTrack(1); break;