summaryrefslogtreecommitdiff
path: root/libpcsxcore/cdriso.c
diff options
context:
space:
mode:
authorSND\dario86_cp <SND\dario86_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2011-03-12 18:54:28 +0000
committerSND\dario86_cp <SND\dario86_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2011-03-12 18:54:28 +0000
commita58cfdac407bc1d8fedc11acd924b275ba28cc51 (patch)
treeb4c2e08c34ef1bfe0ba947ef8eed931c9a43fc0e /libpcsxcore/cdriso.c
parent9bdd06684bcc627c06ddcf4c406f6b48f0dfe389 (diff)
downloadpcsxr-a58cfdac407bc1d8fedc11acd924b275ba28cc51.tar.gz
Commited patch in issue #8171 (by darktjm).
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@64524 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore/cdriso.c')
-rw-r--r--libpcsxcore/cdriso.c215
1 files changed, 113 insertions, 102 deletions
diff --git a/libpcsxcore/cdriso.c b/libpcsxcore/cdriso.c
index 4a4982c7..4ecf5eee 100644
--- a/libpcsxcore/cdriso.c
+++ b/libpcsxcore/cdriso.c
@@ -44,12 +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;
-
+
+
+#define MODE1_DATA_SIZE 2048
+
+static boolean isMode1ISO = FALSE;
+
#ifdef _WIN32
static HANDLE threadid;
@@ -61,15 +61,6 @@ static volatile boolean playing = FALSE;
static boolean cddaBigEndian = FALSE;
static volatile unsigned int cddaCurOffset = 0;
-char* CALLBACK CDR__getDriveLetter(void);
-long CALLBACK CDR__configure(void);
-long CALLBACK CDR__test(void);
-void CALLBACK CDR__about(void);
-long CALLBACK CDR__setfilename(char *filename);
-long CALLBACK CDR__getStatus(struct CdrStat *stat);
-
-extern void *hCDRDriver;
-
struct trackinfo {
enum {DATA=1, CDDA} type;
u8 start[3]; // MSF-format
@@ -82,11 +73,11 @@ static int numtracks = 0;
static struct trackinfo ti[MAXTRACKS];
// get a sector from a msf-array
-unsigned int msf2sec(char *msf) {
+unsigned int msf2sec(u8 *msf) {
return ((msf[0] * 60 + msf[1]) * 75) + msf[2];
}
-void sec2msf(unsigned int s, char *msf) {
+void sec2msf(unsigned int s, u8 *msf) {
msf[0] = s / 75 / 60;
s = s - msf[0] * 75 * 60;
msf[1] = s / 75;
@@ -95,7 +86,7 @@ void sec2msf(unsigned int s, char *msf) {
}
// divide a string of xx:yy:zz into m, s, f
-static void tok2msf(char *time, char *msf) {
+static void tok2msf(char *time, u8 *msf) {
char *token;
token = strtok(time, ":");
@@ -187,7 +178,8 @@ static void *playthread(void *param)
s += d;
- fread( subbuffer, 1, SUB_FRAMESIZE, cddaHandle );
+ if(fread( subbuffer, SUB_FRAMESIZE, 1, cddaHandle ) != 1)
+ perror("cdr sub read");
}
}
else {
@@ -195,9 +187,10 @@ static void *playthread(void *param)
sec = cddaCurOffset / CD_FRAMESIZE_RAW;
- if (subHandle != NULL) {
- fseek(subHandle, sec * SUB_FRAMESIZE, SEEK_SET);
- fread(subbuffer, 1, SUB_FRAMESIZE, subHandle);
+ if (s && subHandle != NULL) {
+ if(fseek(subHandle, sec * SUB_FRAMESIZE, SEEK_SET) < 0 ||
+ fread(subbuffer, SUB_FRAMESIZE, 1, subHandle) != 1)
+ perror("cdr sub read");
}
}
@@ -269,7 +262,7 @@ static void *playthread(void *param)
// Vib Ribbon: decoded buffer IRQ
- iso_play_cdbuf = sndbuffer;
+ iso_play_cdbuf = (u16 *)sndbuffer;
iso_play_bufptr = 0;
}
@@ -406,21 +399,21 @@ static int parsetoc(const char *isofile) {
sscanf(linebuf, "DATAFILE \"%[^\"]\" #%d %8s", name, &t, time2);
t /= CD_FRAMESIZE_RAW + (subChanMixed ? SUB_FRAMESIZE : 0);
t += 2 * 75;
- sec2msf(t, (char *)&ti[numtracks].start);
- tok2msf((char *)&time2, (char *)&ti[numtracks].length);
+ sec2msf(t, (u8 *)&ti[numtracks].start);
+ tok2msf((char *)&time2, (u8 *)&ti[numtracks].length);
}
else {
sscanf(linebuf, "DATAFILE \"%[^\"]\" %8s", name, time);
- tok2msf((char *)&time, (char *)&ti[numtracks].length);
+ tok2msf((char *)&time, (u8 *)&ti[numtracks].length);
}
}
else if (!strcmp(token, "FILE")) {
sscanf(linebuf, "FILE \"%[^\"]\" #%d %8s %8s", name, &t, time, time2);
- tok2msf((char *)&time, (char *)&ti[numtracks].start);
+ tok2msf((char *)&time, (u8 *)&ti[numtracks].start);
t /= CD_FRAMESIZE_RAW + (subChanMixed ? SUB_FRAMESIZE : 0);
- t += msf2sec(ti[numtracks].start) + 2 * 75;
- sec2msf(t, (char *)&ti[numtracks].start);
- tok2msf((char *)&time2, (char *)&ti[numtracks].length);
+ t += msf2sec((u8 *)&ti[numtracks].start) + 2 * 75;
+ sec2msf(t, (u8 *)&ti[numtracks].start);
+ tok2msf((char *)&time2, (u8 *)&ti[numtracks].length);
}
}
@@ -497,10 +490,10 @@ static int parsecue(const char *isofile) {
if (*tmp != '\n') sscanf(tmp, "%8s", time);
}
- tok2msf((char *)&time, (char *)&ti[numtracks].start);
+ tok2msf((char *)&time, (u8 *)&ti[numtracks].start);
- t = msf2sec(ti[numtracks].start) + 2 * 75;
- sec2msf(t, ti[numtracks].start);
+ t = msf2sec((u8 *)&ti[numtracks].start) + 2 * 75;
+ sec2msf(t, (u8 *)&ti[numtracks].start);
// If we've already seen another track, this is its end
if (numtracks > 1) {
@@ -607,29 +600,37 @@ static int parsemds(const char *isofile) {
memset(&ti, 0, sizeof(ti));
// check if it's a valid mds file
- fread(&i, 1, sizeof(unsigned int), fi);
- i = SWAP32(i);
- if (i != 0x4944454D) {
+ if(fread(&i, sizeof(unsigned int), 1, fi) != 1 ||
+ SWAP32(i) != 0x4944454D) {
// not an valid mds file
fclose(fi);
return -1;
}
// get offset to session block
- fseek(fi, 0x50, SEEK_SET);
- fread(&offset, 1, sizeof(unsigned int), fi);
+ if(fseek(fi, 0x50, SEEK_SET) < 0 ||
+ fread(&offset, sizeof(unsigned int), 1, fi) != 1) {
+ fclose(fi);
+ return -1;
+ }
offset = SWAP32(offset);
// get total number of tracks
offset += 14;
- fseek(fi, offset, SEEK_SET);
- fread(&s, 1, sizeof(unsigned short), fi);
+ if(fseek(fi, offset, SEEK_SET) < 0 ||
+ fread(&s, sizeof(unsigned short), 1, fi) != 1) {
+ fclose(fi);
+ return -1;
+ }
s = SWAP16(s);
numtracks = s;
// get offset to track blocks
- fseek(fi, 4, SEEK_CUR);
- fread(&offset, 1, sizeof(unsigned int), fi);
+ if(fseek(fi, 4, SEEK_CUR) < 0 ||
+ fread(&offset, sizeof(unsigned int), 1, fi) != 1) {
+ fclose(fi);
+ return -1;
+ }
offset = SWAP32(offset);
// skip lead-in data
@@ -664,11 +665,17 @@ static int parsemds(const char *isofile) {
}
// get the track length
- fread(&extra_offset, 1, sizeof(unsigned int), fi);
+ if(fread(&extra_offset, sizeof(unsigned int), 1, fi) != 1) {
+ fclose(fi);
+ return -1;
+ }
extra_offset = SWAP32(extra_offset);
- fseek(fi, extra_offset + 4, SEEK_SET);
- fread(&l, 1, sizeof(unsigned int), fi);
+ if(fseek(fi, extra_offset + 4, SEEK_SET) < 0 ||
+ fread(&l, sizeof(unsigned int), 1, fi)) {
+ fclose(fi);
+ return -1;
+ }
l = SWAP32(l);
sec2msf(l, ti[i].length);
@@ -735,8 +742,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;
-
+ u32 modeTest = 0;
+
if (cdHandle != NULL) {
return 0; // it's already open
}
@@ -750,7 +757,7 @@ static long CALLBACK ISOopen(void) {
cddaBigEndian = FALSE;
subChanMixed = FALSE;
- subChanRaw = FALSE;
+ subChanRaw = FALSE;
isMode1ISO = FALSE;
if (parseccd(GetIsoFile()) == 0) {
@@ -764,21 +771,21 @@ 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(SWAP32(modeTest)!=0xffffff00) isMode1ISO = TRUE;
- }
- fseek(cdHandle, 0, SEEK_SET);
- }
+ } else {
+ //guess whether it is mode1/2048
+ fseek(cdHandle, 0, SEEK_END);
+ if(ftell(cdHandle) % 2048 == 0) {
+ if(fseek(cdHandle, 0, SEEK_SET) >= 0 &&
+ fread(&modeTest, 4, 1, cdHandle) == 1 &&
+ SWAP32(modeTest)!=0xffffff00) isMode1ISO = TRUE;
+ }
+ fseek(cdHandle, 0, SEEK_SET);
+ }
if (!subChanMixed && opensubfile(GetIsoFile()) == 0) {
SysPrintf("[+sub]");
}
-
+
SysPrintf(".\n");
PrintTracks();
@@ -880,29 +887,33 @@ static long CALLBACK ISOreadTrack(unsigned char *time) {
}
if (subChanMixed) {
- fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE), SEEK_SET);
- fread(cdbuffer, 1, CD_FRAMESIZE_RAW, cdHandle);
- fread(subbuffer, 1, SUB_FRAMESIZE, cdHandle);
+ if(fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE), SEEK_SET) < 0 ||
+ fread(cdbuffer, CD_FRAMESIZE_RAW, 1, cdHandle) != 1 ||
+ fread(subbuffer, SUB_FRAMESIZE, 1, cdHandle) != 1)
+ return -1;
if (subChanRaw) DecodeRawSubData();
}
- 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 {
+ if(isMode1ISO) {
+ if(fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * MODE1_DATA_SIZE, SEEK_SET) < 0 ||
+ fread(cdbuffer + 12, MODE1_DATA_SIZE, 1, cdHandle) != 1)
+ return -1;
+ 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, SEEK_SET);
- fread(cdbuffer, 1, CD_FRAMESIZE_RAW, cdHandle);
+ if(fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * CD_FRAMESIZE_RAW, SEEK_SET) < 0 ||
+ fread(cdbuffer, CD_FRAMESIZE_RAW, 1, cdHandle) != 1)
+ return -1;
}
if (subHandle != NULL) {
- fseek(subHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * SUB_FRAMESIZE, SEEK_SET);
- fread(subbuffer, 1, SUB_FRAMESIZE, subHandle);
+ if(fseek(subHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * SUB_FRAMESIZE, SEEK_SET) < 0 ||
+ fread(subbuffer, SUB_FRAMESIZE, 1, subHandle) != 1)
+ return -1;
if (subChanRaw) DecodeRawSubData();
}
@@ -963,37 +974,37 @@ static long CALLBACK ISOgetStatus(struct CdrStat *stat) {
stat->Type = ti[1].type;
return 0;
-}
-
-// read CDDA sector into buffer
-long CALLBACK ISOreadCDDA(unsigned char m, unsigned char s, unsigned char f, unsigned char *buffer) {
- unsigned char msf[3] = {m, s, f};
- unsigned char *p;
-
- msf[0] = itob(msf[0]);
- msf[1] = itob(msf[1]);
- msf[2] = itob(msf[2]);
-
- if (ISOreadTrack(msf) != 0) return -1;
-
- p = ISOgetBuffer();
- if (p == NULL) return -1;
-
- memcpy(buffer, p - 12, CD_FRAMESIZE_RAW); // copy from the beginning of the sector
-
- if (cddaBigEndian) {
- int i;
- unsigned char tmp;
-
+}
+
+// read CDDA sector into buffer
+static long CALLBACK ISOreadCDDA(unsigned char m, unsigned char s, unsigned char f, unsigned char *buffer) {
+ unsigned char msf[3] = {m, s, f};
+ unsigned char *p;
+
+ msf[0] = itob(msf[0]);
+ msf[1] = itob(msf[1]);
+ msf[2] = itob(msf[2]);
+
+ if (ISOreadTrack(msf) != 0) return -1;
+
+ p = ISOgetBuffer();
+ if (p == NULL) return -1;
+
+ memcpy(buffer, p - 12, CD_FRAMESIZE_RAW); // copy from the beginning of the sector
+
+ if (cddaBigEndian) {
+ int i;
+ unsigned char tmp;
+
for (i = 0; i < CD_FRAMESIZE_RAW / 2; i++) {
tmp = buffer[i * 2];
buffer[i * 2] = buffer[i * 2 + 1];
buffer[i * 2 + 1] = tmp;
}
- }
-
- return 0;
-}
+ }
+
+ return 0;
+}
void cdrIsoInit(void) {
CDR_init = ISOinit;
@@ -1008,7 +1019,7 @@ void cdrIsoInit(void) {
CDR_stop = ISOstop;
CDR_getBufferSub = ISOgetBufferSub;
CDR_getStatus = ISOgetStatus;
- CDR_readCDDA = ISOreadCDDA;
+ CDR_readCDDA = ISOreadCDDA;
CDR_getDriveLetter = CDR__getDriveLetter;
CDR_configure = CDR__configure;