diff --git a/BizHawk.Emulation.DiscSystem/CUE/CUE_Load.cs b/BizHawk.Emulation.DiscSystem/CUE/CUE_Load.cs index 5f03caba8d..7c2321fcd6 100644 --- a/BizHawk.Emulation.DiscSystem/CUE/CUE_Load.cs +++ b/BizHawk.Emulation.DiscSystem/CUE/CUE_Load.cs @@ -184,7 +184,6 @@ namespace BizHawk.Emulation.DiscSystem //mount all input files MountBlobs(); - var zeroBlob = new Disc.Blob_Zeros(); //unhappily, we cannot determine the length of all the tracks without knowing the length of the files //now that the files are mounted, we can figure the track lengths @@ -288,52 +287,37 @@ namespace BizHawk.Emulation.DiscSystem } } - //TODO - may need to extract this sector creating to a new method, - //if the particulars of the mode-byte setting WRT. pregap intervals end up being more complex - //generate the right kind of sector synth for this track - //TODO - there are needless constructions SS_Base ss = null; - int sectorSize = int.MaxValue; - switch (cct.TrackType) - { - case CueFile.TrackType.Audio: - ss = new SS_2352(); - sectorSize = 2352; - break; - - case CueFile.TrackType.CDI_2352: - case CueFile.TrackType.Mode1_2352: - ss = new SS_2352(); - sectorSize = 2352; - break; - - case CueFile.TrackType.Mode2_2352: - ss = new SS_2352(); - sectorSize = 2352; - break; - - case CueFile.TrackType.Mode1_2048: - ss = new SS_Mode1_2048(); - sectorSize = 2048; - break; - - default: - case CueFile.TrackType.Mode2_2336: - throw new InvalidOperationException("Not supported: " + cct.TrackType); - } - - //if we were supposed to generate a gap, replace it with a new sector synth and feed it zeros if (generateGap) { + //if we were supposed to generate a gap, replace it with a new sector synth and feed it zeros ss = new SS_Gap(); - ss.Blob = zeroBlob; - ss.TrackType = cct.TrackType; - ss.Gap = true; //not used... + ss.TrackType = cct.TrackType; //TODO - old track type in some < -150 cases? } else { - //otherwise we consumed data from the blob + int sectorSize = int.MaxValue; + switch (cct.TrackType) + { + case CueFile.TrackType.Audio: + case CueFile.TrackType.CDI_2352: + case CueFile.TrackType.Mode1_2352: + case CueFile.TrackType.Mode2_2352: + ss = new SS_2352(); + sectorSize = 2352; + break; + + case CueFile.TrackType.Mode1_2048: + ss = new SS_Mode1_2048(); + sectorSize = 2048; + break; + + default: + case CueFile.TrackType.Mode2_2336: + throw new InvalidOperationException("Not supported: " + cct.TrackType); + } + ss.Blob = curr_blobInfo.Blob; ss.BlobOffset = curr_blobOffset; ss.TrackType = cct.TrackType; @@ -385,9 +369,8 @@ namespace BizHawk.Emulation.DiscSystem for (int s = 0; s < specifiedPostgapLength; s++) { var se= new SectorEntry(null); - SS_Base ss; - if (cct.TrackType == CueFile.TrackType.Audio) ss = new SS_AudioGap(); - else ss = new SS_DataGap(); + SS_Base ss = new SS_Gap(); + ss.TrackType = cct.TrackType; //TODO - old track type in some < -150 cases? //-subq- byte ADR = 1; @@ -436,28 +419,3 @@ namespace BizHawk.Emulation.DiscSystem } //partial class CUE_Format2 } //namespace BizHawk.Emulation.DiscSystem - - - -//TODO: - //if (index_num == 0 || type == SectorWriteType.Pregap) - //{ - // //PREGAP: - // //things are negative here. - // if (track_relative_msf > 0) throw new InvalidOperationException("Perplexing internal error with non-negative pregap MSF"); - // track_relative_msf = -track_relative_msf; - - // //now for something special. - // //yellow-book says: - // //pre-gap for "first part of a digital data track not containing user data and encoded as a pause" - // //first interval: at least 75 sectors coded as preceding track - // //second interval: at least 150 sectors coded as user data track. - // //so... we ASSUME the 150 sector pregap is more important. so if thats all there is, theres no 75 sector pregap like the old track - // //if theres a longer pregap, then we generate weird old track pregap to contain the rest. - // if (track_relative_msf > 150) - // { - // //only if we're burning a data track now - // if((track_flags & CueFile.TrackFlags.DATA)!=0) - // sq.q_status = priorSubchannelQ.q_status; - // } - //} \ No newline at end of file diff --git a/BizHawk.Emulation.DiscSystem/CUE/CUE_Synths.cs b/BizHawk.Emulation.DiscSystem/CUE/CUE_Synths.cs index 690ff4ed2c..730277b667 100644 --- a/BizHawk.Emulation.DiscSystem/CUE/CUE_Synths.cs +++ b/BizHawk.Emulation.DiscSystem/CUE/CUE_Synths.cs @@ -11,15 +11,21 @@ namespace BizHawk.Emulation.DiscSystem { public IBlob Blob; public long BlobOffset; - public SubchannelQ sq; - public bool Pause, Gap; - public CueFile.TrackType TrackType; + public DiscMountPolicy Policy; + //subQ data + public SubchannelQ sq; + + //subP data + public bool Pause; //not sure I like this anymore.. .. .. should be determined from track type, right? + + //required + public CueFile.TrackType TrackType; + public abstract void Synth(SectorSynthJob job); - //"as needed" - protected void SynthSubcode(SectorSynthJob job) + protected void SynthSubchannelAsNeed(SectorSynthJob job) { //synth P if needed if ((job.Parts & ESectorSynthPart.SubchannelP) != 0) @@ -117,33 +123,22 @@ namespace BizHawk.Emulation.DiscSystem if ((job.Parts & ESectorSynthPart.ECMAny) != 0) SynthUtils.ECM_Mode1(job.DestBuffer2448, job.DestOffset + 0, job.LBA); - SynthSubcode(job); + SynthSubchannelAsNeed(job); } } /// - /// Represents a data pregap or postgap sector. - /// The Pause flag isn't set in here because it might need special logic varying between sectors and so that's setup by the cue loader - /// Implemented as another sector type with a blob reading all zeros + /// Represents a 2352-byte sector of any sort /// - class SS_DataGap : SS_Mode1_2048 + class SS_2352 : SS_Base { - public SS_DataGap() + public override void Synth(SectorSynthJob job) { - Blob = new Disc.Blob_Zeros(); - } - } + //read the sector user data + Blob.Read(BlobOffset, job.DestBuffer2448, job.DestOffset, 2352); - /// - /// Represents an audio pregap or postgap sector. - /// The Pause flag isn't set in here because it might need special logic varying between sectors and so that's setup by the cue loader - /// Implemented as another sector type with a blob reading all zeros - /// - class SS_AudioGap : SS_2352 - { - public SS_AudioGap() - { - Blob = new Disc.Blob_Zeros(); + //if subcode is needed, synthesize it + SynthSubchannelAsNeed(job); } } @@ -180,6 +175,7 @@ namespace BizHawk.Emulation.DiscSystem case CueFile.TrackType.Mode1_2048: mode = 1; + Pause = true; break; case CueFile.TrackType.Mode2_2336: @@ -187,8 +183,12 @@ namespace BizHawk.Emulation.DiscSystem throw new InvalidOperationException("Not supported: " + TrackType); } - if ((job.Parts & ESectorSynthPart.Header16) != 0) - SynthUtils.SectorHeader(job.DestBuffer2448, job.DestOffset + 0, job.LBA, mode); + //audio has no sector header but the others do + if (mode != 0) + { + if ((job.Parts & ESectorSynthPart.Header16) != 0) + SynthUtils.SectorHeader(job.DestBuffer2448, job.DestOffset + 0, job.LBA, mode); + } if (mode == 1) { @@ -200,24 +200,10 @@ namespace BizHawk.Emulation.DiscSystem SynthUtils.EDC_Mode2_Form2(job.DestBuffer2448, job.DestOffset); } - SynthSubcode(job); + SynthSubchannelAsNeed(job); } } - /// - /// Represents a 2352-byte sector of any sort - /// - class SS_2352 : SS_Base - { - public override void Synth(SectorSynthJob job) - { - //read the sector user data - Blob.Read(BlobOffset, job.DestBuffer2448, job.DestOffset, 2352); - - //if subcode is needed, synthesize it - SynthSubcode(job); - } - } } } \ No newline at end of file