Enable generation of RAW CD sectors from images that do only contains them cooked. Fixes #301

This commit is contained in:
2020-06-21 22:30:07 +01:00
parent 83a28237fa
commit aca0c78bad
15 changed files with 404 additions and 54 deletions

View File

@@ -35,6 +35,7 @@ using System.IO;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces;
using Aaru.CommonTypes.Structs;
using Aaru.Decoders.CD;
namespace Aaru.DiscImages
{
@@ -49,6 +50,7 @@ namespace Aaru.DiscImages
Stream _imageStream;
/// <summary>Dictionary, index is track #, value is TrackFile</summary>
Dictionary<uint, ulong> _offsetMap;
SectorBuilder _sectorBuilder;
bool _separateTracksWriting;
Dictionary<byte, byte> _trackFlags;
Dictionary<byte, string> _trackIsrcs;
@@ -60,12 +62,9 @@ namespace Aaru.DiscImages
public CdrWin() => _imageInfo = new ImageInfo
{
ReadableSectorTags = new List<SectorTagType>(), ReadableMediaTags = new List<MediaTagType>(),
HasPartitions = true, HasSessions = true, Version = null,
ApplicationVersion = null,
MediaTitle = null, Creator = null, MediaManufacturer = null,
MediaModel = null,
MediaPartNumber = null, MediaSequence = 0, LastMediaSequence = 0,
DriveManufacturer = null,
HasPartitions = true, HasSessions = true, Version = null, ApplicationVersion = null,
MediaTitle = null, Creator = null, MediaManufacturer = null, MediaModel = null,
MediaPartNumber = null, MediaSequence = 0, LastMediaSequence = 0, DriveManufacturer = null,
DriveModel = null, DriveSerialNumber = null, DriveFirmwareRevision = null
};
}

View File

@@ -45,6 +45,7 @@ using Aaru.Console;
using Aaru.Decoders.CD;
using Schemas;
using Session = Aaru.CommonTypes.Structs.Session;
using TrackType = Aaru.CommonTypes.Enums.TrackType;
namespace Aaru.DiscImages
{
@@ -1326,6 +1327,8 @@ namespace Aaru.DiscImages
if(!string.IsNullOrEmpty(_imageInfo.Comments))
AaruConsole.VerboseWriteLine("CDRWIN comments: {0}", _imageInfo.Comments);
_sectorBuilder = new SectorBuilder();
return true;
}
catch(Exception ex)
@@ -1849,6 +1852,86 @@ namespace Aaru.DiscImages
Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize);
}
switch(aaruTrack.TrackType)
{
case CDRWIN_TRACK_TYPE_MODE1:
{
byte[] fullSector = new byte[2352];
byte[] fullBuffer = new byte[2352 * length];
for(uint i = 0; i < length; i++)
{
Array.Copy(buffer, i * 2048, fullSector, 16, 2048);
_sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode1, (long)(sectorAddress + i));
_sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode1);
Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352);
}
buffer = fullBuffer;
break;
}
case CDRWIN_TRACK_TYPE_MODE2_FORM1:
{
byte[] fullSector = new byte[2352];
byte[] fullBuffer = new byte[2352 * length];
for(uint i = 0; i < length; i++)
{
Array.Copy(buffer, i * 2048, fullSector, 24, 2048);
_sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Form1,
(long)(sectorAddress + i));
_sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode2Form1);
Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352);
}
buffer = fullBuffer;
break;
}
case CDRWIN_TRACK_TYPE_MODE2_FORM2:
{
byte[] fullSector = new byte[2352];
byte[] fullBuffer = new byte[2352 * length];
for(uint i = 0; i < length; i++)
{
Array.Copy(buffer, i * 2324, fullSector, 24, 2324);
_sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Form2,
(long)(sectorAddress + i));
_sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode2Form2);
Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352);
}
buffer = fullBuffer;
break;
}
case CDRWIN_TRACK_TYPE_MODE2_FORMLESS:
case CDRWIN_TRACK_TYPE_CDI:
{
byte[] fullSector = new byte[2352];
byte[] fullBuffer = new byte[2352 * length];
for(uint i = 0; i < length; i++)
{
_sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Formless,
(long)(sectorAddress + i));
Array.Copy(buffer, i * 2336, fullSector, 16, 2336);
Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352);
}
buffer = fullBuffer;
break;
}
}
return buffer;
}