summaryrefslogtreecommitdiff
path: root/libpcsxcore
diff options
context:
space:
mode:
authorSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-12-19 14:47:13 +0000
committerSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-12-19 14:47:13 +0000
commit42b45ab2a55567f160e6318f0a1975ac80f0a5ce (patch)
tree55c0b205c2ae77321f097f9970485bab60b61fc2 /libpcsxcore
parentc2a2b28f6fb658d2e80dfcf0410d37dd5bb3811d (diff)
downloadpcsxr-42b45ab2a55567f160e6318f0a1975ac80f0a5ce.tar.gz
cdriso.c
- (utunnels) Add 2048 ISO mode git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@61318 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore')
-rw-r--r--libpcsxcore/cdriso.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/libpcsxcore/cdriso.c b/libpcsxcore/cdriso.c
index 7f210772..a19ddd72 100644
--- a/libpcsxcore/cdriso.c
+++ b/libpcsxcore/cdriso.c
@@ -44,6 +44,12 @@ static unsigned char subbuffer[SUB_FRAMESIZE];
static unsigned char sndbuffer[CD_FRAMESIZE_RAW * 10];
#define CDDA_FRAMETIME (1000 * (sizeof(sndbuffer) / CD_FRAMESIZE_RAW) / 75)
+
+
+#define MODE1_DATA_SIZE 2048
+
+static boolean isMode1ISO = FALSE;
+
#ifdef _WIN32
static HANDLE threadid;
@@ -784,6 +790,8 @@ static void PrintTracks(void) {
// This function is invoked by the front-end when opening an ISO
// file for playback
static long CALLBACK ISOopen(void) {
+ u32 modeTest = 0;
+
if (cdHandle != NULL) {
return 0; // it's already open
}
@@ -810,7 +818,17 @@ static long CALLBACK ISOopen(void) {
}
else if (parsetoc(GetIsoFile()) == 0) {
SysPrintf("[+toc]");
- }
+ } else {
+ //guess whether it is mode1/2048
+ fseek(cdHandle, 0, SEEK_END);
+ if(ftell(cdHandle) % 2048 == 0) {
+ fseek(cdHandle, 0, SEEK_SET);
+ fread(&modeTest, 4, 1, cdHandle);
+ if(modeTest!=0xffffff00) isMode1ISO = TRUE;
+ }
+ fseek(cdHandle, 0, SEEK_SET);
+ }
+
if (!subChanMixed && opensubfile(GetIsoFile()) == 0) {
SysPrintf("[+sub]");
@@ -927,7 +945,15 @@ static long CALLBACK ISOreadTrack(unsigned char *time) {
if (subChanRaw) DecodeRawSubData();
}
- else {
+ else if(isMode1ISO) {
+ fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * MODE1_DATA_SIZE, SEEK_SET);
+ fread(cdbuffer + 12, 1, MODE1_DATA_SIZE, cdHandle);
+ memset(cdbuffer, 0, 12); //not really necessary, fake mode 2 header
+ cdbuffer[0] = (time[0]);
+ cdbuffer[1] = (time[1]);
+ cdbuffer[2] = (time[2]);
+ cdbuffer[3] = 1; //mode 1
+ } else {
fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * CD_FRAMESIZE_RAW + 12, SEEK_SET);
fread(cdbuffer, 1, DATA_SIZE, cdHandle);