diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs index e6b32048c..f5072080d 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs @@ -385,9 +385,13 @@ namespace Aaru.Core.Devices.Dumping _outputPlugin.WriteSectorsLong(data, i + r, 1); - // TODO: Convert Q16 to RAW if(desiredSubchannel != MmcSubchannel.None) + { + if(supportedSubchannel == MmcSubchannel.Q16) + sub = Subchannel.ConvertQToRaw(sub); + _outputPlugin.WriteSectorsTag(sub, i + r, 1, SectorTagType.CdSectorSubchannel); + } subLog?.WriteEntry(sub, supportedSubchannel == MmcSubchannel.Raw, (long)(i + r), 1); } @@ -502,9 +506,13 @@ namespace Aaru.Core.Devices.Dumping _outputPlugin.WriteSectorsLong(data, i, blocksToRead); - // TODO: Convert Q16 to RAW if(desiredSubchannel != MmcSubchannel.None) + { + if(supportedSubchannel == MmcSubchannel.Q16) + sub = Subchannel.ConvertQToRaw(sub); + _outputPlugin.WriteSectorsTag(sub, i, blocksToRead, SectorTagType.CdSectorSubchannel); + } subLog?.WriteEntry(sub, supportedSubchannel == MmcSubchannel.Raw, (long)i, blocksToRead); } diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs index c3b9a7d51..8facb3c23 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs @@ -755,7 +755,9 @@ namespace Aaru.Core.Devices.Dumping tmpBuf = new byte[subSize]; Array.Copy(cmdBuf, sectorSize, tmpBuf, 0, subSize); - // TODO: Convert Q16 to RAW + if(supportedSubchannel == MmcSubchannel.Q16) + tmpBuf = Subchannel.ConvertQToRaw(tmpBuf); + ret = _outputPlugin.WriteSectorTag(tmpBuf, 0, SectorTagType.CdSectorSubchannel); if(!ret) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs index 00beec36c..3067516a7 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs @@ -37,6 +37,7 @@ using Aaru.CommonTypes.Extents; using Aaru.CommonTypes.Structs.Devices.SCSI; using Aaru.Console; using Aaru.Core.Logging; +using Aaru.Decoders.CD; using Aaru.Decoders.SCSI; using Aaru.Devices; using Schemas; @@ -280,9 +281,13 @@ namespace Aaru.Core.Devices.Dumping Array.Copy(cmdBuf, sectorSize, sub, 0, subSize); _outputPlugin.WriteSectorLong(data, badSector); - // TODO: Convert Q16 to RAW if(desiredSubchannel != MmcSubchannel.None) + { + if(supportedSubchannel == MmcSubchannel.Q16) + sub = Subchannel.ConvertQToRaw(sub); + _outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel); + } subLog?.WriteEntry(sub, supportedSubchannel == MmcSubchannel.Raw, (long)badSector, 1); } @@ -382,9 +387,13 @@ namespace Aaru.Core.Devices.Dumping Array.Copy(cmdBuf, sectorSize, sub, 0, subSize); _outputPlugin.WriteSectorLong(data, badSector); - // TODO: Convert Q16 to RAW if(desiredSubchannel != MmcSubchannel.None) + { + if(supportedSubchannel == MmcSubchannel.Q16) + sub = Subchannel.ConvertQToRaw(sub); + _outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel); + } subLog?.WriteEntry(sub, supportedSubchannel == MmcSubchannel.Raw, (long)badSector, 1); } diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/LeadOuts.cs b/Aaru.Core/Devices/Dumping/CompactDisc/LeadOuts.cs index 973126c7e..a27acc576 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/LeadOuts.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/LeadOuts.cs @@ -34,6 +34,7 @@ using System; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Extents; using Aaru.Core.Logging; +using Aaru.Decoders.CD; using Aaru.Devices; using Schemas; @@ -307,10 +308,14 @@ namespace Aaru.Core.Devices.Dumping _outputPlugin.WriteSectorsLong(data, i, _maximumReadable); - // TODO: Convert Q16 to RAW if(desiredSubchannel != MmcSubchannel.None) + { + if(supportedSubchannel == MmcSubchannel.Q16) + sub = Subchannel.ConvertQToRaw(sub); + _outputPlugin.WriteSectorsTag(sub, i, _maximumReadable, SectorTagType.CdSectorSubchannel); + } subLog?.WriteEntry(sub, supportedSubchannel == MmcSubchannel.Raw, (long)i, _maximumReadable); diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs index b519daeaf..f999176af 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs @@ -34,6 +34,7 @@ using System; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Extents; using Aaru.Core.Logging; +using Aaru.Decoders.CD; using Aaru.Devices; using Schemas; @@ -179,9 +180,13 @@ namespace Aaru.Core.Devices.Dumping Array.Copy(cmdBuf, sectorSize, sub, 0, subSize); _outputPlugin.WriteSectorLong(data, badSector); - // TODO: Convert Q16 to RAW if(desiredSubchannel != MmcSubchannel.None) + { + if(supportedSubchannel == MmcSubchannel.Q16) + sub = Subchannel.ConvertQToRaw(sub); + _outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel); + } subLog?.WriteEntry(sub, supportedSubchannel == MmcSubchannel.Raw, (long)badSector, 1); } diff --git a/Aaru.Decoders b/Aaru.Decoders index f6dd21062..586c7e437 160000 --- a/Aaru.Decoders +++ b/Aaru.Decoders @@ -1 +1 @@ -Subproject commit f6dd21062de6e81f797057ff49e8531ef057d0f0 +Subproject commit 586c7e43763052ee2b97ad7b7c6fa09c102288b7 diff --git a/Aaru.Images/BlindWrite5/Read.cs b/Aaru.Images/BlindWrite5/Read.cs index ea1d6fa65..9e7b8bcb4 100644 --- a/Aaru.Images/BlindWrite5/Read.cs +++ b/Aaru.Images/BlindWrite5/Read.cs @@ -1670,6 +1670,10 @@ namespace Aaru.DiscImages Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize); } + if(tag == SectorTagType.CdSectorSubchannel && + chars.Subchannel == TrackSubchannelType.Q16Interleaved) + return Subchannel.ConvertQToRaw(buffer); + return buffer; } diff --git a/Aaru.Images/DiscJuggler/Read.cs b/Aaru.Images/DiscJuggler/Read.cs index cc6305fb1..dc9198382 100644 --- a/Aaru.Images/DiscJuggler/Read.cs +++ b/Aaru.Images/DiscJuggler/Read.cs @@ -535,8 +535,7 @@ namespace Aaru.DiscImages var partition = new Partition { Description = track.TrackDescription, Size = (ulong)(trackLen * track.TrackBytesPerSector), - Length = trackLen, Sequence = track.TrackSequence, - Offset = track.TrackFileOffset, + Length = trackLen, Sequence = track.TrackSequence, Offset = track.TrackFileOffset, Start = track.TrackStartSector, Type = track.TrackType.ToString() }; @@ -705,10 +704,9 @@ namespace Aaru.DiscImages public byte[] ReadSectors(ulong sectorAddress, uint length) { - foreach(KeyValuePair kvp in from kvp in offsetmap where sectorAddress >= kvp.Value + foreach(KeyValuePair kvp in from kvp in offsetmap where sectorAddress >= kvp.Value from track in Tracks where track.TrackSequence == kvp.Key - where sectorAddress < - track.TrackEndSector select kvp) + where sectorAddress < track.TrackEndSector select kvp) return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key); throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found"); @@ -720,8 +718,7 @@ namespace Aaru.DiscImages Where(kvp => sectorAddress >= kvp.Value). Where(kvp => Tracks. Where(track => track.TrackSequence == kvp.Key). - Any(track => sectorAddress < - track.TrackEndSector))) + Any(track => sectorAddress < track.TrackEndSector))) return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag); throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found"); @@ -959,11 +956,17 @@ namespace Aaru.DiscImages throw new ArgumentException("Unsupported tag requested for this track", nameof(tag)); case TrackSubchannelType.Q16Interleaved: - throw new ArgumentException("Q16 subchannel not yet supported"); + + sectorSize = 16; + + break; + default: + sectorSize = 96; + + break; } sectorOffset = 2352; - sectorSize = 96; sectorSkip = 0; break; @@ -1007,11 +1010,16 @@ namespace Aaru.DiscImages throw new ArgumentException("Unsupported tag requested for this track", nameof(tag)); case TrackSubchannelType.Q16Interleaved: - throw new ArgumentException("Q16 subchannel not yet supported"); + sectorSize = 16; + + break; + default: + sectorSize = 96; + + break; } sectorOffset = 2352; - sectorSize = 96; sectorSkip = 0; break; @@ -1031,11 +1039,16 @@ namespace Aaru.DiscImages throw new ArgumentException("Unsupported tag requested for this track", nameof(tag)); case TrackSubchannelType.Q16Interleaved: - throw new ArgumentException("Q16 subchannel not yet supported"); + sectorSize = 16; + + break; + default: + sectorSize = 96; + + break; } sectorOffset = 2352; - sectorSize = 96; sectorSkip = 0; break; @@ -1083,6 +1096,10 @@ namespace Aaru.DiscImages Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize); } + if(aaruTrack.TrackSubchannelType == TrackSubchannelType.Q16Interleaved && + tag == SectorTagType.CdSectorSubchannel) + return Subchannel.ConvertQToRaw(buffer); + return buffer; }