sound, fix pcm/pwm handling wrt fast forward (mcd, 32x, pico)
authorkub <derkub@gmail.com>
Mon, 7 Feb 2022 21:08:34 +0000 (21:08 +0000)
committerkub <derkub@gmail.com>
Mon, 7 Feb 2022 21:09:13 +0000 (21:09 +0000)
pico/cd/pcm.c
pico/pico_cmn.c
pico/sms.c
pico/sound/sound.c
platform/common/emu.c

index 9d84ee8..b38ce2d 100644 (file)
@@ -128,7 +128,7 @@ void pcd_pcm_update(s32 *buf32, int length, int stereo)
 
   pcd_pcm_sync(SekCyclesDoneS68k());
 
-  if (!Pico_mcd->pcm_mixbuf_dirty || !(PicoIn.opt & POPT_EN_MCD_PCM))
+  if (!Pico_mcd->pcm_mixbuf_dirty || !(PicoIn.opt & POPT_EN_MCD_PCM) || !buf32)
     goto out;
 
   step = (Pico_mcd->pcm_mixpos << 16) / length;
index d1ebe22..6866fda 100644 (file)
@@ -311,8 +311,7 @@ static int PicoFrameHints(void)
 #endif
 
   // get samples from sound chips
-  if (PicoIn.sndOut)
-    PsndGetSamples(y);
+  PsndGetSamples(y);
 
   timers_cycle();
 
index 2410d52..3908136 100644 (file)
@@ -755,8 +755,7 @@ void PicoFrameMS(void)
     z80_exec(Pico.t.z80c_line_start + cycles_line);
   }
 
-  if (PicoIn.sndOut)
-    PsndGetSamplesMS(lines);
+  PsndGetSamplesMS(lines);
 }
 
 void PicoFrameDrawOnlyMS(void)
index 083c642..a7c25dc 100644 (file)
@@ -130,6 +130,9 @@ PICO_INTERNAL void PsndDoDAC(int cyc_to)
   int pos, len;\r
   int dout = ym2612.dacout;\r
 \r
+  // nothing to do if sound is off\r
+  if (!PicoIn.sndOut) return;\r
+\r
   // number of samples to fill in buffer (Q20)\r
   len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.dac_pos;\r
 \r
@@ -169,6 +172,9 @@ PICO_INTERNAL void PsndDoPSG(int cyc_to)
   int pos, len;\r
   int stereo = 0;\r
 \r
+  // nothing to do if sound is off\r
+  if (!PicoIn.sndOut) return;\r
+\r
   // number of samples to fill in buffer (Q20)\r
   len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.psg_pos;\r
 \r
@@ -196,6 +202,9 @@ PICO_INTERNAL void PsndDoYM2413(int cyc_to)
   int stereo = 0;\r
   short *buf;\r
 \r
+  // nothing to do if sound is off\r
+  if (!PicoIn.sndOut) return;\r
+\r
   // number of samples to fill in buffer (Q20)\r
   len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.ym2413_pos;\r
 \r
@@ -236,6 +245,9 @@ PICO_INTERNAL void PsndDoFM(int cyc_to)
   int pos, len;\r
   int stereo = 0;\r
 \r
+  // nothing to do if sound is off\r
+  if (!PicoIn.sndOut) return;\r
+\r
   // Q20, number of samples since last call\r
   len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.fm_pos;\r
 \r
@@ -306,6 +318,11 @@ PICO_INTERNAL void PsndClear(void)
 {\r
   int len = Pico.snd.len;\r
   if (Pico.snd.len_e_add) len++;\r
+\r
+  // drop pos remainder to avoid rounding errors (not entirely correct though)\r
+  Pico.snd.dac_pos = Pico.snd.fm_pos = Pico.snd.psg_pos = Pico.snd.ym2413_pos = 0;\r
+  if (!PicoIn.sndOut) return;\r
+\r
   if (PicoIn.opt & POPT_EN_STEREO)\r
     memset32((int *) PicoIn.sndOut, 0, len); // assume PicoIn.sndOut to be aligned\r
   else {\r
@@ -316,14 +333,12 @@ PICO_INTERNAL void PsndClear(void)
   }\r
   if (!(PicoIn.opt & POPT_EN_FM))\r
     memset32(PsndBuffer, 0, PicoIn.opt & POPT_EN_STEREO ? len*2 : len);\r
-  // drop pos remainder to avoid rounding errors (not entirely correct though)\r
-  Pico.snd.dac_pos = Pico.snd.fm_pos = Pico.snd.psg_pos = Pico.snd.ym2413_pos = 0;\r
 }\r
 \r
 \r
 static int PsndRender(int offset, int length)\r
 {\r
-  int *buf32;\r
+  s32 *buf32;\r
   int stereo = (PicoIn.opt & 8) >> 3;\r
   int fmlen = ((Pico.snd.fm_pos+0x80000) >> 20);\r
   int daclen = ((Pico.snd.dac_pos+0x80000) >> 20);\r
@@ -334,12 +349,14 @@ static int PsndRender(int offset, int length)
   pprof_start(sound);\r
 \r
   if (PicoIn.AHW & PAHW_PICO) {\r
-    PicoPicoPCMUpdate(PicoIn.sndOut+(offset<<stereo), length-offset, stereo);\r
+    // XXX ugly hack, need to render sound for interrupts\r
+    s16 *buf16 = PicoIn.sndOut ? PicoIn.sndOut : (short *)PsndBuffer;\r
+    PicoPicoPCMUpdate(buf16+(offset<<stereo), length-offset, stereo);\r
     return length;\r
   }\r
 \r
   // Fill up DAC output in case of missing samples (Q rounding errors)\r
-  if (length-daclen > 0) {\r
+  if (length-daclen > 0 && PicoIn.sndOut) {\r
     short *dacbuf = PicoIn.sndOut + (daclen << stereo);\r
     Pico.snd.dac_pos += (length-daclen) << 20;\r
     *dacbuf++ += Pico.snd.dac_val2;\r
@@ -352,7 +369,7 @@ static int PsndRender(int offset, int length)
   }\r
 \r
   // Add in parts of the PSG output not yet done\r
-  if (length-psglen > 0) {\r
+  if (length-psglen > 0 && PicoIn.sndOut) {\r
     short *psgbuf = PicoIn.sndOut + (psglen << stereo);\r
     Pico.snd.psg_pos += (length-psglen) << 20;\r
     if (PicoIn.opt & POPT_EN_PSG)\r
@@ -360,7 +377,7 @@ static int PsndRender(int offset, int length)
   }\r
 \r
   // Add in parts of the FM buffer not yet done\r
-  if (length-fmlen > 0) {\r
+  if (length-fmlen > 0 && PicoIn.sndOut) {\r
     int *fmbuf = buf32 + ((fmlen-offset) << stereo);\r
     Pico.snd.fm_pos += (length-fmlen) << 20;\r
     if (PicoIn.opt & POPT_EN_FM)\r
@@ -389,7 +406,8 @@ static int PsndRender(int offset, int length)
     p32x_pwm_update(buf32, length-offset, stereo);\r
 \r
   // convert + limit to normal 16bit output\r
-  PsndMix_32_to_16l(PicoIn.sndOut+(offset<<stereo), buf32, length-offset);\r
+  if (PicoIn.sndOut)\r
+    PsndMix_32_to_16l(PicoIn.sndOut+(offset<<stereo), buf32, length-offset);\r
 \r
   pprof_end(sound);\r
 \r
@@ -402,7 +420,7 @@ PICO_INTERNAL void PsndGetSamples(int y)
 \r
   curr_pos  = PsndRender(0, Pico.snd.len_use);\r
 \r
-  if (PicoIn.writeSound)\r
+  if (PicoIn.writeSound && PicoIn.sndOut)\r
     PicoIn.writeSound(curr_pos * ((PicoIn.opt & POPT_EN_STEREO) ? 4 : 2));\r
   // clear sound buffer\r
   PsndClear();\r
@@ -414,6 +432,9 @@ static int PsndRenderMS(int offset, int length)
   int psglen = ((Pico.snd.psg_pos+0x80000) >> 20);\r
   int ym2413len = ((Pico.snd.ym2413_pos+0x80000) >> 20);\r
 \r
+  if (!PicoIn.sndOut)\r
+    return length;\r
+\r
   pprof_start(sound);\r
 \r
   // Add in parts of the PSG output not yet done\r
@@ -456,7 +477,7 @@ PICO_INTERNAL void PsndGetSamplesMS(int y)
 \r
   curr_pos  = PsndRenderMS(0, Pico.snd.len_use);\r
 \r
-  if (PicoIn.writeSound != NULL)\r
+  if (PicoIn.writeSound != NULL && PicoIn.sndOut)\r
     PicoIn.writeSound(curr_pos * ((PicoIn.opt & POPT_EN_STEREO) ? 4 : 2));\r
   PsndClear();\r
 }\r
index 2352bf5..845951e 100644 (file)
@@ -986,7 +986,7 @@ void emu_set_fastforward(int set_on)
                set_EmuOpt = currentConfig.EmuOpt;\r
                PicoIn.sndOut = NULL;\r
                currentConfig.Frameskip = 8;\r
-               currentConfig.EmuOpt &= ~4;\r
+               currentConfig.EmuOpt &= ~EOPT_EN_SOUND;\r
                currentConfig.EmuOpt |= EOPT_NO_FRMLIMIT;\r
                is_on = 1;\r
                emu_status_msg("FAST FORWARD");\r
@@ -997,9 +997,6 @@ void emu_set_fastforward(int set_on)
                currentConfig.EmuOpt = set_EmuOpt;\r
                PsndRerate(1);\r
                is_on = 0;\r
-               // mainly to unbreak pcm\r
-               if (PicoIn.AHW & PAHW_MCD)\r
-                       pcd_state_loaded();\r
        }\r
 }\r
 \r