diff --git a/support/chd/mister_chd.cpp b/support/chd/mister_chd.cpp index e9a0a1c..715ccd5 100644 --- a/support/chd/mister_chd.cpp +++ b/support/chd/mister_chd.cpp @@ -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; } diff --git a/support/chd/mister_chd.h b/support/chd/mister_chd.h index 721de79..d15ab63 100644 --- a/support/chd/mister_chd.h +++ b/support/chd/mister_chd.h @@ -1,7 +1,6 @@ #ifndef MISTER_CHD_INCLUDED #define MISTER_CHD_INCLUDED - #include #include #include "../../cd.h" diff --git a/support/psx/psx.cpp b/support/psx/psx.cpp index 6a05245..95c32b4 100644 --- a/support/psx/psx.cpp +++ b/support/psx/psx.cpp @@ -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); } }