disc - correctly generate audio->data track transition 3-second pregaps (Street Fighter Collection (USA) (Disc 1))
This commit is contained in:
parent
a8a0d35a97
commit
ed43d773a6
|
@ -281,6 +281,7 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
session.Tracks.Add(toc_track);
|
session.Tracks.Add(toc_track);
|
||||||
toc_track.Number = curr_track;
|
toc_track.Number = curr_track;
|
||||||
toc_track.TrackType = cue_track.TrackType;
|
toc_track.TrackType = cue_track.TrackType;
|
||||||
|
toc_track.ADR = 1; //safe assumption. CUE can't store this.
|
||||||
|
|
||||||
//choose a Control value based on track type and other flags from cue
|
//choose a Control value based on track type and other flags from cue
|
||||||
//TODO - this might need to be controlled by cue loading prefs
|
//TODO - this might need to be controlled by cue loading prefs
|
||||||
|
|
|
@ -328,16 +328,14 @@ FILE ""xarp.barp.marp.farp"" BINARY
|
||||||
|
|
||||||
var se = Sectors[aba];
|
var se = Sectors[aba];
|
||||||
|
|
||||||
EControlQ control = dp.Track.Control;
|
EControlQ control = dp.Control;
|
||||||
bool pause = true;
|
bool pause = true;
|
||||||
if (dp.Num != 0) //TODO - shouldnt this be IndexNum?
|
if (dp.Num != 0) //TODO - shouldnt this be IndexNum?
|
||||||
pause = false;
|
pause = false;
|
||||||
if ((dp.Track.Control & EControlQ.DataUninterrupted)!=0)
|
if ((dp.Control & EControlQ.DataUninterrupted)!=0)
|
||||||
pause = false;
|
pause = false;
|
||||||
|
|
||||||
//we always use ADR=1 (mode-1 q block)
|
int adr = dp.ADR;
|
||||||
//this could be more sophisticated but it is almost useless for emulation (only useful for catalog/ISRC numbers)
|
|
||||||
int adr = 1;
|
|
||||||
|
|
||||||
SubchannelQ sq = new SubchannelQ();
|
SubchannelQ sq = new SubchannelQ();
|
||||||
sq.q_status = SubchannelQ.ComputeStatus(adr, control);
|
sq.q_status = SubchannelQ.ComputeStatus(adr, control);
|
||||||
|
|
|
@ -21,6 +21,7 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
/// TODO - this is kind of garbage, but... I was using it for Synthesize_SubcodeFromStructure() :/
|
/// TODO - this is kind of garbage, but... I was using it for Synthesize_SubcodeFromStructure() :/
|
||||||
/// Really, what it is, is a series of points where the tno/index change. Kind of an agenda. And thats how that function uses it.
|
/// Really, what it is, is a series of points where the tno/index change. Kind of an agenda. And thats how that function uses it.
|
||||||
/// Maybe I should rename it something different, or at least comment it
|
/// Maybe I should rename it something different, or at least comment it
|
||||||
|
/// Or, you could look at this as a kind of compressed disc map
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<TOCPoint> Points;
|
public List<TOCPoint> Points;
|
||||||
|
|
||||||
|
@ -104,6 +105,9 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
public int ABA, TrackNum, IndexNum;
|
public int ABA, TrackNum, IndexNum;
|
||||||
public Track Track;
|
public Track Track;
|
||||||
|
|
||||||
|
public int ADR;
|
||||||
|
public EControlQ Control;
|
||||||
|
|
||||||
public int LBA
|
public int LBA
|
||||||
{
|
{
|
||||||
get { return ABA - 150; }
|
get { return ABA - 150; }
|
||||||
|
@ -116,23 +120,64 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
public void Synthesize_TOCPointsFromSessions()
|
public void Synthesize_TOCPointsFromSessions()
|
||||||
{
|
{
|
||||||
Points = new List<TOCPoint>();
|
Points = new List<TOCPoint>();
|
||||||
|
|
||||||
int num = 0;
|
int num = 0;
|
||||||
foreach (var ses in Sessions)
|
foreach (var ses in Sessions)
|
||||||
{
|
{
|
||||||
foreach (var track in ses.Tracks)
|
for(int t=0;t<ses.Tracks.Count;t++)
|
||||||
foreach (var index in track.Indexes)
|
{
|
||||||
|
int tnum = t + 1;
|
||||||
|
var track = ses.Tracks[t];
|
||||||
|
for(int i=0;i<track.Indexes.Count;i++)
|
||||||
{
|
{
|
||||||
|
var index = track.Indexes[i];
|
||||||
|
bool repeat = false;
|
||||||
|
int aba = index.aba;
|
||||||
|
REPEAT:
|
||||||
var tp = new TOCPoint
|
var tp = new TOCPoint
|
||||||
|
{
|
||||||
|
Num = num++,
|
||||||
|
ABA = aba,
|
||||||
|
TrackNum = track.Number,
|
||||||
|
IndexNum = index.Number,
|
||||||
|
Track = track,
|
||||||
|
ADR = track.ADR,
|
||||||
|
Control = track.Control
|
||||||
|
};
|
||||||
|
|
||||||
|
//special case!
|
||||||
|
//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.
|
||||||
|
//TODO - add pause flag tracking to TOCPoint
|
||||||
|
//see mednafen's "TODO: Look into how we're supposed to handle subq control field in the four combinations of track types(data/audio)."
|
||||||
|
if (tnum != 1 && i == 0 && track.TrackType != ETrackType.Audio && !repeat)
|
||||||
|
{
|
||||||
|
//NOTE: we dont implement this exactly the same as mednafen, I think my logic is closer to the docs, but who knows, its complicated
|
||||||
|
int distance = track.Indexes[i + 1].aba - track.Indexes[i].aba;
|
||||||
|
//well, how do we know to apply this logic?
|
||||||
|
//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 (distance > 150)
|
||||||
{
|
{
|
||||||
Num = num++,
|
int weirdPregapSize = distance - 150;
|
||||||
ABA = index.aba,
|
|
||||||
TrackNum = track.Number,
|
//need a new point. fix the old one
|
||||||
IndexNum = index.Number,
|
tp.ADR = Points[Points.Count - 1].ADR;
|
||||||
Track = track
|
tp.Control = Points[Points.Count - 1].Control;
|
||||||
};
|
Points.Add(tp);
|
||||||
|
|
||||||
|
aba += weirdPregapSize;
|
||||||
|
repeat = true;
|
||||||
|
goto REPEAT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Points.Add(tp);
|
Points.Add(tp);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var tpLeadout = new TOCPoint();
|
var tpLeadout = new TOCPoint();
|
||||||
var lastTrack = ses.Tracks[ses.Tracks.Count - 1];
|
var lastTrack = ses.Tracks[ses.Tracks.Count - 1];
|
||||||
|
@ -167,6 +212,9 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int Number;
|
public int Number;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Conceptual track type, not necessarily stored this way anywhere
|
||||||
|
/// </summary>
|
||||||
public ETrackType TrackType;
|
public ETrackType TrackType;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -176,6 +224,11 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EControlQ Control;
|
public EControlQ Control;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Well, it seems a track can have an ADR property (used to fill the subchannel Q). This is delivered from a CCD file but may have to be guessed from
|
||||||
|
/// </summary>
|
||||||
|
public int ADR = 1;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// All the indexes related to the track. These will be 0-Indexed, but they could be non-consecutive.
|
/// All the indexes related to the track. These will be 0-Indexed, but they could be non-consecutive.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
Loading…
Reference in New Issue