From: notaz <notasas@gmail.com>
Date: Thu, 3 Nov 2022 00:13:39 +0000 (+0200)
Subject: cdriso: fix up chd for separated subq reads
X-Git-Tag: r24~285
X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9afc3b574dbe79c7a4c615986beb503cc5435864;p=pcsx_rearmed.git

cdriso: fix up chd for separated subq reads
---

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