diff options
| author | SND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-12-19 14:47:13 +0000 |
|---|---|---|
| committer | SND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-12-19 14:47:13 +0000 |
| commit | 42b45ab2a55567f160e6318f0a1975ac80f0a5ce (patch) | |
| tree | 55c0b205c2ae77321f097f9970485bab60b61fc2 /libpcsxcore | |
| parent | c2a2b28f6fb658d2e80dfcf0410d37dd5bb3811d (diff) | |
| download | pcsxr-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.c | 30 |
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); |
