diff options
| author | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2009-09-12 15:54:29 +0000 |
|---|---|---|
| committer | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2009-09-12 15:54:29 +0000 |
| commit | 8bd31696085e145c45c84f34ec0e978c3d7c1bc5 (patch) | |
| tree | 7ef2e9989163ec41f181c91036c4c272b8be97e6 /libpcsxcore | |
| parent | 1777549e90132ef18bce339efd6a000441eb6060 (diff) | |
| download | pcsxr-8bd31696085e145c45c84f34ec0e978c3d7c1bc5.tar.gz | |
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@29520 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore')
| -rw-r--r-- | libpcsxcore/cdriso.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/libpcsxcore/cdriso.c b/libpcsxcore/cdriso.c index ab20fce9..486fc2df 100644 --- a/libpcsxcore/cdriso.c +++ b/libpcsxcore/cdriso.c @@ -35,6 +35,7 @@ #define CD_FRAMESIZE_RAW 2352 #define DATA_SIZE (CD_FRAMESIZE_RAW - 12) +#define CDDA_DATA_SIZE (CD_FRAMESIZE_RAW - 12 - 4) #define SUB_FRAMESIZE 96 @@ -45,9 +46,9 @@ FILE *subHandle = NULL; static unsigned char cdbuffer[DATA_SIZE]; static unsigned char subbuffer[SUB_FRAMESIZE]; -static unsigned char sndbuffer[CD_FRAMESIZE_RAW * 10]; +static unsigned char sndbuffer[CDDA_DATA_SIZE * 10]; -#define CDDA_FRAMETIME (1000 * (sizeof(sndbuffer) / CD_FRAMESIZE_RAW) / 75) +#define CDDA_FRAMETIME (1000 * (sizeof(sndbuffer) / CDDA_DATA_SIZE) / 75) #ifdef _WIN32 static HANDLE threadid; @@ -142,7 +143,7 @@ static void playthread(void *param) static void *playthread(void *param) #endif { - long d, t; + long d, t, i, s; t = GetTickCount(); @@ -162,7 +163,22 @@ static void *playthread(void *param) t = GetTickCount() + CDDA_FRAMETIME; - if ((d = fread(sndbuffer, 1, sizeof(sndbuffer), cddaHandle)) == 0) { + s = 0; + + for (i = 0; i < sizeof(sndbuffer) / CDDA_DATA_SIZE; i++) { + // disregard the synchronization information and header data + fseek(cddaHandle, CD_FRAMESIZE_RAW - CDDA_DATA_SIZE, SEEK_CUR); + + // read one sector + d = fread(sndbuffer + CDDA_DATA_SIZE * i, 1, CDDA_DATA_SIZE, cddaHandle); + if (d < CDDA_DATA_SIZE) { + break; + } + + s += d; + } + + if (s == 0) { playing = 0; fclose(cddaHandle); cddaHandle = NULL; @@ -171,7 +187,7 @@ static void *playthread(void *param) } if (!cdr.Muted && playing) { - SPU_playCDDAchannel((short *)sndbuffer, d); + SPU_playCDDAchannel((short *)sndbuffer, s); } } |
