mirror of
https://github.com/JaCzekanski/Avocado.git
synced 2024-05-20 12:57:38 -04:00
cdrom: implemented CDDA autopause
This commit is contained in:
parent
21e3758380
commit
4307af04d3
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue