From e6e2392b666fc11dd7c8b22e95cf11004aedc736 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Wed, 17 Jun 2020 22:52:53 +0100 Subject: [PATCH] Implement reading subchannels from BlindWrite 4 images. --- Aaru.Images/BlindWrite4/Read.cs | 36 ++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/Aaru.Images/BlindWrite4/Read.cs b/Aaru.Images/BlindWrite4/Read.cs index c7a33ad1d..514bd0635 100644 --- a/Aaru.Images/BlindWrite4/Read.cs +++ b/Aaru.Images/BlindWrite4/Read.cs @@ -605,7 +605,7 @@ namespace Aaru.DiscImages if(subFilter != null && bwTrack.subchannel > 0) { - track.TrackSubchannelType = TrackSubchannelType.Raw; + track.TrackSubchannelType = TrackSubchannelType.Packed; if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel); @@ -1063,7 +1063,13 @@ namespace Aaru.DiscImages break; } case SectorTagType.CdSectorSubchannel: - throw new NotImplementedException("Packed subchannel not yet supported"); + { + sectorOffset = 0; + sectorSize = 96; + sectorSkip = 0; + + break; + } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); } @@ -1095,7 +1101,13 @@ namespace Aaru.DiscImages break; } case SectorTagType.CdSectorSubchannel: - throw new NotImplementedException("Packed subchannel not yet supported"); + { + sectorOffset = 0; + sectorSize = 96; + sectorSkip = 0; + + break; + } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); } @@ -1106,20 +1118,30 @@ namespace Aaru.DiscImages switch(tag) { case SectorTagType.CdSectorSubchannel: - throw new NotImplementedException("Packed subchannel not yet supported"); + { + sectorOffset = 0; + sectorSize = 96; + sectorSkip = 0; + + break; + } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); } + + break; } default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); } byte[] buffer = new byte[sectorSize * length]; - imageStream = aaruTrack.TrackFilter.GetDataForkStream(); + imageStream = tag == SectorTagType.CdSectorSubchannel ? aaruTrack.TrackSubchannelFilter.GetDataForkStream() + : aaruTrack.TrackFilter.GetDataForkStream(); + var br = new BinaryReader(imageStream); br.BaseStream. - Seek((long)aaruTrack.TrackFileOffset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)), + Seek((long)(tag == SectorTagType.CdSectorSubchannel ? aaruTrack.TrackSubchannelOffset : aaruTrack.TrackFileOffset) + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)), SeekOrigin.Begin); if(sectorOffset == 0 && @@ -1134,7 +1156,7 @@ namespace Aaru.DiscImages Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize); } - return buffer; + return tag == SectorTagType.CdSectorSubchannel ? Subchannel.Interleave(buffer) : buffer; } public byte[] ReadSectorLong(ulong sectorAddress) => ReadSectorsLong(sectorAddress, 1);