shithub: psxe

Download patch

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;
--