mirror of
https://github.com/aaru-dps/RedBookPlayer.git
synced 2025-12-16 19:24:41 +00:00
Merge pull request #3 from mnadareski/devel
Fix index setting and moving, lock track reads
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
@@ -278,14 +279,17 @@ namespace RedBookPlayer
|
|||||||
|
|
||||||
Task<byte[]> task = Task.Run(() =>
|
Task<byte[]> task = Task.Run(() =>
|
||||||
{
|
{
|
||||||
try
|
lock (readingImage)
|
||||||
{
|
{
|
||||||
return Image.ReadSectors(CurrentSector, (uint)sectorsToRead).Concat(zeroSectors).ToArray();
|
try
|
||||||
}
|
{
|
||||||
catch (System.ArgumentOutOfRangeException)
|
return Image.ReadSectors(CurrentSector, (uint)sectorsToRead).Concat(zeroSectors).ToArray();
|
||||||
{
|
}
|
||||||
LoadTrack(0);
|
catch (System.ArgumentOutOfRangeException)
|
||||||
return Image.ReadSectors(CurrentSector, (uint)sectorsToRead).Concat(zeroSectors).ToArray();
|
{
|
||||||
|
LoadTrack(0);
|
||||||
|
return Image.ReadSectors(CurrentSector, (uint)sectorsToRead).Concat(zeroSectors).ToArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user