Fix track wraparound and playback

This commit is contained in:
Matt Nadareski
2021-10-05 22:02:10 -07:00
parent ee0fbc4ccc
commit 38aa2ba53c
3 changed files with 65 additions and 5 deletions

View File

@@ -17,7 +17,6 @@ using RedBookPlayer.Models.Hardware;
namespace RedBookPlayer.GUI.ViewModels
{
// TODO: Add direct index selection by number
public class PlayerViewModel : ReactiveObject
{
/// <summary>
@@ -706,11 +705,20 @@ namespace RedBookPlayer.GUI.ViewModels
/// <summary>
/// Select a particular disc by number
/// </summary>
/// <param name="discNumber">Disc number to attempt to load</param>
public void SelectDisc(int discNumber) => _player?.SelectDisc(discNumber);
/// <summary>
/// Select a particular index by number
/// </summary>
/// <param name="index">Track index to attempt to load</param>
/// <param name="changeTrack">True if index changes can trigger a track change, false otherwise</param>
public void SelectIndex(ushort index, bool changeTrack) => _player?.SelectIndex(index, changeTrack);
/// <summary>
/// Select a particular track by number
/// </summary>
/// <param name="trackNumber">Track number to attempt to load</param>
public void SelectTrack(int trackNumber) => _player?.SelectTrack(trackNumber);
/// <summary>

View File

@@ -50,7 +50,6 @@ namespace RedBookPlayer.Models
/// <summary>
/// Playback repeat mode
/// </summary>
/// <remarks>TODO: Add cross-disc repeat</remarks>
public enum RepeatMode
{
/// <summary>

View File

@@ -11,7 +11,6 @@ using RedBookPlayer.Models.Factories;
namespace RedBookPlayer.Models.Hardware
{
// TODO: Add direct index selection by number
public class Player : ReactiveObject
{
/// <summary>
@@ -694,7 +693,6 @@ namespace RedBookPlayer.Models.Hardware
/// Select a track by number
/// </summary>
/// <param name="trackNumber">Track number to attempt to load</param>
/// <remarks>Changing track with RepeatMode.AllMultiDisc should switch discs<remarks>
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;