static int cdread_sub_mixed(FILE *f, void *dest, int sector, int offset) { int ret; fseek(f, sector * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE) + offset, SEEK_SET); ret = fread(dest, 1, CD_FRAMESIZE_RAW - offset, f); fread(subbuffer, 1, SUB_FRAMESIZE, f); if (subChanRaw) DecodeRawSubData(); return ret; }
static int cdread_sub_mixed(FILE *f, unsigned int base, void *dest, int sector) { int ret; fseek(f, base + sector * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE), SEEK_SET); ret = fread(dest, 1, CD_FRAMESIZE_RAW, f); fread(subbuffer, 1, SUB_FRAMESIZE, f); if (subChanRaw) DecodeRawSubData(); return ret; }
static void *playthread(void *param) #endif { long d, t, i, s; unsigned char tmp; t = GetTickCount(); while (playing) { d = t - (long)GetTickCount(); if (d <= 0) { d = 1; } else if (d > CDDA_FRAMETIME) { d = CDDA_FRAMETIME; } #ifdef _WIN32 Sleep(d); #else usleep(d * 1000); #endif // HACK: stop feeding data while emu is paused extern int stop; if (stop) { usleep(100000); continue; } t = GetTickCount() + CDDA_FRAMETIME; s = 0; for (i = 0; i < sizeof(sndbuffer) / CD_FRAMESIZE_RAW; i++) { d = cdimg_read_func(cddaHandle, sndbuffer + s, cdda_cur_sector, 0); if (d < CD_FRAMESIZE_RAW) break; s += d; cdda_cur_sector++; } if (subHandle != NULL) { fseek(subHandle, cdda_cur_sector * SUB_FRAMESIZE, SEEK_SET); fread(subbuffer, 1, SUB_FRAMESIZE, subHandle); if (subChanRaw) DecodeRawSubData(); } if (s == 0) { playing = FALSE; initial_offset = 0; break; } if (!psxCdr.Muted && playing) { if (cddaBigEndian) { for (i = 0; i < s / 2; i++) { tmp = sndbuffer[i * 2]; sndbuffer[i * 2] = sndbuffer[i * 2 + 1]; sndbuffer[i * 2 + 1] = tmp; } } SPU_playCDDAchannel((short *)sndbuffer, s); } } #ifdef _WIN32 _endthread(); #else pthread_exit(0); return NULL; #endif }