sound, remove hysteresis (lessens distortion, increases frequency limit)
authorkub <derkub@gmail.com>
Fri, 22 Oct 2021 23:09:04 +0000 (01:09 +0200)
committerkub <derkub@gmail.com>
Sat, 23 Oct 2021 10:10:00 +0000 (12:10 +0200)
pico/sms.c
pico/sound/sound.c

index 2aa8838..4e20a9b 100644 (file)
@@ -225,7 +225,7 @@ static void z80_sms_out(unsigned short a, unsigned char d)
 
       case 0x40:
       case 0x41:
-        PsndDoPSG(z80_cyclesDone());
+        PsndDoPSG(Pico.m.scanline*228 + 228-z80_cyclesLeft);
         SN76496Write(d);
         break;
 
index 602f290..56bbadc 100644 (file)
@@ -130,10 +130,6 @@ PICO_INTERNAL void PsndDoDAC(int cyc_to)
   // number of samples to fill in buffer (Q20)\r
   len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.dac_pos;\r
 \r
-  // don't do this too often (about once every 2 scanlines)\r
-  if (len <= PicoIn.sndRate << 3) // Q16, (PicoIn.sndRate << 16) >> 13\r
-    return;\r
-\r
   // update position and calculate buffer offset and length\r
   pos = (Pico.snd.dac_pos+0x80000) >> 20;\r
   Pico.snd.dac_pos += len;\r
@@ -173,10 +169,6 @@ PICO_INTERNAL void PsndDoPSG(int cyc_to)
   // number of samples to fill in buffer (Q20)\r
   len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.psg_pos;\r
 \r
-  // don't do this too often (about once every 2 scanlines)\r
-  if (len <= PicoIn.sndRate << 3) // Q16, (PicoIn.sndRate << 16) >> 13\r
-    return;\r
-\r
   // update position and calculate buffer offset and length\r
   pos = (Pico.snd.psg_pos+0x80000) >> 20;\r
   Pico.snd.psg_pos += len;\r
@@ -204,10 +196,6 @@ PICO_INTERNAL void PsndDoYM2413(int cyc_to)
   // number of samples to fill in buffer (Q20)\r
   len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.ym2413_pos;\r
 \r
-  // don't do this too often (about once every 2 scanlines)\r
-  if (len <= PicoIn.sndRate << 3) // Q16, (PicoIn.sndRate << 16) >> 13\r
-    return;\r
-\r
   // update position and calculate buffer offset and length\r
   pos = (Pico.snd.ym2413_pos+0x80000) >> 20;\r
   Pico.snd.ym2413_pos += len;\r
@@ -245,13 +233,9 @@ PICO_INTERNAL void PsndDoFM(int cyc_to)
   int pos, len;\r
   int stereo = 0;\r
 \r
-  // Q16, number of samples since last call\r
+  // Q20, number of samples since last call\r
   len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.fm_pos;\r
 \r
-  // don't do this too often (about once every 2 scanlines)\r
-  if (len <= PicoIn.sndRate << 3) // Q16, (PicoIn.sndRate << 16) >> 13\r
-    return;\r
-\r
   // update position and calculate buffer offset and length\r
   pos = (Pico.snd.fm_pos+0x80000) >> 20;\r
   Pico.snd.fm_pos += len;\r
@@ -351,7 +335,7 @@ static int PsndRender(int offset, int length)
     return length;\r
   }\r
 \r
-  // Fill up DAC output in case of missing samples (Q16 rounding errors)\r
+  // Fill up DAC output in case of missing samples (Q rounding errors)\r
   if (length-daclen > 0) {\r
     short *dacbuf = PicoIn.sndOut + (daclen << stereo);\r
     Pico.snd.dac_pos += (length-daclen) << 20;\r