Code cleanup, fix playback again

This commit is contained in:
Matt Nadareski
2021-10-06 22:46:50 -07:00
parent b02ca60b1e
commit 8643bf36a6
5 changed files with 46 additions and 50 deletions

View File

@@ -296,7 +296,7 @@ namespace RedBookPlayer.Models.Hardware
/// <summary> /// <summary>
/// OpticalDisc objects /// OpticalDisc objects
/// </summary> /// </summary>
private OpticalDiscBase[] _opticalDiscs; private readonly OpticalDiscBase[] _opticalDiscs;
/// <summary> /// <summary>
/// List of available tracks organized by disc /// List of available tracks organized by disc
@@ -321,7 +321,7 @@ namespace RedBookPlayer.Models.Hardware
/// <summary> /// <summary>
/// Filtering stage for audio output /// Filtering stage for audio output
/// </summary> /// </summary>
private FilterStage _filterStage; private readonly FilterStage _filterStage;
/// <summary> /// <summary>
/// Current position in the sector for reading /// Current position in the sector for reading
@@ -467,26 +467,23 @@ namespace RedBookPlayer.Models.Hardware
int currentFoundTrack = 0; int currentFoundTrack = 0;
if(_trackPlaybackOrder == null || _trackPlaybackOrder.Count == 0) if(_trackPlaybackOrder == null || _trackPlaybackOrder.Count == 0)
{ {
currentFoundTrack = 0; _currentTrackInOrder = 0;
return;
} }
else if(_trackPlaybackOrder.Any(kvp => kvp.Key == CurrentDisc)) else if(_trackPlaybackOrder.Any(kvp => kvp.Key == CurrentDisc))
{ {
currentFoundTrack = _trackPlaybackOrder.FindIndex(kvp => kvp.Key == CurrentDisc && kvp.Value == CurrentTrackNumber); currentFoundTrack = _trackPlaybackOrder.FindIndex(kvp => kvp.Key == CurrentDisc && kvp.Value == CurrentTrackNumber);
if(currentFoundTrack == -1) if(currentFoundTrack == -1)
currentFoundTrack = _trackPlaybackOrder.Where(kvp => kvp.Key == CurrentDisc).Min(kvp => kvp.Value); currentFoundTrack = _trackPlaybackOrder.FindIndex(kvp => kvp.Key == CurrentDisc && kvp.Value == _trackPlaybackOrder.Min(kvp => kvp.Value));
CurrentDisc = _trackPlaybackOrder[currentFoundTrack].Key;
CurrentTrackNumber = _trackPlaybackOrder[currentFoundTrack].Value;
} }
else else
{ {
int lowestDiscNumber = _trackPlaybackOrder.Min(kvp => kvp.Key); int lowestDiscNumber = _trackPlaybackOrder.Min(kvp => kvp.Key);
currentFoundTrack = _trackPlaybackOrder.Where(kvp => kvp.Key == lowestDiscNumber).Min(kvp => kvp.Value); currentFoundTrack = _trackPlaybackOrder.FindIndex(kvp => kvp.Key == lowestDiscNumber && kvp.Value == _trackPlaybackOrder.Min(kvp => kvp.Value));
}
CurrentDisc = _trackPlaybackOrder[currentFoundTrack].Key; CurrentDisc = _trackPlaybackOrder[currentFoundTrack].Key;
CurrentTrackNumber = _trackPlaybackOrder[currentFoundTrack].Value; CurrentTrackNumber = _trackPlaybackOrder[currentFoundTrack].Value;
}
_currentTrackInOrder = currentFoundTrack; _currentTrackInOrder = currentFoundTrack;
} }
@@ -706,7 +703,7 @@ namespace RedBookPlayer.Models.Hardware
} }
// Determine how many sectors we can read // Determine how many sectors we can read
DetermineReadAmount(count, out ulong sectorsToRead, out ulong zeroSectorsAmount); DetermineReadAmount(out ulong sectorsToRead, out ulong zeroSectorsAmount);
// Get data to return // Get data to return
byte[] audioDataSegment = ReadData(count, sectorsToRead, zeroSectorsAmount); byte[] audioDataSegment = ReadData(count, sectorsToRead, zeroSectorsAmount);
@@ -750,7 +747,7 @@ namespace RedBookPlayer.Models.Hardware
// If we are supposed to change tracks, get the next one from the list // If we are supposed to change tracks, get the next one from the list
if(CurrentTrackNumber != previousTrack && !ShouldInvokePlaybackModes) if(CurrentTrackNumber != previousTrack && !ShouldInvokePlaybackModes)
NextTrack(); Dispatcher.UIThread.InvokeAsync(NextTrack).ConfigureAwait(false).GetAwaiter().GetResult();
} }
return count; return count;
@@ -888,10 +885,6 @@ namespace RedBookPlayer.Models.Hardware
if(_opticalDiscs[CurrentDisc] == null || !_opticalDiscs[CurrentDisc].Initialized) if(_opticalDiscs[CurrentDisc] == null || !_opticalDiscs[CurrentDisc].Initialized)
return false; return false;
// If the disc didn't change, don't do anything
if(_currentTrackNumber == trackNumber)
return false;
PlayerState wasPlaying = PlayerState; PlayerState wasPlaying = PlayerState;
if(wasPlaying == PlayerState.Playing) if(wasPlaying == PlayerState.Playing)
Pause(); Pause();
@@ -978,13 +971,12 @@ namespace RedBookPlayer.Models.Hardware
/// <summary> /// <summary>
/// Determine the number of real and zero sectors to read /// Determine the number of real and zero sectors to read
/// </summary> /// </summary>
/// <param name="count">Number of requested bytes to read</param>
/// <param name="sectorsToRead">Number of sectors to read</param> /// <param name="sectorsToRead">Number of sectors to read</param>
/// <param name="zeroSectorsAmount">Number of zeroed sectors to concatenate</param> /// <param name="zeroSectorsAmount">Number of zeroed sectors to concatenate</param>
private void DetermineReadAmount(int count, out ulong sectorsToRead, out ulong zeroSectorsAmount) private void DetermineReadAmount(out ulong sectorsToRead, out ulong zeroSectorsAmount)
{ {
// Attempt to read 10 more sectors than requested // Always attempt to read one frame of data
sectorsToRead = ((ulong)count / (ulong)_opticalDiscs[CurrentDisc].BytesPerSector) + 10; sectorsToRead = 75;
zeroSectorsAmount = 0; zeroSectorsAmount = 0;
// Avoid overreads by padding with 0-byte data at the end // Avoid overreads by padding with 0-byte data at the end
@@ -1024,7 +1016,7 @@ namespace RedBookPlayer.Models.Hardware
{ {
if(_opticalDiscs[CurrentDisc] is CompactDisc compactDisc) if(_opticalDiscs[CurrentDisc] is CompactDisc compactDisc)
{ {
byte[] subchannelData = compactDisc.ReadSubchannels((uint)sectorsToRead); //byte[] subchannelData = compactDisc.ReadSubchannels((uint)sectorsToRead);
return compactDisc.ReadSectors((uint)sectorsToRead, DataPlayback).Concat(zeroSectors).ToArray(); return compactDisc.ReadSectors((uint)sectorsToRead, DataPlayback).Concat(zeroSectors).ToArray();
} }
else else
@@ -1296,7 +1288,11 @@ namespace RedBookPlayer.Models.Hardware
private void OpticalDiscStateChanged(object sender, PropertyChangedEventArgs e) private void OpticalDiscStateChanged(object sender, PropertyChangedEventArgs e)
{ {
if(_opticalDiscs[CurrentDisc] == null) if(_opticalDiscs[CurrentDisc] == null)
{
ImagePath = null;
CurrentTrackNumber = 1;
return; return;
}
ImagePath = _opticalDiscs[CurrentDisc].ImagePath; ImagePath = _opticalDiscs[CurrentDisc].ImagePath;
CurrentTrackNumber = _opticalDiscs[CurrentDisc].CurrentTrackNumber; CurrentTrackNumber = _opticalDiscs[CurrentDisc].CurrentTrackNumber;
@@ -1371,14 +1367,14 @@ namespace RedBookPlayer.Models.Hardware
byte b = subchannelData[i]; byte b = subchannelData[i];
// Set the respective bit in the new byte data // Set the respective bit in the new byte data
formattedData['P'][index] |= (byte)(HasBitSet(b, 7) ? 1 << modValue : 0); formattedData['P'][index] |= (byte)(HasBitSet(b, 7) ? 1 << (7 - modValue) : 0);
formattedData['Q'][index] |= (byte)(HasBitSet(b, 6) ? 1 << modValue : 0); formattedData['Q'][index] |= (byte)(HasBitSet(b, 6) ? 1 << (7 - modValue) : 0);
formattedData['R'][index] |= (byte)(HasBitSet(b, 5) ? 1 << modValue : 0); formattedData['R'][index] |= (byte)(HasBitSet(b, 5) ? 1 << (7 - modValue) : 0);
formattedData['S'][index] |= (byte)(HasBitSet(b, 4) ? 1 << modValue : 0); formattedData['S'][index] |= (byte)(HasBitSet(b, 4) ? 1 << (7 - modValue) : 0);
formattedData['T'][index] |= (byte)(HasBitSet(b, 3) ? 1 << modValue : 0); formattedData['T'][index] |= (byte)(HasBitSet(b, 3) ? 1 << (7 - modValue) : 0);
formattedData['U'][index] |= (byte)(HasBitSet(b, 2) ? 1 << modValue : 0); formattedData['U'][index] |= (byte)(HasBitSet(b, 2) ? 1 << (7 - modValue) : 0);
formattedData['V'][index] |= (byte)(HasBitSet(b, 1) ? 1 << modValue : 0); formattedData['V'][index] |= (byte)(HasBitSet(b, 1) ? 1 << (7 - modValue) : 0);
formattedData['W'][index] |= (byte)(HasBitSet(b, 0) ? 1 << modValue : 0); formattedData['W'][index] |= (byte)(HasBitSet(b, 0) ? 1 << (7 - modValue) : 0);
} }
return formattedData; return formattedData;