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