From 9afc3b574dbe79c7a4c615986beb503cc5435864 Mon Sep 17 00:00:00 2001 From: notaz Date: Thu, 3 Nov 2022 02:13:39 +0200 Subject: [PATCH] cdriso: fix up chd for separated subq reads --- libpcsxcore/cdriso.c | 52 +++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/libpcsxcore/cdriso.c b/libpcsxcore/cdriso.c index a755a23b..31895794 100644 --- a/libpcsxcore/cdriso.c +++ b/libpcsxcore/cdriso.c @@ -83,11 +83,12 @@ static struct { #ifdef HAVE_CHD static struct { - unsigned char (*buffer)[CD_FRAMESIZE_RAW + SUB_FRAMESIZE]; + unsigned char *buffer; chd_file* chd; const chd_header* header; unsigned int sectors_per_hunk; - unsigned int current_hunk; + unsigned int current_hunk[2]; + unsigned int current_buffer; unsigned int sector_in_hunk; } *chd_img; #endif @@ -952,12 +953,13 @@ static int handlechd(const char *isofile) { chd_img->header = chd_get_header(chd_img->chd); - chd_img->buffer = malloc(chd_img->header->hunkbytes); + chd_img->buffer = malloc(chd_img->header->hunkbytes * 2); if (chd_img->buffer == NULL) goto fail_io; chd_img->sectors_per_hunk = chd_img->header->hunkbytes / (CD_FRAMESIZE_RAW + SUB_FRAMESIZE); - chd_img->current_hunk = (unsigned int)-1; + chd_img->current_hunk[0] = (unsigned int)-1; + chd_img->current_hunk[1] = (unsigned int)-1; cddaBigEndian = TRUE; @@ -1216,44 +1218,64 @@ finish: } #ifdef HAVE_CHD +static unsigned char *chd_get_sector(unsigned int current_buffer, unsigned int sector_in_hunk) +{ + return chd_img->buffer + + current_buffer * chd_img->header->hunkbytes + + sector_in_hunk * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE); +} + static int cdread_chd(FILE *f, unsigned int base, void *dest, int sector) { int hunk; - sector += base; + assert(base == 0); hunk = sector / chd_img->sectors_per_hunk; chd_img->sector_in_hunk = sector % chd_img->sectors_per_hunk; - if (hunk != chd_img->current_hunk) + if (hunk == chd_img->current_hunk[0]) + chd_img->current_buffer = 0; + else if (hunk == chd_img->current_hunk[1]) + chd_img->current_buffer = 1; + else { - chd_read(chd_img->chd, hunk, chd_img->buffer); - chd_img->current_hunk = hunk; + chd_read(chd_img->chd, hunk, chd_img->buffer + + chd_img->current_buffer * chd_img->header->hunkbytes); + chd_img->current_hunk[chd_img->current_buffer] = hunk; } if (dest != cdbuffer) // copy avoid HACK - memcpy(dest, chd_img->buffer[chd_img->sector_in_hunk], + memcpy(dest, chd_get_sector(chd_img->current_buffer, chd_img->sector_in_hunk), CD_FRAMESIZE_RAW); return CD_FRAMESIZE_RAW; } static int cdread_sub_chd(FILE *f, int sector) { + unsigned int sector_in_hunk; + unsigned int buffer; int hunk; if (!subChanMixed) return -1; hunk = sector / chd_img->sectors_per_hunk; - chd_img->sector_in_hunk = sector % chd_img->sectors_per_hunk; + sector_in_hunk = sector % chd_img->sectors_per_hunk; - if (hunk != chd_img->current_hunk) + if (hunk == chd_img->current_hunk[0]) + buffer = 0; + else if (hunk == chd_img->current_hunk[1]) + buffer = 1; + else { - chd_read(chd_img->chd, hunk, chd_img->buffer); - chd_img->current_hunk = hunk; + buffer = chd_img->current_buffer ^ 1; + chd_read(chd_img->chd, hunk, chd_img->buffer + + buffer * chd_img->header->hunkbytes); + chd_img->current_hunk[buffer] = hunk; } - memcpy(subbuffer, chd_img->buffer[chd_img->sector_in_hunk] + CD_FRAMESIZE_RAW, SUB_FRAMESIZE); + memcpy(subbuffer, chd_get_sector(buffer, sector_in_hunk) + CD_FRAMESIZE_RAW, SUB_FRAMESIZE); return SUB_FRAMESIZE; } #endif @@ -1279,7 +1301,7 @@ static unsigned char * CALLBACK ISOgetBuffer_compr(void) { #ifdef HAVE_CHD static unsigned char * CALLBACK ISOgetBuffer_chd(void) { - return chd_img->buffer[chd_img->sector_in_hunk] + 12; + return chd_get_sector(chd_img->current_buffer, chd_img->sector_in_hunk) + 12; } #endif -- 2.39.2