mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
🐛Fix writing subchannel on Alcohol and CDRDAO.
This commit is contained in:
@@ -1615,16 +1615,9 @@ namespace DiscImageChef.DiscImages
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(track.TrackSubchannelType != TrackSubchannelType.None)
|
|
||||||
{
|
|
||||||
ErrorMessage = "Invalid subchannel mode for this sector";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
imageStream.Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)track.TrackRawBytesPerSector),
|
imageStream.Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)track.TrackRawBytesPerSector),
|
||||||
SeekOrigin.Begin);
|
SeekOrigin.Begin);
|
||||||
imageStream.Write(data, 0, data.Length);
|
imageStream.Write(data, 0, data.Length);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1664,17 +1657,33 @@ namespace DiscImageChef.DiscImages
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(track.TrackSubchannelType != TrackSubchannelType.None)
|
switch(track.TrackSubchannelType)
|
||||||
{
|
{
|
||||||
ErrorMessage = "Invalid subchannel mode for this sector";
|
case TrackSubchannelType.None:
|
||||||
return false;
|
imageStream
|
||||||
}
|
.Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)track.TrackRawBytesPerSector),
|
||||||
|
|
||||||
imageStream.Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)track.TrackRawBytesPerSector),
|
|
||||||
SeekOrigin.Begin);
|
SeekOrigin.Begin);
|
||||||
imageStream.Write(data, 0, data.Length);
|
imageStream.Write(data, 0, data.Length);
|
||||||
|
|
||||||
return true;
|
ErrorMessage = "";
|
||||||
|
return true;
|
||||||
|
case TrackSubchannelType.Raw:
|
||||||
|
case TrackSubchannelType.RawInterleaved:
|
||||||
|
imageStream
|
||||||
|
.Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)(track.TrackRawBytesPerSector + 96)),
|
||||||
|
SeekOrigin.Begin);
|
||||||
|
for(uint i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
imageStream.Write(data, (int)(i * track.TrackRawBytesPerSector), track.TrackRawBytesPerSector);
|
||||||
|
imageStream.Position += 96;
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorMessage = "";
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
ErrorMessage = "Invalid subchannel mode for this sector";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool WriteSectorLong(byte[] data, ulong sectorAddress)
|
public bool WriteSectorLong(byte[] data, ulong sectorAddress)
|
||||||
|
|||||||
@@ -1610,12 +1610,6 @@ namespace DiscImageChef.DiscImages
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(track.TrackSubchannelType != TrackSubchannelType.None)
|
|
||||||
{
|
|
||||||
ErrorMessage = "Invalid subchannel mode for this sector";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
trackStream.Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)track.TrackRawBytesPerSector),
|
trackStream.Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)track.TrackRawBytesPerSector),
|
||||||
SeekOrigin.Begin);
|
SeekOrigin.Begin);
|
||||||
trackStream.Write(data, 0, data.Length);
|
trackStream.Write(data, 0, data.Length);
|
||||||
@@ -1667,17 +1661,33 @@ namespace DiscImageChef.DiscImages
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(track.TrackSubchannelType != TrackSubchannelType.None)
|
switch(track.TrackSubchannelType)
|
||||||
{
|
{
|
||||||
ErrorMessage = "Invalid subchannel mode for this sector";
|
case TrackSubchannelType.None:
|
||||||
return false;
|
trackStream
|
||||||
}
|
.Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)track.TrackRawBytesPerSector),
|
||||||
|
|
||||||
trackStream.Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)track.TrackRawBytesPerSector),
|
|
||||||
SeekOrigin.Begin);
|
SeekOrigin.Begin);
|
||||||
trackStream.Write(data, 0, data.Length);
|
trackStream.Write(data, 0, data.Length);
|
||||||
|
|
||||||
return true;
|
ErrorMessage = "";
|
||||||
|
return true;
|
||||||
|
case TrackSubchannelType.Raw:
|
||||||
|
case TrackSubchannelType.RawInterleaved:
|
||||||
|
trackStream
|
||||||
|
.Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)(track.TrackRawBytesPerSector + 96)),
|
||||||
|
SeekOrigin.Begin);
|
||||||
|
for(uint i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
trackStream.Write(data, (int)(i * track.TrackRawBytesPerSector), track.TrackRawBytesPerSector);
|
||||||
|
trackStream.Position += 96;
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorMessage = "";
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
ErrorMessage = "Invalid subchannel mode for this sector";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool WriteSectorLong(byte[] data, ulong sectorAddress)
|
public bool WriteSectorLong(byte[] data, ulong sectorAddress)
|
||||||
@@ -1788,7 +1798,7 @@ namespace DiscImageChef.DiscImages
|
|||||||
if(writingTracks != null && writingStreams != null)
|
if(writingTracks != null && writingStreams != null)
|
||||||
foreach(FileStream oldTrack in writingStreams.Select(t => t.Value).Distinct())
|
foreach(FileStream oldTrack in writingStreams.Select(t => t.Value).Distinct())
|
||||||
oldTrack.Close();
|
oldTrack.Close();
|
||||||
|
|
||||||
ulong currentOffset = 0;
|
ulong currentOffset = 0;
|
||||||
writingTracks = new List<Track>();
|
writingTracks = new List<Track>();
|
||||||
foreach(Track track in tracks.OrderBy(t => t.TrackSequence))
|
foreach(Track track in tracks.OrderBy(t => t.TrackSequence))
|
||||||
|
|||||||
Reference in New Issue
Block a user