try fixing gpgx cd audio

This commit is contained in:
CasualPokePlayer 2024-04-27 03:09:37 -07:00
parent fb3578cfb4
commit 095d160034
3 changed files with 21 additions and 13 deletions

Binary file not shown.

View File

@ -6,14 +6,14 @@
#define SECTOR_DATA_SIZE 2352 #define SECTOR_DATA_SIZE 2352
#define SECTOR_SUBCODE_SIZE 96 #define SECTOR_SUBCODE_SIZE 96
ECL_INVISIBLE toc_t hotswap_toc; ECL_INVISIBLE toc_t pending_toc;
int8 cd_index = 0; int8 cd_index = 0;
struct cdStream_t struct cdStream_t
{ {
int sector_size; unsigned sector_size;
int num_sectors; unsigned num_sectors;
int64_t current_sector; unsigned current_sector;
int64_t current_offset; int64_t current_offset;
int64_t end_offset; int64_t end_offset;
}; };
@ -31,9 +31,10 @@ static void cdStreamInit(cdStream* stream, toc_t* toc, int is_subcode)
if (!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].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 (!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; cd_index = 0;
cdStreamInit(&cd_streams[0], &cdd.toc, 0); cdStreamInit(&cd_streams[0], &pending_toc, 0);
return &cd_streams[0]; return &cd_streams[0];
} }
} }
else if (!strcmp(fname, "HOTSWAP_CD")) else if (!strcmp(fname, "HOTSWAP_CD"))
{ {
memcpy(&cdd.toc, &hotswap_toc, sizeof(toc_t)); cdStreamInit(&cd_streams[cd_index], &pending_toc, 0);
cdStreamInit(&cd_streams[cd_index], &cdd.toc, 0);
return &cd_streams[cd_index]; return &cd_streams[cd_index];
} }
} }
else if (!strcmp(fext, ".iso")) else if (!strcmp(fext, ".iso"))
{ {
// an .iso will attempt to be loaded for the "secondary" CD // 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; cd_index = 0;
cdStreamInit(&cd_streams[0], &cdd.toc, 0); cdStreamInit(&cd_streams[0], &pending_toc, 0);
return &cd_streams[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")) else if (!strcmp(fext, ".sub"))
{ {
// separate stream for subcode // separate stream for subcode

View File

@ -188,7 +188,7 @@ GPGX_EX void gpgx_advance(void)
nsamples = audio_update(soundbuffer); nsamples = audio_update(soundbuffer);
} }
extern toc_t hotswap_toc; extern toc_t pending_toc;
extern int8 cd_index; extern int8 cd_index;
GPGX_EX void gpgx_swap_disc(const toc_t* toc, int8 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]; char header[0x210];
cd_index = index; cd_index = index;
memcpy(&hotswap_toc, toc, sizeof(toc_t)); memcpy(&pending_toc, toc, sizeof(toc_t));
cdd_load("HOTSWAP_CD", header); cdd_load("HOTSWAP_CD", header);
} }
else else