diff --git a/Assets/dll/gpgx.wbx.zst b/Assets/dll/gpgx.wbx.zst index 2acb7449f5..ac33e463c4 100644 Binary files a/Assets/dll/gpgx.wbx.zst and b/Assets/dll/gpgx.wbx.zst differ diff --git a/waterbox/gpgx/cinterface/cdStreamImpl.c b/waterbox/gpgx/cinterface/cdStreamImpl.c index 2eac57919d..5a6e26cd7c 100644 --- a/waterbox/gpgx/cinterface/cdStreamImpl.c +++ b/waterbox/gpgx/cinterface/cdStreamImpl.c @@ -6,14 +6,14 @@ #define SECTOR_DATA_SIZE 2352 #define SECTOR_SUBCODE_SIZE 96 -ECL_INVISIBLE toc_t hotswap_toc; +ECL_INVISIBLE toc_t pending_toc; int8 cd_index = 0; struct cdStream_t { - int sector_size; - int num_sectors; - int64_t current_sector; + unsigned sector_size; + unsigned num_sectors; + unsigned current_sector; int64_t current_offset; int64_t end_offset; }; @@ -31,9 +31,10 @@ static void cdStreamInit(cdStream* stream, toc_t* toc, int is_subcode) if (!is_subcode) { - for (int i = 0; i < toc->last; i++) + for (unsigned i = 0; i < toc->last; i++) { toc->tracks[i].fd = stream; + toc->tracks[i].offset = toc->tracks[i].start * SECTOR_DATA_SIZE; } } } @@ -51,30 +52,37 @@ cdStream* cdStreamOpen(const char* fname) { if (!strcmp(fname, "PRIMARY_CD")) { - if (load_archive("PRIMARY_CD", (unsigned char*)&cdd.toc, sizeof(toc_t), NULL)) + if (load_archive("PRIMARY_CD", (unsigned char*)&pending_toc, sizeof(toc_t), NULL)) { cd_index = 0; - cdStreamInit(&cd_streams[0], &cdd.toc, 0); + cdStreamInit(&cd_streams[0], &pending_toc, 0); return &cd_streams[0]; } } else if (!strcmp(fname, "HOTSWAP_CD")) { - memcpy(&cdd.toc, &hotswap_toc, sizeof(toc_t)); - cdStreamInit(&cd_streams[cd_index], &cdd.toc, 0); + cdStreamInit(&cd_streams[cd_index], &pending_toc, 0); return &cd_streams[cd_index]; } } else if (!strcmp(fext, ".iso")) { // an .iso will attempt to be loaded for the "secondary" CD - if (load_archive("SECONDARY_CD", (unsigned char*)&cdd.toc, sizeof(toc_t), NULL)) + if (load_archive("SECONDARY_CD", (unsigned char*)&pending_toc, sizeof(toc_t), NULL)) { cd_index = 0; - cdStreamInit(&cd_streams[0], &cdd.toc, 0); + cdStreamInit(&cd_streams[0], &pending_toc, 0); return &cd_streams[0]; } } + else if (!strcmp(fext, ".cue")) + { + // .cue file will attempt to be loaded for parsing + // we use this to know when to load in the TOC + // (can't do it when PRIMARY_CD/HOTSWAP_CD/SECONDARY_CD is opened, due to GPGX assuming those are a single track) + memcpy(&cdd.toc, &pending_toc, sizeof(toc_t)); + return NULL; + } else if (!strcmp(fext, ".sub")) { // separate stream for subcode diff --git a/waterbox/gpgx/cinterface/cinterface.c b/waterbox/gpgx/cinterface/cinterface.c index 591385b864..00f3197fe4 100644 --- a/waterbox/gpgx/cinterface/cinterface.c +++ b/waterbox/gpgx/cinterface/cinterface.c @@ -188,7 +188,7 @@ GPGX_EX void gpgx_advance(void) nsamples = audio_update(soundbuffer); } -extern toc_t hotswap_toc; +extern toc_t pending_toc; extern int8 cd_index; GPGX_EX void gpgx_swap_disc(const toc_t* toc, int8 index) @@ -199,7 +199,7 @@ GPGX_EX void gpgx_swap_disc(const toc_t* toc, int8 index) { char header[0x210]; cd_index = index; - memcpy(&hotswap_toc, toc, sizeof(toc_t)); + memcpy(&pending_toc, toc, sizeof(toc_t)); cdd_load("HOTSWAP_CD", header); } else