Respect the offset of the padding

The StartHunk logic was flawed and while working with CHD files before v5 didn't work for v5 (and above).
The extraframes logic did work in some cases (read 3 track CHDv5) but didn't work in all cases and was merely a hack in retrospective.

Thanks to the comment of @flyinghead (see also b6c2508922 (diff-cb507bb17d74342aa45b6e4d10d607af)) the logic is now correct and works for v4 and v5 files.
This commit is contained in:
Christoph "baka0815" Schwerdtfeger 2018-11-03 19:24:53 +01:00
parent 3a76b30188
commit 161e84598d
1 changed files with 15 additions and 30 deletions

View File

@ -35,40 +35,31 @@ struct CHDTrack : TrackFile
{
CHDDisc* disc;
u32 StartFAD;
u32 StartHunk;
u32 Offset;
u32 fmt;
u32 extraframes; /* number of "spillage" frames in previous tracks */
CHDTrack(CHDDisc* disc, u32 StartFAD,u32 StartHunk, u32 fmt, u32 extraframes)
CHDTrack(CHDDisc* disc, u32 StartFAD, u32 Offset, u32 fmt)
{
this->disc=disc;
this->StartFAD=StartFAD;
this->StartHunk=StartHunk;
this->Offset=Offset;
this->fmt=fmt;
this->extraframes = extraframes;
}
virtual void Read(u32 FAD,u8* dst,SectorFormat* sector_type,u8* subcode,SubcodeFormat* subcode_type)
virtual void Read(u32 FAD, u8* dst, SectorFormat* sector_type, u8* subcode, SubcodeFormat* subcode_type)
{
s32 fad_offs = FAD - (StartFAD + extraframes);
u32 hunk=(fad_offs)/(s32)disc->sph + StartHunk;
s32 fad_offs = FAD + Offset;
u32 hunk = fad_offs / disc->sph;
if (fad_offs < 0)
if (disc->old_hunk != hunk)
{
hunk--;
fad_offs += disc->sph;
}
if (disc->old_hunk!=hunk)
{
chd_read(disc->chd,hunk,disc->hunk_mem); //CHDERR_NONE
chd_read(disc->chd, hunk, disc->hunk_mem); //CHDERR_NONE
disc->old_hunk = hunk;
}
u32 hunk_ofs=fad_offs%disc->sph;
u32 hunk_ofs = fad_offs%disc->sph;
memcpy(dst,disc->hunk_mem+hunk_ofs*(2352+96),fmt);
memcpy(dst, disc->hunk_mem + hunk_ofs * (2352+96), fmt);
*sector_type=fmt==2352?SECFMT_2352:SECFMT_2048_MODE1;
@ -108,8 +99,7 @@ bool CHDDisc::TryOpen(const wchar* file)
u32 total_frames = 150;
u32 total_secs = 0;
u32 total_hunks = 0;
int extraframes = 0;
u32 Offset = 0;
for(;;)
{
@ -157,16 +147,11 @@ bool CHDDisc::TryOpen(const wchar* file)
t.EndFAD = total_frames - 1;
t.ADDR = 0;
t.CTRL = strcmp(type,"AUDIO") == 0 ? 0 : 4;
t.file = new CHDTrack(this, t.StartFAD, total_hunks, strcmp(type,"MODE1") ? 2352 : 2048, extraframes);
if (head->version >= 5)
{
int padded = (frames + CD_TRACK_PADDING - 1) / CD_TRACK_PADDING;
extraframes += (padded * CD_TRACK_PADDING) - frames;
}
t.file = new CHDTrack(this, t.StartFAD, Offset - t.StartFAD, strcmp(type,"MODE1") ? 2352 : 2048);
total_hunks += frames / sph;
if (frames % sph)
total_hunks++;
// CHD files are padded, so we have to respect the offset
int padded = (frames + CD_TRACK_PADDING - 1) / CD_TRACK_PADDING;
Offset += padded * CD_TRACK_PADDING;
tracks.push_back(t);
}