Merge pull request #3 from mnadareski/devel

Fix index setting and moving, lock track reads
This commit is contained in:
2021-06-06 19:50:20 +01:00
committed by GitHub

View File

@@ -1,16 +1,17 @@
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Structs;
using Aaru.Decoders.CD;
using static Aaru.Decoders.CD.FullTOC;
using Aaru.DiscImages;
using Aaru.Helpers;
using System.Linq;
using CSCore.SoundOut;
using CSCore;
using NWaves.Audio;
using NWaves.Filters.BiQuad;
using static Aaru.Decoders.CD.FullTOC;
using Aaru.CommonTypes.Structs;
namespace RedBookPlayer
{
@@ -67,7 +68,7 @@ namespace RedBookPlayer
TrackHasEmphasis = ApplyDeEmphasis;
TotalIndexes = Image.Tracks[CurrentTrack].Indexes.Keys.Max();
CurrentIndex = Image.Tracks[CurrentTrack].Indexes.Keys.GetEnumerator().Current;
CurrentIndex = Image.Tracks[CurrentTrack].Indexes.Keys.Min();
}
}
}
@@ -102,12 +103,12 @@ namespace RedBookPlayer
if (Image != null)
{
if (CurrentTrack < Image.Tracks.Count - 1 && CurrentSector >= Image.Tracks[CurrentTrack + 1].TrackStartSector ||
CurrentTrack > 0 && CurrentSector < Image.Tracks[CurrentTrack].TrackStartSector)
if ((CurrentTrack < Image.Tracks.Count - 1 && CurrentSector >= Image.Tracks[CurrentTrack + 1].TrackStartSector)
|| (CurrentTrack > 0 && CurrentSector < Image.Tracks[CurrentTrack].TrackStartSector))
{
foreach (Track track in Image.Tracks)
foreach (Track track in Image.Tracks.ToArray().Reverse())
{
if (track.TrackStartSector >= CurrentSector)
if (CurrentSector >= track.TrackStartSector)
{
CurrentTrack = (int)track.TrackSequence - 1;
break;
@@ -158,7 +159,7 @@ namespace RedBookPlayer
ALSoundOut soundOut;
BiQuadFilter deEmphasisFilterLeft;
BiQuadFilter deEmphasisFilterRight;
bool readingImage = false;
object readingImage = new object();
public async void Init(AaruFormat image, bool autoPlay = false)
{
@@ -277,6 +278,8 @@ namespace RedBookPlayer
byte[] audioData;
Task<byte[]> task = Task.Run(() =>
{
lock (readingImage)
{
try
{
@@ -287,6 +290,7 @@ namespace RedBookPlayer
LoadTrack(0);
return Image.ReadSectors(CurrentSector, (uint)sectorsToRead).Concat(zeroSectors).ToArray();
}
}
});
if (task.Wait(TimeSpan.FromMilliseconds(100)))
@@ -301,11 +305,9 @@ namespace RedBookPlayer
Task.Run(() =>
{
if (!readingImage)
lock (readingImage)
{
readingImage = true;
Image.ReadSector(CurrentSector + 375);
readingImage = false;
}
});
@@ -389,10 +391,14 @@ namespace RedBookPlayer
return;
}
if (++CurrentTrack >= Image.Tracks.Count)
if (CurrentTrack + 1 >= Image.Tracks.Count)
{
CurrentTrack = 0;
}
else
{
CurrentTrack++;
}
LoadTrack(CurrentTrack);
}
@@ -412,10 +418,14 @@ namespace RedBookPlayer
}
else
{
if (--CurrentTrack < 0)
if (CurrentTrack - 1 < 0)
{
CurrentTrack = Image.Tracks.Count - 1;
}
else
{
CurrentTrack--;
}
}
}
@@ -429,21 +439,17 @@ namespace RedBookPlayer
return;
}
if (++CurrentIndex > Image.Tracks[CurrentTrack].Indexes.Keys.Max())
if (CurrentIndex + 1 > Image.Tracks[CurrentTrack].Indexes.Keys.Max())
{
if (changeTrack)
{
NextTrack();
CurrentSector = (ulong)Image.Tracks[CurrentTrack].Indexes[1];
}
else
{
CurrentSector = (ulong)Image.Tracks[CurrentTrack].Indexes[--CurrentIndex];
CurrentSector = (ulong)Image.Tracks[CurrentTrack].Indexes.Values.Min();
}
}
else
{
CurrentSector = (ulong)Image.Tracks[CurrentTrack].Indexes[CurrentIndex];
CurrentSector = (ulong)Image.Tracks[CurrentTrack].Indexes[++CurrentIndex];
}
}
@@ -454,21 +460,17 @@ namespace RedBookPlayer
return;
}
if (CurrentIndex <= 1 || --CurrentIndex < Image.Tracks[CurrentTrack].Indexes.Keys.Min())
if (CurrentIndex - 1 < Image.Tracks[CurrentTrack].Indexes.Keys.Min())
{
if (changeTrack)
{
PreviousTrack();
CurrentSector = (ulong)Image.Tracks[CurrentTrack].Indexes.Values.Max();
}
else
{
CurrentSector = (ulong)Image.Tracks[CurrentTrack].Indexes[1];
}
}
else
{
CurrentSector = (ulong)Image.Tracks[CurrentTrack].Indexes[CurrentIndex];
CurrentSector = (ulong)Image.Tracks[CurrentTrack].Indexes[--CurrentIndex];
}
}