Some cleanup.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#ifndef MISTER_CHD_INCLUDED
|
||||
#define MISTER_CHD_INCLUDED
|
||||
|
||||
|
||||
#include <libchdr/chd.h>
|
||||
#include <libchdr/cdrom.h>
|
||||
#include "../../cd.h"
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user