Some cleanup.

This commit is contained in:
Sorgelig
2022-02-20 23:21:22 +08:00
parent efe27ea77e
commit b7c1fc1d8b
3 changed files with 112 additions and 108 deletions

View File

@@ -12,13 +12,12 @@
void lba_to_hunkinfo(chd_file *chd_f, int lba, int *hunknumber, int *hunkoffset)
{
const chd_header *chd_header = chd_get_header(chd_f);
int sectors_per_hunk = chd_header->hunkbytes / chd_header->unitbytes;
int sectors_per_hunk = chd_header->hunkbytes / chd_header->unitbytes;
*hunknumber = lba / sectors_per_hunk;
*hunkoffset = lba % sectors_per_hunk;
return;
}
int mister_chd_log(const char *format, ...)
{
char logline[1024];
@@ -50,18 +49,20 @@ chd_error mister_load_chd(const char *filename, toc_t *cd_toc)
//Load track info
int sector_cnt = 0;
for(cd_toc->last = 0; cd_toc->last < 99; cd_toc->last++)
for (cd_toc->last = 0; cd_toc->last < 99; cd_toc->last++)
{
char tmp[512];
int track_id = 0, frames = 0, pregap = 0, postgap = 0;
char track_type[64], subtype[32], pgtype[32], pgsub[32];
if(chd_get_metadata(cd_toc->chd_f, CDROM_TRACK_METADATA2_TAG, cd_toc->last, tmp, sizeof(tmp), NULL, NULL, NULL) == CHDERR_NONE)
if (chd_get_metadata(cd_toc->chd_f, CDROM_TRACK_METADATA2_TAG, cd_toc->last, tmp, sizeof(tmp), NULL, NULL, NULL) == CHDERR_NONE)
{
if (sscanf(tmp, CDROM_TRACK_METADATA2_FORMAT, &track_id, track_type, subtype, &frames, &pregap, pgtype, pgsub, &postgap) != 8) break ;
} else if (chd_get_metadata(cd_toc->chd_f, CDROM_TRACK_METADATA_TAG, cd_toc->last, tmp, sizeof(tmp), NULL, NULL, NULL) == CHDERR_NONE) {
if (sscanf(tmp, CDROM_TRACK_METADATA2_FORMAT, &track_id, track_type, subtype, &frames, &pregap, pgtype, pgsub, &postgap) != 8) break;
}
else if (chd_get_metadata(cd_toc->chd_f, CDROM_TRACK_METADATA_TAG, cd_toc->last, tmp, sizeof(tmp), NULL, NULL, NULL) == CHDERR_NONE) {
if (sscanf(tmp, CDROM_TRACK_METADATA_FORMAT, &track_id, track_type, subtype, &frames) != 4) break;
} else {
}
else {
//No more tracks
break;
}
@@ -77,51 +78,56 @@ chd_error mister_load_chd(const char *filename, toc_t *cd_toc)
{
if (!pregap_valid)
{
cd_toc->tracks[cd_toc->last-1].end += pregap;
cd_toc->tracks[cd_toc->last - 1].end += pregap;
}
cd_toc->end = cd_toc->tracks[cd_toc->last-1].end;
cd_toc->end = cd_toc->tracks[cd_toc->last - 1].end;
cd_toc->tracks[cd_toc->last].start = cd_toc->end;
if (pregap_valid)
{
cd_toc->tracks[cd_toc->last].start += pregap;
}
cd_toc->tracks[cd_toc->last].index1 = pregap;
} else {
cd_toc->tracks[cd_toc->last].index1 = pregap;
}
else {
if (pregap_valid)
{
cd_toc->tracks[cd_toc->last].start = pregap;
} else {
}
else {
cd_toc->tracks[cd_toc->last].start = 0;
}
cd_toc->tracks[cd_toc->last].index1 = pregap;
cd_toc->tracks[cd_toc->last].index1 = pregap;
}
if (!pregap_valid)
{
//Pregap sectors are NOT included in the CHD for this track
pregap = 0;
}
if (!pregap_valid)
{
//Pregap sectors are NOT included in the CHD for this track
pregap = 0;
}
if (!strcmp(track_type, "MODE1_RAW"))
{
cd_toc->tracks[cd_toc->last].sector_size = 2352;
cd_toc->tracks[cd_toc->last].type = 1;
} else if (!strcmp(track_type, "MODE2_RAW")) {
}
else if (!strcmp(track_type, "MODE2_RAW")) {
cd_toc->tracks[cd_toc->last].sector_size = 2352;
cd_toc->tracks[cd_toc->last].type = 2;
} else if (!strcmp(track_type, "MODE1")) {
}
else if (!strcmp(track_type, "MODE1")) {
cd_toc->tracks[cd_toc->last].sector_size = 2048;
cd_toc->tracks[cd_toc->last].type = 1;
} else if (!strcmp(track_type, "MODE2")) {
}
else if (!strcmp(track_type, "MODE2")) {
cd_toc->tracks[cd_toc->last].sector_size = 2336;
cd_toc->tracks[cd_toc->last].type = 2;
} else if (!strcmp(track_type, "AUDIO")) {
}
else if (!strcmp(track_type, "AUDIO")) {
cd_toc->tracks[cd_toc->last].sector_size = 2352;
cd_toc->tracks[cd_toc->last].type = 0;
} else {
}
else {
cd_toc->tracks[cd_toc->last].sector_size = 0;
cd_toc->tracks[cd_toc->last].type = 0;
}
@@ -129,7 +135,8 @@ chd_error mister_load_chd(const char *filename, toc_t *cd_toc)
cd_toc->tracks[cd_toc->last].sbc_type = SUBCODE_NONE;
if (!strcmp(subtype, "RW")) {
cd_toc->tracks[cd_toc->last].sbc_type = SUBCODE_RW;
} else if (!strcmp(subtype, "RW_RAW")) {
}
else if (!strcmp(subtype, "RW_RAW")) {
cd_toc->tracks[cd_toc->last].sbc_type = SUBCODE_RW_RAW;
}
@@ -138,13 +145,12 @@ chd_error mister_load_chd(const char *filename, toc_t *cd_toc)
cd_toc->tracks[cd_toc->last].end = cd_toc->tracks[cd_toc->last].start + frames - pregap;
cd_toc->end = cd_toc->tracks[cd_toc->last].end + postgap;
sector_cnt += ((frames + CD_TRACK_PADDING - 1) / CD_TRACK_PADDING) * CD_TRACK_PADDING;
mister_chd_log("Track %d: Type: %s PreGap: %d PreGapType: %s Frames: %d start: %d end %d\n", cd_toc->last, track_type, pregap, pgtype, frames, cd_toc->tracks[cd_toc->last].start, cd_toc->tracks[cd_toc->last].end);
mister_chd_log("Track %d: Type: %s PreGap: %d PreGapType: %s Frames: %d start: %d end %d\n", cd_toc->last, track_type, pregap, pgtype, frames, cd_toc->tracks[cd_toc->last].start, cd_toc->tracks[cd_toc->last].end);
}
return CHDERR_NONE;
}
chd_error mister_chd_read_sector(chd_file *chd_f, int lba, uint32_t d_offset, uint32_t s_offset, int length, uint8_t *destbuf, uint8_t *hunkbuf, int *hunknum)
{
@@ -166,6 +172,6 @@ chd_error mister_chd_read_sector(chd_file *chd_f, int lba, uint32_t d_offset, ui
*hunknum = tmphnum;
}
int sector_offset = hunkofs * CD_FRAME_SIZE;
memcpy(destbuf+d_offset, hunkbuf+sector_offset+s_offset, length);
memcpy(destbuf + d_offset, hunkbuf + sector_offset + s_offset, length);
return CHDERR_NONE;
}

View File

@@ -1,7 +1,6 @@
#ifndef MISTER_CHD_INCLUDED
#define MISTER_CHD_INCLUDED
#include <libchdr/chd.h>
#include <libchdr/cdrom.h>
#include "../../cd.h"

View File

@@ -19,7 +19,6 @@ static char buf[1024];
static uint8_t chd_hunkbuf[CD_FRAME_SIZE * CD_FRAMES_PER_HUNK];
static int chd_hunknum;
static int sgets(char *out, int sz, char **in)
{
*out = 0;
@@ -105,17 +104,16 @@ static uint16_t libCryptMask(const char *sbifile)
static void unload_chd(toc_t *table)
{
if (table->chd_f)
{
chd_close(table->chd_f);
}
memset(chd_hunkbuf, 0, sizeof(chd_hunkbuf));
memset(table, 0, sizeof(toc_t));
chd_hunknum = -1;
if (table->chd_f)
{
chd_close(table->chd_f);
}
memset(chd_hunkbuf, 0, sizeof(chd_hunkbuf));
memset(table, 0, sizeof(toc_t));
chd_hunknum = -1;
}
static void unload_cue(toc_t *table)
{
for (int i = 0; i < table->last; i++)
@@ -128,34 +126,32 @@ static void unload_cue(toc_t *table)
static int load_chd(const char *filename, toc_t *table)
{
unload_chd(table);
chd_error err = mister_load_chd(filename, table);
if (err != CHDERR_NONE)
{
return 0;
}
unload_chd(table);
chd_error err = mister_load_chd(filename, table);
if (err != CHDERR_NONE)
{
return 0;
}
for(int i = 0; i < table->last; i++)
{
if (i == 0) //First track fakes a pregap even if it doesn't exist
{
table->tracks[i].index1 = 150;
table->tracks[i].start = 150;
}
table->tracks[i].end += (table->tracks[i].index1 - 1);
}
table->end = table->tracks[table->last-1].end+1;
memset(chd_hunkbuf, 0, sizeof(chd_hunkbuf));
chd_hunknum = -1;
return 1;
//Need to store hunkbuf, hunknum and chd_f
for (int i = 0; i < table->last; i++)
{
if (i == 0) //First track fakes a pregap even if it doesn't exist
{
table->tracks[i].index1 = 150;
table->tracks[i].start = 150;
}
table->tracks[i].end += (table->tracks[i].index1 - 1);
}
table->end = table->tracks[table->last - 1].end + 1;
memset(chd_hunkbuf, 0, sizeof(chd_hunkbuf));
chd_hunknum = -1;
return 1;
//Need to store hunkbuf, hunknum and chd_f
}
static int load_cue(const char* filename, toc_t *table)
{
static char fname[1024 + 10];
@@ -266,8 +262,8 @@ static int load_cue(const char* filename, toc_t *table)
table->tracks[table->last].start = (bb + ss * 75 + mm * 60 * 75) + pregap;
//if (!table->last && table->tracks[table->last - 1].end == 0)
table->tracks[table->last-1].end = (bb + ss * 75 + mm * 60 * 75)+ pregap -1;
table->tracks[table->last - 1].end = (bb + ss * 75 + mm * 60 * 75) + pregap - 1;
}
}
else if ((sscanf(lptr, "INDEX 01 %02d:%02d:%02d", &mm, &ss, &bb) == 3) ||
@@ -282,13 +278,13 @@ static int load_cue(const char* filename, toc_t *table)
table->tracks[table->last].index1 = bb + ss * 75 + mm * 60 * 75;
// Set start if its not set yet (some cue files have both Index 0 and Index 1) else set the end of this track.
if(!table->tracks[table->last].start)
if (!table->tracks[table->last].start)
table->tracks[table->last].start = bb + ss * 75 + mm * 60 * 75 + pregap;
else
table->tracks[table->last].end = bb + ss * 75 + mm * 60 * 75 + pregap;
int lasttrackend = table->tracks[table->last - 1].index1;
table->tracks[table->last-1].index1 = (bb + ss * 75 + mm * 60 * 75)- lasttrackend;
table->tracks[table->last - 1].index1 = (bb + ss * 75 + mm * 60 * 75) - lasttrackend;
if (table->tracks[table->last].type && !table->last) table->tracks[table->last].index1 = 150;
@@ -303,7 +299,7 @@ static int load_cue(const char* filename, toc_t *table)
table->tracks[table->last - 1].end = table->tracks[table->last].start - 1;
}
// Check if the data track is set to be the full disc
if (table->last == 1 && table->tracks[0].end == table->end-1)
if (table->last == 1 && table->tracks[0].end == table->end - 1)
{
table->tracks[table->last - 1].end = table->tracks[table->last].start - 1;
}
@@ -325,8 +321,8 @@ static int load_cue(const char* filename, toc_t *table)
for (int i = 0; i < table->last; i++)
{
printf("\x1b[32mPSX: Track = %u, start = %u, end = %u, offset = %d, sector_size=%d, type = %u\n\x1b[0m", i, table->tracks[i].start, table->tracks[i].end, table->tracks[i].offset, table->tracks[i].sector_size, table->tracks[i].type);
if(table->tracks[i].index1)
printf("\x1b[32mPSX: Track = %u,Index1 = %u seconds\n\x1b[0m", i, table->tracks[i].index1/75);
if (table->tracks[i].index1)
printf("\x1b[32mPSX: Track = %u,Index1 = %u seconds\n\x1b[0m", i, table->tracks[i].index1 / 75);
}
@@ -336,17 +332,18 @@ static int load_cue(const char* filename, toc_t *table)
static int load_cd_image(const char *filename, toc_t *table)
{
const char *ext = strrchr(filename, '.');
if (!ext) return 0;
const char *ext = strrchr(filename, '.');
if (!ext) return 0;
if (!strncasecmp(".chd", ext, 4))
{
return load_chd(filename, table);
} else if (!strncasecmp(".cue", ext, 4)) {
return load_cue(filename,table);
}
if (!strncasecmp(".chd", ext, 4))
{
return load_chd(filename, table);
}
else if (!strncasecmp(".cue", ext, 4)) {
return load_cue(filename, table);
}
return 0;
return 0;
}
@@ -451,37 +448,39 @@ void psx_read_cd(uint8_t *buffer, int lba, int cnt)
{
if (lba >= toc.tracks[i].start && lba <= toc.tracks[i].end)
{
if (!toc.chd_f)
{
if(toc.tracks[i].offset)
FileSeek(&toc.tracks[0].f, ((lba * CD_SECTOR_LEN) - toc.tracks[i].offset), SEEK_SET);
else
FileSeek(&toc.tracks[i].f, (lba - toc.tracks[i].start) * CD_SECTOR_LEN, SEEK_SET);
}
if (!toc.chd_f)
{
if (toc.tracks[i].offset)
FileSeek(&toc.tracks[0].f, ((lba * CD_SECTOR_LEN) - toc.tracks[i].offset), SEEK_SET);
else
FileSeek(&toc.tracks[i].f, (lba - toc.tracks[i].start) * CD_SECTOR_LEN, SEEK_SET);
}
while (cnt)
{
if (toc.chd_f)
{
if (mister_chd_read_sector(toc.chd_f, (lba - toc.tracks[i].index1) + toc.tracks[i].offset, 0, 0, CD_SECTOR_LEN, buffer, chd_hunkbuf, &chd_hunknum) == CHDERR_NONE)
{
if (!toc.tracks[i].type) //CHD requires byteswap of audio data
{
for (int swapidx = 0; swapidx < CD_SECTOR_LEN; swapidx += 2)
{
uint8_t temp = buffer[swapidx];
buffer[swapidx] = buffer[swapidx+1];
buffer[swapidx+1] = temp;
}
}
} else {
printf("\x1b[32mPSX: CHD read error: %d\n\x1b[0m", lba);
}
} else {
if (toc.tracks[i].offset)
FileReadAdv(&toc.tracks[0].f, buffer, CD_SECTOR_LEN);
else
FileReadAdv(&toc.tracks[i].f, buffer, CD_SECTOR_LEN);
}
if (toc.chd_f)
{
if (mister_chd_read_sector(toc.chd_f, (lba - toc.tracks[i].index1) + toc.tracks[i].offset, 0, 0, CD_SECTOR_LEN, buffer, chd_hunkbuf, &chd_hunknum) == CHDERR_NONE)
{
if (!toc.tracks[i].type) //CHD requires byteswap of audio data
{
for (int swapidx = 0; swapidx < CD_SECTOR_LEN; swapidx += 2)
{
uint8_t temp = buffer[swapidx];
buffer[swapidx] = buffer[swapidx + 1];
buffer[swapidx + 1] = temp;
}
}
}
else {
printf("\x1b[32mPSX: CHD read error: %d\n\x1b[0m", lba);
}
}
else {
if (toc.tracks[i].offset)
FileReadAdv(&toc.tracks[0].f, buffer, CD_SECTOR_LEN);
else
FileReadAdv(&toc.tracks[i].f, buffer, CD_SECTOR_LEN);
}
if ((lba + 1) > toc.tracks[i].end) break;
buffer += CD_SECTOR_LEN;
cnt--;
@@ -595,7 +594,7 @@ void psx_mount_cd(int f_index, int s_index, const char *filename)
{
printf("Unmount CD\n");
unload_cue(&toc);
unload_chd(&toc);
unload_chd(&toc);
mount_cd(0, s_index);
}
}