mirror of
https://github.com/aaru-dps/RedBookPlayer.git
synced 2025-12-16 19:24:41 +00:00
Fix track wraparound and playback
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -50,7 +50,6 @@ namespace RedBookPlayer.Models
|
||||
/// <summary>
|
||||
/// Playback repeat mode
|
||||
/// </summary>
|
||||
/// <remarks>TODO: Add cross-disc repeat</remarks>
|
||||
public enum RepeatMode
|
||||
{
|
||||
/// <summary>
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user