cdrom: implemented CDDA autopause

This commit is contained in:
Jakub Czekański 2021-10-19 01:50:54 +02:00
parent 21e3758380
commit 4307af04d3
3 changed files with 20 additions and 9 deletions

View file

@ -36,17 +36,15 @@ void CDROM::handleSector() {
return;
}
int track = disc->getTrackByPosition(disc::Position::fromLba(readSector - 1));
if (mode.cddaReport) {
// Report--> INT1(stat, track, index, mm / amm, ss + 80h / ass, sect / asect, peaklo, peakhi)
auto pos = disc::Position::fromLba(readSector - 1);
int track = disc->getTrackByPosition(pos);
auto posInTrack = pos - disc->getTrackStart(track);
uint8_t sector = pos.ff;
auto cddaReport = [&](bool isTrack) {
postInterrupt(1);
postInterrupt(1, 1000);
writeResponse(stat._reg); // stat
writeResponse(bcd::toBcd(track + 1)); // track
writeResponse(0x01); // index
@ -74,7 +72,7 @@ void CDROM::handleSector() {
}
}
if (!mute) {
if (!mute && mode.cddaEnable) {
// Decode Red Book Audio (16bit Stereo 44100Hz)
for (size_t i = 0; i < rawSector.size(); i += 4) {
int16_t left = rawSector[i + 0] | (rawSector[i + 1] << 8);
@ -83,6 +81,16 @@ void CDROM::handleSector() {
audio.push_back(mixSample(std::make_pair(left, right)));
}
}
if (mode.cddaAutoPause) {
if (track > previousTrack) {
postInterrupt(4);
writeResponse(stat._reg);
stat.play = false; // Pause
}
}
previousTrack = track;
} else if (trackType == disc::TrackType::DATA && stat.read) {
ackMoreData();
@ -249,7 +257,6 @@ bool CDROM::isBufferEmpty() {
uint8_t CDROM::readByte() {
if (dataBuffer.empty()) {
fmt::print("[CDROM] Buffer empty\n");
return 0;
}

View file

@ -196,6 +196,7 @@ class CDROM {
std::unique_ptr<disc::Disc> disc;
disc::SubchannelQ lastQ;
bool mute = false;
int previousTrack; // for CDDA autopause
CDROM(System* sys);
void step(int cycles);

View file

@ -26,7 +26,7 @@ void CDROM::cmdSetloc() {
return;
}
postInterrupt(3, 2000);
postInterrupt(3, 10000);
writeResponse(stat._reg);
}
@ -52,6 +52,8 @@ void CDROM::cmdPlay() {
postInterrupt(3);
writeResponse(stat._reg);
previousTrack = disc->getTrackByPosition(pos);
if (verbose) fmt::print("CDROM: cmdPlay (pos: {})\n", pos.toString());
}
@ -68,7 +70,7 @@ void CDROM::cmdReadN() {
readSector = seekSector;
stat.setMode(StatusCode::Mode::Reading);
postInterrupt(3, 5000);
postInterrupt(3);
writeResponse(stat._reg);
}
@ -195,6 +197,7 @@ void CDROM::cmdSeekP() {
stat.setMode(StatusCode::Mode::None);
previousTrack = disc->getTrackByPosition(disc::Position::fromLba(readSector));
if (verbose) fmt::print("CDROM: cmdSeekP\n");
}