s32 cdvdRequestSector(u32 sector, s32 mode) { if (sector >= tracks[0].length) return -1; sector &= ~15; //align to 16-sector block threadRequestInfo.lsn = sector; threadRequestInfo.mode = mode; threadRequestPending = false; if (cdvdCacheFetch(sector, mode, threadRequestInfo.data)) { return 0; } threadRequestPending = true; ResetEvent(hRequestComplete); PulseEvent(hNotify); return 0; }
s32 cdvdDirectReadSector(s32 first, s32 mode, char *buffer) { static char data[16*2352]; if((u32)first>=tracks[0].length) return -1; s32 sector = first&(~15); //align to 16-sector block EnterCriticalSection( &CacheMutex ); if(!cdvdCacheFetch(sector,mode,data)) { s32 ret = -1; s32 tries=5; s32 count = 16; s32 left = tracks[0].length-sector; if(left<count) count=left; do { if(mode==CDVD_MODE_2048) ret = src->ReadSectors2048(sector,count,data); else ret = src->ReadSectors2352(sector,count,data); if(ret==0) break; tries--; } while((ret<0)&&(tries>0)); cdvdCacheUpdate(sector,mode,data); } LeaveCriticalSection( &CacheMutex ); s32 offset; if(mode==CDVD_MODE_2048) { offset = 2048*(first-sector); memcpy(buffer,data + offset,2048); return 0; } offset = 2352*(first-sector); s8* bfr = data + offset; switch(mode) { case CDVD_MODE_2328: memcpy(buffer,bfr+24,2328); return 0; case CDVD_MODE_2340: memcpy(buffer,bfr+12,2340); return 0; default: memcpy(buffer,bfr+12,2352); return 0; } return 0; }