if (!cdr.Irq && !cdr.Stat && (cdr.Mode & (MODE_AUTOPAUSE|MODE_REPORT)))
cdrPlayInterrupt_Autopause();
- if (CDR_readCDDA && !cdr.Muted && !Config.Cdda) {
+ if (!cdr.Muted && !Config.Cdda) {
cdrAttenuate(read_buf, CD_FRAMESIZE_RAW / 4, 1);
- if (SPU_playCDDAchannel)
- SPU_playCDDAchannel(read_buf, CD_FRAMESIZE_RAW);
+ SPU_playCDDAchannel(read_buf, CD_FRAMESIZE_RAW, psxRegs.cycle, cdr.FirstSector);
+ cdr.FirstSector = 0;
}
cdr.SetSectorPlay[2]++;
Find_CurTrack(cdr.SetSectorPlay);
ReadTrack(cdr.SetSectorPlay);
cdr.TrackChanged = FALSE;
+ cdr.FirstSector = 1;
if (!Config.Cdda)
CDR_play(cdr.SetSectorPlay);
// - fixes new game
ReadTrack(cdr.SetSectorPlay);
-
- // Crusaders of Might and Magic - update getlocl now
- // - fixes cutscene speech
- {
- u8 *buf = CDR_getBuffer();
- if (buf != NULL)
- memcpy(cdr.Transfer, buf, 8);
- }
-
- /*
- Duke Nukem: Land of the Babes - seek then delay read for one frame
- - fixes cutscenes
- C-12 - Final Resistance - doesn't like seek
- */
-
- /*
- By nicolasnoble from PCSX Redux :
- "It LOOKS like this logic is wrong, therefore disabling it with `&& false` for now.
- For "PoPoLoCrois Monogatari II", the game logic will soft lock and will never issue GetLocP to detect
- the end of its XA streams, as it seems to assume ReadS will not return a status byte with the SEEK
- flag set. I think the reasonning is that since it's invalid to call GetLocP while seeking, the game
- tries to protect itself against errors by preventing from issuing a GetLocP while it knows the
- last status was "seek". But this makes the logic just softlock as it'll never get a notification
- about the fact the drive is done seeking and the read actually started.
-
- In other words, this state machine here is probably wrong in assuming the response to ReadS/ReadN is
- done right away. It's rather when it's done seeking, and the read has actually started. This probably
- requires a bit more work to make sure seek delays are processed properly.
- Checked with a few games, this seems to work fine."
-
- Gameblabla additional notes :
- This still needs the "+ seekTime" that PCSX Redux doesn't have for the Driver "retry" mission error.
- */
CDRPLAYSEEKREAD_INT(((cdr.Mode & 0x80) ? (cdReadTime) : cdReadTime * 2) + seekTime);
SetPlaySeekRead(cdr.StatP, STATUS_SEEK);
int ret = xa_decode_sector(&cdr.Xa, cdr.Transfer+4, cdr.FirstSector);
if (!ret) {
cdrAttenuate(cdr.Xa.pcm, cdr.Xa.nsamples, cdr.Xa.stereo);
- SPU_playADPCMchannel(&cdr.Xa);
+ SPU_playADPCMchannel(&cdr.Xa, psxRegs.cycle, cdr.FirstSector);
cdr.FirstSector = 0;
}
else cdr.FirstSector = -1;