From 8dc2c5043f62df3c91c5798ef6cc05e39403873b Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 25 Jan 2018 23:29:54 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9BFix=20writing=20subchannel=20on=20A?= =?UTF-8?q?lcohol=20and=20CDRDAO.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DiscImageChef.DiscImages/Alcohol120.cs | 39 +++++++++++++++---------- DiscImageChef.DiscImages/CDRDAO.cs | 40 ++++++++++++++++---------- 2 files changed, 49 insertions(+), 30 deletions(-) diff --git a/DiscImageChef.DiscImages/Alcohol120.cs b/DiscImageChef.DiscImages/Alcohol120.cs index 4ae74e4a..8cefea78 100644 --- a/DiscImageChef.DiscImages/Alcohol120.cs +++ b/DiscImageChef.DiscImages/Alcohol120.cs @@ -1615,16 +1615,9 @@ namespace DiscImageChef.DiscImages 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), SeekOrigin.Begin); imageStream.Write(data, 0, data.Length); - return true; } @@ -1664,17 +1657,33 @@ namespace DiscImageChef.DiscImages return false; } - if(track.TrackSubchannelType != TrackSubchannelType.None) + switch(track.TrackSubchannelType) { - ErrorMessage = "Invalid subchannel mode for this sector"; - return false; - } - - imageStream.Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)track.TrackRawBytesPerSector), + case TrackSubchannelType.None: + imageStream + .Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)track.TrackRawBytesPerSector), 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) diff --git a/DiscImageChef.DiscImages/CDRDAO.cs b/DiscImageChef.DiscImages/CDRDAO.cs index b8428a57..4bed743c 100644 --- a/DiscImageChef.DiscImages/CDRDAO.cs +++ b/DiscImageChef.DiscImages/CDRDAO.cs @@ -1610,12 +1610,6 @@ namespace DiscImageChef.DiscImages 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), SeekOrigin.Begin); trackStream.Write(data, 0, data.Length); @@ -1667,17 +1661,33 @@ namespace DiscImageChef.DiscImages return false; } - if(track.TrackSubchannelType != TrackSubchannelType.None) + switch(track.TrackSubchannelType) { - ErrorMessage = "Invalid subchannel mode for this sector"; - return false; - } - - trackStream.Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)track.TrackRawBytesPerSector), + case TrackSubchannelType.None: + trackStream + .Seek((long)(track.TrackFileOffset + (sectorAddress - track.TrackStartSector) * (ulong)track.TrackRawBytesPerSector), 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) @@ -1788,7 +1798,7 @@ namespace DiscImageChef.DiscImages if(writingTracks != null && writingStreams != null) foreach(FileStream oldTrack in writingStreams.Select(t => t.Value).Distinct()) oldTrack.Close(); - + ulong currentOffset = 0; writingTracks = new List(); foreach(Track track in tracks.OrderBy(t => t.TrackSequence))