static void *playthread(void *param) #endif { long osleep, d, t, i, s; unsigned char tmp; int ret = 0, sector_offs; t = GetTickCount(); while (playing) { s = 0; for (i = 0; i < sizeof(sndbuffer) / CD_FRAMESIZE_RAW; i++) { sector_offs = cdda_cur_sector - cdda_first_sector; if (sector_offs < 0) { d = CD_FRAMESIZE_RAW; memset(sndbuffer + s, 0, d); } else { d = cdimg_read_func(cddaHandle, cdda_file_offset, sndbuffer + s, sector_offs); if (d < CD_FRAMESIZE_RAW) break; } s += d; cdda_cur_sector++; } if (s == 0) { playing = FALSE; initial_offset = 0; break; } if (!cdr.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; } } // can't do it yet due to readahead.. //cdrAttenuate((short *)sndbuffer, s / 4, 1); do { ret = SPU_playCDDAchannel((short *)sndbuffer, s); if (ret == 0x7761) usleep(6 * 1000); } while (ret == 0x7761 && playing); // rearmed_wait } if (ret != 0x676f) { // !rearmed_go // do approx sleep long now; // HACK: stop feeding data while emu is paused extern int stop; while (stop && playing) usleep(10000); now = GetTickCount(); osleep = t - now; if (osleep <= 0) { osleep = 1; t = now; } else if (osleep > CDDA_FRAMETIME) { osleep = CDDA_FRAMETIME; t = now; } usleep(osleep * 1000); t += CDDA_FRAMETIME; } } #ifdef _WIN32 _endthread(); #else pthread_exit(0); return NULL; #endif }
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 }