pico, fix psg sound and fast forward
authorkub <derkub@gmail.com>
Fri, 14 Oct 2022 18:47:20 +0000 (18:47 +0000)
committerkub <derkub@gmail.com>
Fri, 14 Oct 2022 18:47:20 +0000 (18:47 +0000)
pico/pico/xpcm.c
pico/sound/sound.c

index ee20446..5d13a4b 100644 (file)
@@ -77,18 +77,20 @@ PICO_INTERNAL void PicoPicoPCMUpdate(short *buffer, int length, int stereo)
     srcval = *src >> 4;
     do_sample();
 
-    for (needsamples += stepsamples; needsamples > (1<<10) && length > 0; needsamples -= (1<<10), length--) {
-      *buffer++ += sample;
-      if (stereo) { buffer[0] = buffer[-1]; buffer++; }
-    }
+    if (buffer)
+      for (needsamples += stepsamples; needsamples > (1<<10) && length > 0; needsamples -= (1<<10), length--) {
+        *buffer++ += sample;
+        if (stereo) { buffer[0] = buffer[-1]; buffer++; }
+      }
 
     srcval = *src & 0xf;
     do_sample();
 
-    for (needsamples += stepsamples; needsamples > (1<<10) && length > 0; needsamples -= (1<<10), length--) {
-      *buffer++ += sample;
-      if (stereo) { buffer[0] = buffer[-1]; buffer++; }
-    }
+    if (buffer)
+      for (needsamples += stepsamples; needsamples > (1<<10) && length > 0; needsamples -= (1<<10), length--) {
+        *buffer++ += sample;
+        if (stereo) { buffer[0] = buffer[-1]; buffer++; }
+      }
 
     // lame normalization stuff, needed due to wrong adpcm algo
     sgn += (sample < 0) ? -1 : 1;
@@ -109,7 +111,7 @@ PICO_INTERNAL void PicoPicoPCMUpdate(short *buffer, int length, int stereo)
   PicoPicohw.xpcm_ptr = PicoPicohw.xpcm_buffer;
 
 end:
-  if (stereo)
+  if (buffer && stereo)
     // still must expand SN76496 to stereo
     for (; length > 0; buffer+=2, length--)
       buffer[1] = buffer[0];
index 74a40b5..5093829 100644 (file)
@@ -430,10 +430,18 @@ static int PsndRender(int offset, int length)
 \r
   pprof_start(sound);\r
 \r
+  // Add in parts of the PSG output not yet done\r
+  if (length-psglen > 0 && PicoIn.sndOut) {\r
+    s16 *psgbuf = PicoIn.sndOut + (psglen << stereo);\r
+    Pico.snd.psg_pos += (length-psglen) << 20;\r
+    if (PicoIn.opt & POPT_EN_PSG)\r
+      SN76496Update(psgbuf, length-psglen, stereo);\r
+  }\r
+\r
   if (PicoIn.AHW & PAHW_PICO) {\r
-    // XXX ugly hack, need to render sound for interrupts\r
-    s16 *buf16 = PicoIn.sndOut ? PicoIn.sndOut : (s16 *)PsndBuffer;\r
-    PicoPicoPCMUpdate(buf16+(offset<<stereo), length-offset, stereo);\r
+    // always need to render sound for interrupts\r
+    s16 *buf16 = PicoIn.sndOut ? PicoIn.sndOut + (offset<<stereo) : NULL;\r
+    PicoPicoPCMUpdate(buf16, length-offset, stereo);\r
     return length;\r
   }\r
 \r
@@ -450,14 +458,6 @@ static int PsndRender(int offset, int length)
     Pico.snd.dac_val2 = Pico.snd.dac_val;\r
   }\r
 \r
-  // Add in parts of the PSG output not yet done\r
-  if (length-psglen > 0 && PicoIn.sndOut) {\r
-    s16 *psgbuf = PicoIn.sndOut + (psglen << stereo);\r
-    Pico.snd.psg_pos += (length-psglen) << 20;\r
-    if (PicoIn.opt & POPT_EN_PSG)\r
-      SN76496Update(psgbuf, length-psglen, stereo);\r
-  }\r
-\r
   // Add in parts of the FM buffer not yet done\r
   if (length-fmlen > 0 && PicoIn.sndOut) {\r
     s32 *fmbuf = buf32 + ((fmlen-offset) << stereo);\r