void playCDDA(void) { #ifdef DEBUG_ANALYSIS dbg_anacnt_CDR_playCDDA++; #endif long d, i, s; unsigned char tmp; if (playing) { if (subChanMixed) { s = 0; for (i = 0; i < sizeof(sndbuffer) / CD_FRAMESIZE_RAW; i++) { // read one sector d = fread(sndbuffer + CD_FRAMESIZE_RAW * i, 1, CD_FRAMESIZE_RAW, cddaHandle); if (d < CD_FRAMESIZE_RAW) { break; } s += d; // skip the subchannel data fseek(cddaHandle, SUB_FRAMESIZE, SEEK_CUR); } } else { s = fread(sndbuffer, 1, sizeof(sndbuffer), cddaHandle); } if (s == 0) { playing = 0; fclose(cddaHandle); cddaHandle = NULL; initial_offset = 0; return; } 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; } } SPU_playCDDAchannel((unsigned char *)sndbuffer, s); } cdda_file_offset += s; } }
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; int sec; t = GetTickCount(); iso_play_cdbuf = 0; iso_play_bufptr = 0; 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 t = GetTickCount() + CDDA_FRAMETIME; if (subChanMixed) { s = 0; for (i = 0; i < sizeof(sndbuffer) / CD_FRAMESIZE_RAW; i++) { // read one sector d = fread(sndbuffer + CD_FRAMESIZE_RAW * i, 1, CD_FRAMESIZE_RAW, cddaHandle); if (d < CD_FRAMESIZE_RAW) { break; } s += d; fread( subbuffer, 1, SUB_FRAMESIZE, cddaHandle ); } } else { s = fread(sndbuffer, 1, sizeof(sndbuffer), cddaHandle); sec = cddaCurOffset / CD_FRAMESIZE_RAW; if (subHandle != NULL) { fseek(subHandle, sec * SUB_FRAMESIZE, SEEK_SET); fread(subbuffer, 1, SUB_FRAMESIZE, subHandle); } } if (s == 0) { playing = FALSE; fclose(cddaHandle); cddaHandle = NULL; 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; } } // wipe data track if( subHandle || subChanMixed ) { if( ti[ ((struct SubQ *) subbuffer)->TrackNumber ].type == DATA ) memset( sndbuffer, 0, s ); } SPU_playCDDAchannel((short *)sndbuffer, s); } cddaCurOffset += s; // BIOS CD Player: Fast forward / reverse seek if( cdr.FastForward ) { // ~+0.25 sec cddaCurOffset += CD_FRAMESIZE_RAW * 75 * 3; #if 0 // Bad idea: too much static if( subChanInterleaved ) fseek( cddaHandle, s * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE), SEEK_SET ); else fseek( cddaHandle, s * CD_FRAMESIZE_RAW, SEEK_SET ); #endif } else if( cdr.FastBackward ) { // ~-0.25 sec cddaCurOffset -= CD_FRAMESIZE_RAW * 75 * 3; if( cddaCurOffset & 0x80000000 ) { cddaCurOffset = 0; cdr.FastBackward = 0; playing = 0; fclose(cddaHandle); cddaHandle = NULL; initial_offset = 0; break; } #if 0 // Bad idea: too much static if( subChanInterleaved ) fseek( cddaHandle, s * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE), SEEK_SET ); else fseek( cddaHandle, s * CD_FRAMESIZE_RAW, SEEK_SET ); #endif } // Vib Ribbon: decoded buffer IRQ iso_play_cdbuf = (u16 *)sndbuffer; iso_play_bufptr = 0; } #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 }
static void *playthread(void *param) #endif { #ifdef DEBUG_ANALYSIS dbg_anacnt_CDR_playthread++; #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 t = GetTickCount() + CDDA_FRAMETIME; if (subChanMixed) { s = 0; for (i = 0; i < sizeof(sndbuffer) / CD_FRAMESIZE_RAW; i++) { // read one sector d = fread(sndbuffer + CD_FRAMESIZE_RAW * i, 1, CD_FRAMESIZE_RAW, cddaHandle); if (d < CD_FRAMESIZE_RAW) { break; } s += d; // skip the subchannel data fseek(cddaHandle, SUB_FRAMESIZE, SEEK_CUR); } } else { s = fread(sndbuffer, 1, sizeof(sndbuffer), cddaHandle); } if (s == 0) { playing = 0; fclose(cddaHandle); cddaHandle = NULL; 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; } } SPU_playCDDAchannel((unsigned char *)sndbuffer, s); } cdda_file_offset += s; } #ifdef _WIN32 _endthread(); #else pthread_exit(0); return NULL; #endif }