From a04fa26c0b98c20c7cb8117652bd9b07f3dd0d4f Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Tue, 16 Jun 2020 22:29:56 +0100 Subject: [PATCH] Allow to write multisession DVD/Blu-ray in Aaru Image Format and CDRWin. --- Aaru.Images/AaruFormat/Properties.cs | 24 ++++++++++--------- Aaru.Images/AaruFormat/Write.cs | 26 +++++--------------- Aaru.Images/CDRWin/Properties.cs | 36 ++++++++++++++-------------- 3 files changed, 37 insertions(+), 49 deletions(-) diff --git a/Aaru.Images/AaruFormat/Properties.cs b/Aaru.Images/AaruFormat/Properties.cs index 92229ed17..cb53d8287 100644 --- a/Aaru.Images/AaruFormat/Properties.cs +++ b/Aaru.Images/AaruFormat/Properties.cs @@ -42,17 +42,19 @@ namespace Aaru.DiscImages { public partial class AaruFormat { - public OpticalImageCapabilities OpticalCapabilities => OpticalImageCapabilities.CanStoreAudioTracks | - OpticalImageCapabilities.CanStoreDataTracks | - OpticalImageCapabilities.CanStorePregaps | - OpticalImageCapabilities.CanStoreSubchannelRw | - OpticalImageCapabilities.CanStoreSessions | - OpticalImageCapabilities.CanStoreIsrc | - OpticalImageCapabilities.CanStoreCdText | - OpticalImageCapabilities.CanStoreMcn | - OpticalImageCapabilities.CanStoreRawData | - OpticalImageCapabilities.CanStoreCookedData | - OpticalImageCapabilities.CanStoreMultipleTracks; + public OpticalImageCapabilities OpticalCapabilities => OpticalImageCapabilities.CanStoreAudioTracks | + OpticalImageCapabilities.CanStoreDataTracks | + OpticalImageCapabilities.CanStorePregaps | + OpticalImageCapabilities.CanStoreSubchannelRw | + OpticalImageCapabilities.CanStoreSessions | + OpticalImageCapabilities.CanStoreIsrc | + OpticalImageCapabilities.CanStoreCdText | + OpticalImageCapabilities.CanStoreMcn | + OpticalImageCapabilities.CanStoreRawData | + OpticalImageCapabilities.CanStoreCookedData | + OpticalImageCapabilities.CanStoreMultipleTracks | + OpticalImageCapabilities.CanStoreNotCdSessions | + OpticalImageCapabilities.CanStoreNotCdTracks; public ImageInfo Info => imageInfo; public string Name => "Aaru Format"; public Guid Id => new Guid("49360069-1784-4A2F-B723-0C844D610B0A"); diff --git a/Aaru.Images/AaruFormat/Write.cs b/Aaru.Images/AaruFormat/Write.cs index 0f5a1b60b..18585bbb8 100644 --- a/Aaru.Images/AaruFormat/Write.cs +++ b/Aaru.Images/AaruFormat/Write.cs @@ -1025,8 +1025,7 @@ namespace Aaru.DiscImages if(trk.TrackSequence == 0 && trk.TrackStartSector == 0 && trk.TrackEndSector == 0) - throw new ArgumentOutOfRangeException(nameof(sectorAddress), - "Can't found track containing requested sector"); + trk.TrackType = TrackType.Data; // TODO: Check intersession data type } // Close current block first @@ -1239,11 +1238,7 @@ namespace Aaru.DiscImages if(track.TrackSequence == 0 && track.TrackStartSector == 0 && track.TrackEndSector == 0) - { - ErrorMessage = $"Can't found track containing {sectorAddress}"; - - return false; - } + track.TrackType = TrackType.Data; if(data.Length != 2352) { @@ -1672,8 +1667,10 @@ namespace Aaru.DiscImages if(track.TrackSequence == 0 && track.TrackStartSector == 0 && track.TrackEndSector == 0) + track.TrackType = TrackType.Data; // TODO: Check intersession data type + else if(sectorAddress + length > track.TrackEndSector + 1) { - ErrorMessage = $"Can't found track containing {sectorAddress}"; + ErrorMessage = "Can't cross tracks"; return false; } @@ -1685,13 +1682,6 @@ namespace Aaru.DiscImages return false; } - if(sectorAddress + length > track.TrackEndSector + 1) - { - ErrorMessage = "Can't cross tracks"; - - return false; - } - sector = new byte[2352]; for(uint i = 0; i < length; i++) @@ -3494,11 +3484,7 @@ namespace Aaru.DiscImages if(track.TrackSequence == 0 && track.TrackStartSector == 0 && track.TrackEndSector == 0) - { - ErrorMessage = $"Can't found track containing {sectorAddress}"; - - return false; - } + track.TrackType = TrackType.Data; break; } diff --git a/Aaru.Images/CDRWin/Properties.cs b/Aaru.Images/CDRWin/Properties.cs index 7944b1ad1..b2fd92d46 100644 --- a/Aaru.Images/CDRWin/Properties.cs +++ b/Aaru.Images/CDRWin/Properties.cs @@ -41,16 +41,18 @@ namespace Aaru.DiscImages { public partial class CdrWin { - public OpticalImageCapabilities OpticalCapabilities => OpticalImageCapabilities.CanStoreAudioTracks | - OpticalImageCapabilities.CanStoreDataTracks | - OpticalImageCapabilities.CanStorePregaps | - OpticalImageCapabilities.CanStoreSessions | - OpticalImageCapabilities.CanStoreIsrc | - OpticalImageCapabilities.CanStoreCdText | - OpticalImageCapabilities.CanStoreMcn | - OpticalImageCapabilities.CanStoreRawData | - OpticalImageCapabilities.CanStoreCookedData | - OpticalImageCapabilities.CanStoreMultipleTracks; + public OpticalImageCapabilities OpticalCapabilities => OpticalImageCapabilities.CanStoreAudioTracks | + OpticalImageCapabilities.CanStoreDataTracks | + OpticalImageCapabilities.CanStorePregaps | + OpticalImageCapabilities.CanStoreSessions | + OpticalImageCapabilities.CanStoreIsrc | + OpticalImageCapabilities.CanStoreCdText | + OpticalImageCapabilities.CanStoreMcn | + OpticalImageCapabilities.CanStoreRawData | + OpticalImageCapabilities.CanStoreCookedData | + OpticalImageCapabilities.CanStoreMultipleTracks | + OpticalImageCapabilities.CanStoreNotCdSessions | + OpticalImageCapabilities.CanStoreNotCdTracks; public ImageInfo Info => _imageInfo; public string Name => "CDRWin cuesheet"; public Guid Id => new Guid("664568B2-15D4-4E64-8A7A-20BDA8B8386F"); @@ -72,14 +74,12 @@ namespace Aaru.DiscImages { var aaruTrack = new Track { - Indexes = cdrTrack.Indexes, TrackDescription = cdrTrack.Title, - TrackPregap = cdrTrack.Pregap, - TrackSession = cdrTrack.Session, TrackSequence = cdrTrack.Sequence, - TrackType = CdrWinTrackTypeToTrackType(cdrTrack.TrackType), - TrackFile = cdrTrack.TrackFile.DataFilter.GetFilename(), - TrackFilter = cdrTrack.TrackFile.DataFilter, - TrackFileOffset = cdrTrack.TrackFile.Offset, - TrackFileType = cdrTrack.TrackFile.FileType, TrackRawBytesPerSector = cdrTrack.Bps, + Indexes = cdrTrack.Indexes, TrackDescription = cdrTrack.Title, TrackPregap = cdrTrack.Pregap, + TrackSession = cdrTrack.Session, TrackSequence = cdrTrack.Sequence, + TrackType = CdrWinTrackTypeToTrackType(cdrTrack.TrackType), + TrackFile = cdrTrack.TrackFile.DataFilter.GetFilename(), + TrackFilter = cdrTrack.TrackFile.DataFilter, TrackFileOffset = cdrTrack.TrackFile.Offset, + TrackFileType = cdrTrack.TrackFile.FileType, TrackRawBytesPerSector = cdrTrack.Bps, TrackBytesPerSector = CdrWinTrackTypeToCookedBytesPerSector(cdrTrack.TrackType) };