spu: somewhat better reverb off handling
authornotaz <notasas@gmail.com>
Sun, 7 Dec 2025 23:46:42 +0000 (01:46 +0200)
committernotaz <notasas@gmail.com>
Sun, 7 Dec 2025 23:46:42 +0000 (01:46 +0200)
plugins/dfsound/reverb.c

index c736c1c..ce09b74 100644 (file)
@@ -187,15 +187,51 @@ static void MixREVERB_off(int *SSumLR, int ns_to, int curr_addr)
  const REVERBInfo *rvb = spu.rvb;\r
  unsigned short *spuMem = spu.spuMem;\r
  int space = 0x40000 - rvb->StartAddr;\r
+ int vAPF1 = rvb->vAPF1 >> 1, vAPF2 = rvb->vAPF2 >> 1;\r
  int Lout, Rout, ns;\r
 \r
- for (ns = 0; ns < ns_to * 2; )\r
+ if (vAPF1 || vAPF2)\r
+ {\r
+  for (ns = 0; ns < ns_to * 2; )\r
+  {\r
+   int lapf1 = g_buffer(rvb->mLAPF1_dAPF1);\r
+   int rapf1 = g_buffer(rvb->mRAPF1_dAPF1);\r
+   int lapf2 = g_buffer(rvb->mLAPF2_dAPF2);\r
+   int rapf2 = g_buffer(rvb->mRAPF2_dAPF2);\r
+   preload(SSumLR + ns + 64*2/4 - 4);\r
+\r
+   Lout = Rout = 0; // but should be COMB?\r
+\r
+   Lout -= vAPF1 * lapf1; Lout >>= (15-1);\r
+   Rout -= vAPF1 * rapf1; Rout >>= (15-1);\r
+   Lout = Lout * vAPF1 + (lapf1 << (15-1));\r
+   Rout = Rout * vAPF1 + (rapf1 << (15-1));\r
+\r
+   Lout -= vAPF2 * lapf2; Lout >>= (15-1);\r
+   Rout -= vAPF2 * rapf2; Rout >>= (15-1);\r
+   Lout = Lout * vAPF2 + (lapf2 << (15-1));\r
+   Rout = Rout * vAPF2 + (rapf2 << (15-1));\r
+\r
+   Lout = (Lout >> (15-1)) * rvb->VolLeft  >> 15;\r
+   Rout = (Rout >> (15-1)) * rvb->VolRight >> 15;\r
+\r
+   SSumLR[ns++] += Lout;\r
+   SSumLR[ns++] += Rout;\r
+   SSumLR[ns++] += Lout;\r
+   SSumLR[ns++] += Rout;\r
+\r
+   curr_addr++;\r
+   if (curr_addr >= 0x40000) curr_addr = rvb->StartAddr;\r
+  }\r
+ }\r
+ else\r
+ {\r
+  for (ns = 0; ns < ns_to * 2; )\r
   {\r
    preload(SSumLR + ns + 64*2/4 - 4);\r
 \r
-   // todo: is this missing COMB and APF1?\r
    Lout = g_buffer(rvb->mLAPF2_dAPF2);\r
-   Rout = g_buffer(rvb->mLAPF2_dAPF2);\r
+   Rout = g_buffer(rvb->mRAPF2_dAPF2);\r
 \r
    Lout = (Lout * rvb->VolLeft)  >> 15;\r
    Rout = (Rout * rvb->VolRight) >> 15;\r
@@ -208,6 +244,7 @@ static void MixREVERB_off(int *SSumLR, int ns_to, int curr_addr)
    curr_addr++;\r
    if (curr_addr >= 0x40000) curr_addr = rvb->StartAddr;\r
   }\r
+ }\r
 }\r
 \r
 static void REVERBPrep(void)\r