ref: 78f0d10e95318ba573e96ae4d35b111e06450466
parent: 10cfc02dedf38b391f5a79f3201d4ea9f7b6cde2
author: allkern <lisandroaalarcon@gmail.com>
date: Sun Sep 17 09:18:15 EDT 2023
Improve CDDA playback
--- a/frontend/main.c
+++ b/frontend/main.c
@@ -49,8 +49,6 @@
dev = SDL_OpenAudioDevice(NULL, 0, &desired, &obtained, 0);
- log_fatal("obtained.samples=%u", obtained.samples);-
if (dev) SDL_PauseAudioDevice(dev, 0);
psx_gpu_t* gpu = psx_get_gpu(psx);
--- a/psx/dev/cdrom.c
+++ b/psx/dev/cdrom.c
@@ -110,6 +110,8 @@
cdrom->seek_ss = s;
cdrom->seek_mm = m;
+ cdrom->seek_pending = 1;
+
log_fatal("setloc: %02x:%02x:%02x",cdrom->seek_mm,
cdrom->seek_ss,
@@ -158,6 +160,9 @@
switch (cdrom->state) { case CD_STATE_RECV_CMD: {+ // Ignore parameters
+ cdrom->pfifo_index = 0;
+
// if (cdrom->pfifo_index) { // log_fatal("CdlGetStat: Expected exactly 0 parameters");@@ -174,26 +179,30 @@
cdrom->state = CD_STATE_SEND_RESP1;
cdrom->delayed_command = CDL_PLAY;
- cdrom->cdda_msf.m = cdrom->seek_mm;
- cdrom->cdda_msf.s = cdrom->seek_ss;
- cdrom->cdda_msf.f = cdrom->seek_ff;
+ if (cdrom->seek_pending) {+ cdrom->seek_pending = 0;
- // Convert seek to I
- msf_t msf = cdrom->cdda_msf;
-
- msf_from_bcd(&msf);
+ cdrom->cdda_msf.m = cdrom->seek_mm;
+ cdrom->cdda_msf.s = cdrom->seek_ss;
+ cdrom->cdda_msf.f = cdrom->seek_ff;
- // Seek to that address and read sector
- psx_disc_seek(cdrom->disc, msf);
- psx_disc_read_sector(cdrom->disc, cdrom->cdda_buf);
-
- // Increment sector
- msf_add_f(&msf, 1);
- msf_to_bcd(&msf);
+ // Convert seek to I
+ msf_t msf = cdrom->cdda_msf;
+
+ msf_from_bcd(&msf);
- cdrom->cdda_msf = msf;
-
- cdrom->cdda_sector_offset = 0;
+ // Seek to that address and read sector
+ psx_disc_seek(cdrom->disc, msf);
+ psx_disc_read_sector(cdrom->disc, cdrom->cdda_buf);
+
+ // Increment sector
+ msf_add_f(&msf, 1);
+ msf_to_bcd(&msf);
+
+ cdrom->cdda_msf = msf;
+ cdrom->cdda_sector_offset = 0;
+ }
+
cdrom->cdda_playing = 1;
} break;
@@ -346,6 +355,7 @@
switch (cdrom->state) { case CD_STATE_RECV_CMD: {cdrom->read_ongoing = 0;
+ cdrom->cdda_playing = 0;
cdrom->irq_delay = DELAY_1MS;
cdrom->state = CD_STATE_SEND_RESP1;
@@ -624,6 +634,18 @@
cdrom->irq_delay = DELAY_1MS;
cdrom->state = CD_STATE_SEND_RESP2;
cdrom->delayed_command = CDL_SEEKL;
+
+ msf_t msf;
+
+ msf.m = cdrom->seek_mm;
+ msf.s = cdrom->seek_ss;
+ msf.f = cdrom->seek_ff;
+
+ msf_from_bcd(&msf);
+
+ psx_disc_seek(cdrom->disc, msf);
+
+ cdrom->seek_pending = 0;
} break;
case CD_STATE_SEND_RESP2: {@@ -797,6 +819,8 @@
msf.f = cdrom->seek_ff;
msf_from_bcd(&msf);
+
+ cdrom->seek_pending = 0;
int err = psx_disc_seek(cdrom->disc, msf);
--- a/psx/dev/cdrom.h
+++ b/psx/dev/cdrom.h
@@ -169,6 +169,7 @@
// Setloc
uint8_t seek_ss, seek_mm, seek_ff;
uint32_t seek_offset;
+ int seek_pending;
// Setmode
uint8_t mode;
--
⑨