From 8845b020102d2bbeb6b58adb35e6488e92f94d98 Mon Sep 17 00:00:00 2001 From: zeromus Date: Sun, 1 Feb 2015 02:10:55 +0000 Subject: [PATCH] add TOC-testing to mednadisc --- psx/mednadisc/Mednadisc.cpp | 44 +++++++++++++++++++++++++++---------- psx/mednadisc/Mednadisc.h | 6 ++--- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/psx/mednadisc/Mednadisc.cpp b/psx/mednadisc/Mednadisc.cpp index 97afe666be..41d1e95487 100644 --- a/psx/mednadisc/Mednadisc.cpp +++ b/psx/mednadisc/Mednadisc.cpp @@ -9,16 +9,32 @@ #include "cdrom/cdromif.h" #include "cdrom/CDAccess_Image.h" + +class MednaDisc +{ +public: + ~MednaDisc() + { + delete disc; + } + CDAccess* disc; + CDUtility::TOC toc; +}; + EW_EXPORT void* mednadisc_LoadCD(const char* fname) { CDAccess* disc = NULL; try { disc = cdaccess_open_image(fname,false); } - catch(MDFN_Error &e) { + catch(MDFN_Error &) { return NULL; } - return disc; + + MednaDisc* md = new MednaDisc(); + md->disc = disc; + disc->Read_TOC(&md->toc); + return md; } struct JustTOC @@ -28,28 +44,34 @@ struct JustTOC uint8 disc_type; }; -EW_EXPORT void mednadisc_ReadTOC(CDAccess* disc, JustTOC* justToc, CDUtility::TOC_Track *tracks101) +EW_EXPORT void mednadisc_ReadTOC(MednaDisc* md, JustTOC* justToc, CDUtility::TOC_Track *tracks101) { - CDUtility::TOC toc; - disc->Read_TOC(&toc); + CDUtility::TOC &toc = md->toc; justToc->first_track = toc.first_track; justToc->last_track = toc.last_track; justToc->disc_type = toc.disc_type; memcpy(tracks101,toc.tracks,sizeof(toc.tracks)); } -EW_EXPORT int32 mednadisc_ReadSector(CDAccess* disc, int lba, void* buf2448) +EW_EXPORT int32 mednadisc_ReadSector(MednaDisc* md, int lba, void* buf2448) { - try { - disc->Read_Raw_Sector((uint8*)buf2448,lba); + CDAccess* disc = md->disc; + CDUtility::TOC &toc = md->toc; + try + { + //if it's at the lead-out track or beyond, synthesize it as a lead-out sector + if(lba >= (int32)toc.tracks[100].lba) + synth_leadout_sector_lba(0x02, toc, lba, (uint8*)buf2448); + else + disc->Read_Raw_Sector((uint8*)buf2448,lba); } - catch(MDFN_Error &e) { + catch(MDFN_Error &) { return 0; } return 1; } -EW_EXPORT void mednadisc_CloseCD(CDAccess* disc) +EW_EXPORT void mednadisc_CloseCD(MednaDisc* md) { - delete disc; + delete md; } diff --git a/psx/mednadisc/Mednadisc.h b/psx/mednadisc/Mednadisc.h index e82dd5c4eb..1c080adb16 100644 --- a/psx/mednadisc/Mednadisc.h +++ b/psx/mednadisc/Mednadisc.h @@ -2,8 +2,8 @@ #include "emuware/emuware.h" -class CDAccess; +class MednaDisc; EW_EXPORT void* mednadisc_LoadCD(const char* fname); -EW_EXPORT int32 mednadisc_ReadSector(CDAccess* disc, int lba, void* buf2448); -EW_EXPORT void mednadisc_CloseCD(CDAccess* disc); \ No newline at end of file +EW_EXPORT int32 mednadisc_ReadSector(MednaDisc* disc, int lba, void* buf2448); +EW_EXPORT void mednadisc_CloseCD(MednaDisc* disc); \ No newline at end of file