Fix track flags, fix track changing again

This commit is contained in:
Matt Nadareski
2021-06-28 23:11:16 -07:00
parent f28de1a13d
commit 34c1d7a450
3 changed files with 77 additions and 83 deletions

View File

@@ -4,6 +4,7 @@ using System.Linq;
using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
using Aaru.CommonTypes.Structs; using Aaru.CommonTypes.Structs;
using Aaru.Decoders.CD;
using Aaru.Helpers; using Aaru.Helpers;
using static Aaru.Decoders.CD.FullTOC; using static Aaru.Decoders.CD.FullTOC;
@@ -30,19 +31,25 @@ namespace RedBookPlayer
if(_image == null) if(_image == null)
return; return;
// Check if we're incrementing or decrementing the track // Cache the value and the current track number
bool increment = value >= _currentTrackNumber; int cachedValue = value;
int cachedTrackNumber = _currentTrackNumber;
// Check if we're incrementing or decrementing the track
bool increment = cachedValue >= _currentTrackNumber;
do
{
// Ensure that the value is valid, wrapping around if necessary // Ensure that the value is valid, wrapping around if necessary
if(value >= _image.Tracks.Count) if(cachedValue >= _image.Tracks.Count)
_currentTrackNumber = 0; cachedValue = 0;
else if(value < 0) else if(cachedValue < 0)
_currentTrackNumber = _image.Tracks.Count - 1; cachedValue = _image.Tracks.Count - 1;
else
_currentTrackNumber = value; _currentTrackNumber = cachedValue;
// Cache the current track for easy access // Cache the current track for easy access
Track track = _image.Tracks[CurrentTrackNumber]; Track track = _image.Tracks[_currentTrackNumber];
// Set track flags from subchannel data, if possible // Set track flags from subchannel data, if possible
SetTrackFlags(track); SetTrackFlags(track);
@@ -52,14 +59,17 @@ namespace RedBookPlayer
TotalIndexes = track.Indexes.Keys.Max(); TotalIndexes = track.Indexes.Keys.Max();
CurrentTrackIndex = track.Indexes.Keys.Min(); CurrentTrackIndex = track.Indexes.Keys.Min();
// If we're not playing data tracks, skip // If the track is playable, just return
if(!App.Settings.PlayDataTracks && TrackType != TrackType.Audio) if(TrackType == TrackType.Audio || App.Settings.PlayDataTracks)
{ return;
// If we're not playing the track, skip
if(increment) if(increment)
NextTrack(); cachedValue++;
else else
PreviousTrack(); cachedValue--;
} }
while(cachedValue != cachedTrackNumber);
} }
} }
@@ -666,62 +676,17 @@ namespace RedBookPlayer
{ {
try try
{ {
ulong currentSector = track.TrackStartSector; // Get the track descriptor from the TOC
for (int i = 0; i < 16; i++) TrackDataDescriptor descriptor = _toc.TrackDescriptors.First(d => d.POINT == track.TrackSequence);
{
// Try to read the subchannel // Set the track flags from TOC data
byte[] subBuf = _image.ReadSectorTag(track.TrackStartSector, SectorTagType.CdSectorSubchannel); byte flags = (byte)(descriptor.CONTROL & 0x0D);
if(subBuf == null || subBuf.Length < 4) TrackHasEmphasis = (flags & (byte)TocControl.TwoChanPreEmph) == (byte)TocControl.TwoChanPreEmph;
CopyAllowed = (flags & (byte)TocControl.CopyPermissionMask) == (byte)TocControl.CopyPermissionMask;
TrackType = (flags & (byte)TocControl.DataTrack) == (byte)TocControl.DataTrack ? TrackType.Data : TrackType.Audio;
QuadChannel = (flags & (byte)TocControl.FourChanNoPreEmph) == (byte)TocControl.FourChanNoPreEmph;
return; return;
// Check the expected track, if possible
int adr = subBuf[0] & 0x0F;
if(adr == 1)
{
if(subBuf[1] > track.TrackSequence)
{
currentSector--;
continue;
}
else if(subBuf[1] < track.TrackSequence)
{
currentSector++;
continue;
}
}
// Set the track flags from subchannel data
int control = (subBuf[0] & 0xF0) / 16;
switch((control & 0xC) / 4)
{
case 0:
QuadChannel = false;
TrackType = TrackType.Audio;
TrackHasEmphasis = (control & 0x01) == 1;
break;
case 1:
QuadChannel = false;
TrackType = TrackType.Data;
TrackHasEmphasis = false;
break;
case 2:
QuadChannel = true;
TrackType = TrackType.Audio;
TrackHasEmphasis = (control & 0x01) == 1;
break;
default:
QuadChannel = false;
TrackType = track.TrackType;
TrackHasEmphasis = false;
break;
}
CopyAllowed = (control & 0x02) > 0;
return;
}
// If we didn't find subchannel data, assume defaults
SetDefaultTrackFlags(track);
} }
catch(Exception) catch(Exception)
{ {

View File

@@ -16,6 +16,11 @@ namespace RedBookPlayer
/// </summary> /// </summary>
public bool Initialized { get; private set; } = false; public bool Initialized { get; private set; } = false;
/// <summary>
/// Indicate if the disc is playing
/// </summary>
public bool Playing => _soundOut.PlaybackState == PlaybackState.Playing;
#endregion #endregion
#region Private State Variables #region Private State Variables

View File

@@ -301,13 +301,37 @@ namespace RedBookPlayer
public void StopButton_Click(object sender, RoutedEventArgs e) => Player.Stop(); public void StopButton_Click(object sender, RoutedEventArgs e) => Player.Stop();
public void NextTrackButton_Click(object sender, RoutedEventArgs e) => PlayableDisc.NextTrack(); public void NextTrackButton_Click(object sender, RoutedEventArgs e)
{
bool wasPlaying = Player.Playing;
if(wasPlaying) Player.Pause();
PlayableDisc.NextTrack();
if(wasPlaying) Player.Play();
}
public void PreviousTrackButton_Click(object sender, RoutedEventArgs e) => PlayableDisc.PreviousTrack(); public void PreviousTrackButton_Click(object sender, RoutedEventArgs e)
{
bool wasPlaying = Player.Playing;
if(wasPlaying) Player.Pause();
PlayableDisc.PreviousTrack();
if(wasPlaying) Player.Play();
}
public void NextIndexButton_Click(object sender, RoutedEventArgs e) => PlayableDisc.NextIndex(App.Settings.IndexButtonChangeTrack); public void NextIndexButton_Click(object sender, RoutedEventArgs e)
{
bool wasPlaying = Player.Playing;
if(wasPlaying) Player.Pause();
PlayableDisc.NextIndex(App.Settings.IndexButtonChangeTrack);
if(wasPlaying) Player.Play();
}
public void PreviousIndexButton_Click(object sender, RoutedEventArgs e) => PlayableDisc.PreviousIndex(App.Settings.IndexButtonChangeTrack); public void PreviousIndexButton_Click(object sender, RoutedEventArgs e)
{
bool wasPlaying = Player.Playing;
if(wasPlaying) Player.Pause();
PlayableDisc.PreviousIndex(App.Settings.IndexButtonChangeTrack);
if(wasPlaying) Player.Play();
}
public void FastForwardButton_Click(object sender, RoutedEventArgs e) => PlayableDisc.FastForward(); public void FastForwardButton_Click(object sender, RoutedEventArgs e) => PlayableDisc.FastForward();