diff --git a/RedBookPlayer.GUI/ViewModels/PlayerViewModel.cs b/RedBookPlayer.GUI/ViewModels/PlayerViewModel.cs index 931fdac..2282ad1 100644 --- a/RedBookPlayer.GUI/ViewModels/PlayerViewModel.cs +++ b/RedBookPlayer.GUI/ViewModels/PlayerViewModel.cs @@ -636,7 +636,7 @@ namespace RedBookPlayer.GUI.ViewModels ImagePath = _player.ImagePath; Initialized = _player.Initialized; - if (!string.IsNullOrWhiteSpace(ImagePath) && Initialized) + if(!string.IsNullOrWhiteSpace(ImagePath) && Initialized) { Dispatcher.UIThread.InvokeAsync(() => { diff --git a/RedBookPlayer.Models/Audio/Linux/AudioBackend.cs b/RedBookPlayer.Models/Audio/Linux/AudioBackend.cs index 1ee5ec5..9ee5c12 100644 --- a/RedBookPlayer.Models/Audio/Linux/AudioBackend.cs +++ b/RedBookPlayer.Models/Audio/Linux/AudioBackend.cs @@ -43,7 +43,7 @@ namespace RedBookPlayer.Models.Audio.Linux /// public void SetVolume(float volume) { - if (_soundOut != null) + if(_soundOut != null) _soundOut.Volume = volume; } diff --git a/RedBookPlayer.Models/Audio/Windows/AudioBackend.cs b/RedBookPlayer.Models/Audio/Windows/AudioBackend.cs index 0026b7a..3f01aea 100644 --- a/RedBookPlayer.Models/Audio/Windows/AudioBackend.cs +++ b/RedBookPlayer.Models/Audio/Windows/AudioBackend.cs @@ -43,7 +43,7 @@ namespace RedBookPlayer.Models.Audio.Windows /// public void SetVolume(float volume) { - if (_soundOut != null) + if(_soundOut != null) _soundOut.Volume = volume; } diff --git a/RedBookPlayer.Models/Discs/CompactDisc.cs b/RedBookPlayer.Models/Discs/CompactDisc.cs index 7624e30..b0955d5 100644 --- a/RedBookPlayer.Models/Discs/CompactDisc.cs +++ b/RedBookPlayer.Models/Discs/CompactDisc.cs @@ -28,9 +28,9 @@ namespace RedBookPlayer.Models.Discs return; // Invalid value means we can't do anything - if (value > _image.Tracks.Max(t => t.TrackSequence)) + if(value > _image.Tracks.Max(t => t.TrackSequence)) return; - else if (value < _image.Tracks.Min(t => t.TrackSequence)) + else if(value < _image.Tracks.Min(t => t.TrackSequence)) return; // Cache the current track for easy access @@ -65,9 +65,9 @@ namespace RedBookPlayer.Models.Discs return; // Invalid value means we can't do anything - if (value > track.Indexes.Keys.Max()) + if(value > track.Indexes.Keys.Max()) return; - else if (value < track.Indexes.Keys.Min()) + else if(value < track.Indexes.Keys.Min()) return; this.RaiseAndSetIfChanged(ref _currentTrackIndex, value); @@ -271,7 +271,7 @@ namespace RedBookPlayer.Models.Discs // Get the track with that value, if possible Track track = _image.Tracks.FirstOrDefault(t => t.TrackSequence == trackNumber); - if (track == null) + if(track == null) return; // Get the number of sectors to read @@ -334,7 +334,7 @@ namespace RedBookPlayer.Models.Discs // Cache the current track for easy access Track track = GetTrack(CurrentTrackNumber); - if (track == null) + if(track == null) return; // If the index is invalid, just return diff --git a/RedBookPlayer.Models/Hardware/Player.cs b/RedBookPlayer.Models/Hardware/Player.cs index e33391d..9c7310f 100644 --- a/RedBookPlayer.Models/Hardware/Player.cs +++ b/RedBookPlayer.Models/Hardware/Player.cs @@ -35,9 +35,9 @@ namespace RedBookPlayer.Models.Hardware private set { int temp = value; - if (temp < 0) + if(temp < 0) temp = _numberOfDiscs - 1; - else if (temp >= _numberOfDiscs) + else if(temp >= _numberOfDiscs) temp = 0; this.RaiseAndSetIfChanged(ref _currentDisc, temp); @@ -296,7 +296,7 @@ namespace RedBookPlayer.Models.Hardware /// /// OpticalDisc objects /// - private OpticalDiscBase[] _opticalDiscs; + private readonly OpticalDiscBase[] _opticalDiscs; /// /// List of available tracks organized by disc @@ -321,7 +321,7 @@ namespace RedBookPlayer.Models.Hardware /// /// Filtering stage for audio output /// - private FilterStage _filterStage; + private readonly FilterStage _filterStage; /// /// Current position in the sector for reading @@ -344,7 +344,7 @@ namespace RedBookPlayer.Models.Hardware { Initialized = false; - if (numberOfDiscs <= 0) + if(numberOfDiscs <= 0) numberOfDiscs = 1; _numberOfDiscs = numberOfDiscs; @@ -467,26 +467,23 @@ namespace RedBookPlayer.Models.Hardware int currentFoundTrack = 0; if(_trackPlaybackOrder == null || _trackPlaybackOrder.Count == 0) { - currentFoundTrack = 0; + _currentTrackInOrder = 0; + return; } else if(_trackPlaybackOrder.Any(kvp => kvp.Key == CurrentDisc)) { currentFoundTrack = _trackPlaybackOrder.FindIndex(kvp => kvp.Key == CurrentDisc && kvp.Value == CurrentTrackNumber); if(currentFoundTrack == -1) - currentFoundTrack = _trackPlaybackOrder.Where(kvp => kvp.Key == CurrentDisc).Min(kvp => kvp.Value); - - CurrentDisc = _trackPlaybackOrder[currentFoundTrack].Key; - CurrentTrackNumber = _trackPlaybackOrder[currentFoundTrack].Value; + currentFoundTrack = _trackPlaybackOrder.FindIndex(kvp => kvp.Key == CurrentDisc && kvp.Value == _trackPlaybackOrder.Min(kvp => kvp.Value)); } else { int lowestDiscNumber = _trackPlaybackOrder.Min(kvp => kvp.Key); - currentFoundTrack = _trackPlaybackOrder.Where(kvp => kvp.Key == lowestDiscNumber).Min(kvp => kvp.Value); - - CurrentDisc = _trackPlaybackOrder[currentFoundTrack].Key; - CurrentTrackNumber = _trackPlaybackOrder[currentFoundTrack].Value; + currentFoundTrack = _trackPlaybackOrder.FindIndex(kvp => kvp.Key == lowestDiscNumber && kvp.Value == _trackPlaybackOrder.Min(kvp => kvp.Value)); } + CurrentDisc = _trackPlaybackOrder[currentFoundTrack].Key; + CurrentTrackNumber = _trackPlaybackOrder[currentFoundTrack].Value; _currentTrackInOrder = currentFoundTrack; } @@ -692,7 +689,7 @@ namespace RedBookPlayer.Models.Hardware public int ProviderRead(byte[] buffer, int offset, int count) { // If we have an unreadable amount - if (count <= 0) + if(count <= 0) { Array.Clear(buffer, offset, count); return count; @@ -706,7 +703,7 @@ namespace RedBookPlayer.Models.Hardware } // 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 byte[] audioDataSegment = ReadData(count, sectorsToRead, zeroSectorsAmount); @@ -732,7 +729,7 @@ namespace RedBookPlayer.Models.Hardware else if(RepeatMode == RepeatMode.Single && _opticalDiscs[CurrentDisc] is CompactDisc compactDisc) { ulong trackEndSector = compactDisc.GetTrack(CurrentTrackNumber).TrackEndSector; - if (newSectorValue > trackEndSector) + if(newSectorValue > trackEndSector) { ShouldInvokePlaybackModes = true; } @@ -750,7 +747,7 @@ namespace RedBookPlayer.Models.Hardware // If we are supposed to change tracks, get the next one from the list if(CurrentTrackNumber != previousTrack && !ShouldInvokePlaybackModes) - NextTrack(); + Dispatcher.UIThread.InvokeAsync(NextTrack).ConfigureAwait(false).GetAwaiter().GetResult(); } return count; @@ -767,7 +764,7 @@ namespace RedBookPlayer.Models.Hardware return; PlayerState wasPlaying = PlayerState; - if (wasPlaying == PlayerState.Playing) + if(wasPlaying == PlayerState.Playing) Stop(); if(discNumber >= _numberOfDiscs) @@ -783,7 +780,7 @@ namespace RedBookPlayer.Models.Hardware if(DiscHandling == DiscHandling.SingleDisc) LoadTrackList(); - if (_opticalDiscs[CurrentDisc] != null && _opticalDiscs[CurrentDisc].Initialized) + if(_opticalDiscs[CurrentDisc] != null && _opticalDiscs[CurrentDisc].Initialized) { Initialized = true; SelectTrack(1); @@ -815,11 +812,11 @@ namespace RedBookPlayer.Models.Hardware return; PlayerState wasPlaying = PlayerState; - if (wasPlaying == PlayerState.Playing) + if(wasPlaying == PlayerState.Playing) Pause(); // CompactDisc needs special handling of track wraparound - if (_opticalDiscs[CurrentDisc] is CompactDisc compactDisc) + if(_opticalDiscs[CurrentDisc] is CompactDisc compactDisc) { // Cache the current track for easy access Track track = compactDisc.GetTrack(CurrentTrackNumber); @@ -888,16 +885,12 @@ namespace RedBookPlayer.Models.Hardware if(_opticalDiscs[CurrentDisc] == null || !_opticalDiscs[CurrentDisc].Initialized) return false; - // If the disc didn't change, don't do anything - if(_currentTrackNumber == trackNumber) - return false; - PlayerState wasPlaying = PlayerState; if(wasPlaying == PlayerState.Playing) Pause(); // CompactDisc needs special handling of track wraparound - if (_opticalDiscs[CurrentDisc] is CompactDisc compactDisc) + if(_opticalDiscs[CurrentDisc] is CompactDisc compactDisc) { // Cache the value and the current track number int cachedValue = trackNumber; @@ -978,13 +971,12 @@ namespace RedBookPlayer.Models.Hardware /// /// Determine the number of real and zero sectors to read /// - /// Number of requested bytes to read /// Number of sectors to read /// Number of zeroed sectors to concatenate - 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 - sectorsToRead = ((ulong)count / (ulong)_opticalDiscs[CurrentDisc].BytesPerSector) + 10; + // Always attempt to read one frame of data + sectorsToRead = 75; zeroSectorsAmount = 0; // Avoid overreads by padding with 0-byte data at the end @@ -1008,7 +1000,7 @@ namespace RedBookPlayer.Models.Hardware private byte[] ReadData(int count, ulong sectorsToRead, ulong zeroSectorsAmount) { // If the amount of zeroes being asked for is the same as the sectors, return null - if (sectorsToRead == zeroSectorsAmount) + if(sectorsToRead == zeroSectorsAmount) return null; // Create padding data for overreads @@ -1024,7 +1016,7 @@ namespace RedBookPlayer.Models.Hardware { 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(); } else @@ -1296,7 +1288,11 @@ namespace RedBookPlayer.Models.Hardware private void OpticalDiscStateChanged(object sender, PropertyChangedEventArgs e) { if(_opticalDiscs[CurrentDisc] == null) + { + ImagePath = null; + CurrentTrackNumber = 1; return; + } ImagePath = _opticalDiscs[CurrentDisc].ImagePath; CurrentTrackNumber = _opticalDiscs[CurrentDisc].CurrentTrackNumber; @@ -1371,14 +1367,14 @@ namespace RedBookPlayer.Models.Hardware byte b = subchannelData[i]; // Set the respective bit in the new byte data - formattedData['P'][index] |= (byte)(HasBitSet(b, 7) ? 1 << modValue : 0); - formattedData['Q'][index] |= (byte)(HasBitSet(b, 6) ? 1 << modValue : 0); - formattedData['R'][index] |= (byte)(HasBitSet(b, 5) ? 1 << modValue : 0); - formattedData['S'][index] |= (byte)(HasBitSet(b, 4) ? 1 << modValue : 0); - formattedData['T'][index] |= (byte)(HasBitSet(b, 3) ? 1 << modValue : 0); - formattedData['U'][index] |= (byte)(HasBitSet(b, 2) ? 1 << modValue : 0); - formattedData['V'][index] |= (byte)(HasBitSet(b, 1) ? 1 << modValue : 0); - formattedData['W'][index] |= (byte)(HasBitSet(b, 0) ? 1 << modValue : 0); + formattedData['P'][index] |= (byte)(HasBitSet(b, 7) ? 1 << (7 - modValue) : 0); + formattedData['Q'][index] |= (byte)(HasBitSet(b, 6) ? 1 << (7 - modValue) : 0); + formattedData['R'][index] |= (byte)(HasBitSet(b, 5) ? 1 << (7 - modValue) : 0); + formattedData['S'][index] |= (byte)(HasBitSet(b, 4) ? 1 << (7 - modValue) : 0); + formattedData['T'][index] |= (byte)(HasBitSet(b, 3) ? 1 << (7 - modValue) : 0); + formattedData['U'][index] |= (byte)(HasBitSet(b, 2) ? 1 << (7 - modValue) : 0); + formattedData['V'][index] |= (byte)(HasBitSet(b, 1) ? 1 << (7 - modValue) : 0); + formattedData['W'][index] |= (byte)(HasBitSet(b, 0) ? 1 << (7 - modValue) : 0); } return formattedData;