mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Enable generation of RAW CD sectors from images that do only contains them cooked. Fixes #301
This commit is contained in:
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user