X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fcdriso.c;h=fc1d0773ed9bdb23a4257a34063961a646d7bf7c;hb=9fb3178968e3cf83b9c0835aa4b39805b2ba6cf8;hp=25aa9de0a25dcf172781cc2aa2453e0e428c2ab9;hpb=2cc221eb6675f228e6ada72e3dc7d438babcfdc6;p=pcsx_rearmed.git diff --git a/libpcsxcore/cdriso.c b/libpcsxcore/cdriso.c index 25aa9de0..fc1d0773 100644 --- a/libpcsxcore/cdriso.c +++ b/libpcsxcore/cdriso.c @@ -43,6 +43,13 @@ #include #endif +#ifdef USE_LIBRETRO_VFS +#include +#undef fseeko +#undef ftello +#define ftello rftell +#define fseeko rfseek +#endif #define OFF_T_MSB ((off_t)1 << (sizeof(off_t) * 8 - 1)) unsigned int cdrIsoMultidiskCount; @@ -1057,7 +1064,10 @@ static int handlechd(const char *isofile) { goto fail_io; if(chd_open(isofile, CHD_OPEN_READ, NULL, &chd_img->chd) != CHDERR_NONE) - goto fail_io; + goto fail_io; + + if (Config.CHD_Precache && (chd_precache(chd_img->chd) != CHDERR_NONE)) + goto fail_io; chd_img->header = chd_get_header(chd_img->chd); @@ -1071,7 +1081,8 @@ static int handlechd(const char *isofile) { cddaBigEndian = TRUE; numtracks = 0; - int frame_offset = 150; + int frame_offset = 0; + int file_offset = 0; memset(ti, 0, sizeof(ti)); while (1) @@ -1096,18 +1107,20 @@ static int handlechd(const char *isofile) { else break; - ti[md.track].type = !strncmp(md.type, "AUDIO", 5) ? CDDA : DATA; + if(md.track == 1) + md.pregap = 150; + else + sec2msf(msf2sec(ti[md.track-1].length) + md.pregap, ti[md.track-1].length); - sec2msf(frame_offset + md.pregap, ti[md.track].start); - sec2msf(md.frames - md.pregap, ti[md.track].length); + ti[md.track].type = !strncmp(md.type, "AUDIO", 5) ? CDDA : DATA; - if (!strcmp(md.type, md.pgtype)) - frame_offset += md.pregap; + sec2msf(frame_offset + md.pregap, ti[md.track].start); + sec2msf(md.frames, ti[md.track].length); - ti[md.track].start_offset = frame_offset * CD_FRAMESIZE_RAW; + ti[md.track].start_offset = file_offset; - frame_offset += md.frames; - frame_offset += md.postgap; + frame_offset += md.pregap + md.frames + md.postgap; + file_offset += md.frames + md.postgap; numtracks++; } @@ -1267,14 +1280,19 @@ static void *readThreadMain(void *param) { last_read_sector = requested_sector_end; } + index = ra_sector % SECTOR_BUFFER_SIZE; + // check for end of CD if (ra_count && ra_sector >= max_sector) { ra_count = 0; + pthread_mutex_lock(§orbuffer_lock); + sectorbuffer[index].ret = -1; + sectorbuffer[index].sector = ra_sector; + pthread_cond_signal(§orbuffer_cond); + pthread_mutex_unlock(§orbuffer_lock); } if (ra_count) { - - index = ra_sector % SECTOR_BUFFER_SIZE; pthread_mutex_lock(§orbuffer_lock); if (sectorbuffer[index].sector != ra_sector) { pthread_mutex_unlock(§orbuffer_lock); @@ -1484,19 +1502,17 @@ static int cdread_chd(FILE *f, unsigned int base, void *dest, int sector) int hunk; if (base) - sector += base / CD_FRAMESIZE_RAW; + sector += base; hunk = sector / chd_img->sectors_per_hunk; chd_img->sector_in_hunk = sector % chd_img->sectors_per_hunk; - if (hunk == chd_img->current_hunk) - goto finish; - - chd_read(chd_img->chd, hunk, chd_img->buffer); - - chd_img->current_hunk = hunk; + if (hunk != chd_img->current_hunk) + { + chd_read(chd_img->chd, hunk, chd_img->buffer); + chd_img->current_hunk = hunk; + } -finish: if (dest != cdbuffer) // copy avoid HACK memcpy(dest, chd_img->buffer[chd_img->sector_in_hunk], CD_FRAMESIZE_RAW);