improve CD stream init

This commit is contained in:
CasualPokePlayer 2024-04-26 12:43:22 -07:00
parent 9e2d239a02
commit 3e3d8fbec3
1 changed files with 14 additions and 6 deletions

View File

@ -35,14 +35,22 @@ ECL_INVISIBLE static int cache_is_allocated[256];
} \ } \
} while (0); } while (0);
static void cdStreamInit(cdStream* stream, int is_subcode) static void cdStreamInit(cdStream* stream, toc_t* toc, int is_subcode)
{ {
stream->sector_size = is_subcode ? SECTOR_SUBCODE_SIZE : SECTOR_DATA_SIZE; stream->sector_size = is_subcode ? SECTOR_SUBCODE_SIZE : SECTOR_DATA_SIZE;
stream->num_sectors = cdd.toc.end; // should only be called with current CD stream->num_sectors = toc->end;
stream->current_sector = 0; stream->current_sector = 0;
stream->current_offset = 0; stream->current_offset = 0;
stream->end_offset = stream->sector_size * (int64_t)stream->num_sectors; stream->end_offset = stream->sector_size * (int64_t)stream->num_sectors;
ALLOC_CACHE(stream); ALLOC_CACHE(stream);
if (!is_subcode)
{
for (int i = 0; i < toc->last; i++)
{
toc->tracks[i].fd = stream;
}
}
} }
cdStream* cdStreamOpen(const char* fname) cdStream* cdStreamOpen(const char* fname)
@ -61,14 +69,14 @@ cdStream* cdStreamOpen(const char* fname)
if (load_archive("PRIMARY_CD", (unsigned char*)&cdd.toc, sizeof(toc_t), NULL)) if (load_archive("PRIMARY_CD", (unsigned char*)&cdd.toc, sizeof(toc_t), NULL))
{ {
cd_index = 0; cd_index = 0;
cdStreamInit(&cd_streams[0], 0); cdStreamInit(&cd_streams[0], &cdd.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)); memcpy(&cdd.toc, &hotswap_toc, sizeof(toc_t));
cdStreamInit(&cd_streams[cd_index], 0); cdStreamInit(&cd_streams[cd_index], &cdd.toc, 0);
return &cd_streams[cd_index]; return &cd_streams[cd_index];
} }
} }
@ -78,14 +86,14 @@ cdStream* cdStreamOpen(const char* fname)
if (load_archive("SECONDARY_CD", (unsigned char*)&cdd.toc, sizeof(toc_t), NULL)) if (load_archive("SECONDARY_CD", (unsigned char*)&cdd.toc, sizeof(toc_t), NULL))
{ {
cd_index = 0; cd_index = 0;
cdStreamInit(&cd_streams[0], 0); cdStreamInit(&cd_streams[0], &cdd.toc, 0);
return &cd_streams[0]; return &cd_streams[0];
} }
} }
else if (!strcmp(fext, ".sub")) else if (!strcmp(fext, ".sub"))
{ {
// separate stream for subcode // separate stream for subcode
cdStreamInit(&subcode_streams[cd_index], 1); cdStreamInit(&subcode_streams[cd_index], &cdd.toc, 1);
return &subcode_streams[cd_index]; return &subcode_streams[cd_index];
} }