spu: rework synchronization
[pcsx_rearmed.git] / plugins / dfsound / reverb.c
index 2d65a69..0a94ff4 100644 (file)
@@ -53,21 +53,9 @@ INLINE void StartREVERB(int ch)
 // HELPER FOR NEILL'S REVERB: re-inits our reverb mixing buf\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-INLINE void InitREVERB(void)\r
+INLINE void InitREVERB(int ns_to)\r
 {\r
- memset(sRVBStart,0,NSSIZE*2*4);\r
-}\r
-\r
-////////////////////////////////////////////////////////////////////////\r
-// STORE REVERB\r
-////////////////////////////////////////////////////////////////////////\r
-\r
-INLINE void StoreREVERB(int ch,int ns,int l,int r)\r
-{\r
- ns<<=1;\r
-\r
- sRVBStart[ns]  +=l;                                   // -> we mix all active reverb channels into an extra buffer\r
- sRVBStart[ns+1]+=r;\r
+ memset(sRVBStart,0,ns_to*sizeof(sRVBStart[0])*2);\r
 }\r
 \r
 ////////////////////////////////////////////////////////////////////////\r
@@ -95,15 +83,15 @@ INLINE int rvb2ram_offs(int curr, int space, int iOff)
 ////////////////////////////////////////////////////////////////////////\r
 \r
 // portions based on spu2-x from PCSX2\r
-static void MixREVERB(void)\r
+static void MixREVERB(int ns_to)\r
 {\r
  int l_old = rvb.iRVBLeft;\r
  int r_old = rvb.iRVBRight;\r
  int curr_addr = rvb.CurrAddr;\r
  int space = 0x40000 - rvb.StartAddr;\r
- int l, r, ns;\r
+ int l = 0, r = 0, ns;\r
 \r
- for (ns = 0; ns < NSSIZE*2; )\r
+ for (ns = 0; ns < ns_to * 2; )\r
   {\r
    int IIR_ALPHA = rvb.IIR_ALPHA;\r
    int ACC0, ACC1, FB_A0, FB_A1, FB_B0, FB_B1;\r
@@ -157,11 +145,44 @@ static void MixREVERB(void)
    s_buffer(MIX_DEST_B0, mix_dest_b0);\r
    s_buffer(MIX_DEST_B1, mix_dest_b1);\r
 \r
-   l = (mix_dest_a0 + mix_dest_b0) / 3;\r
-   r = (mix_dest_a1 + mix_dest_b1) / 3;\r
+   l = (mix_dest_a0 + mix_dest_b0) / 2;\r
+   r = (mix_dest_a1 + mix_dest_b1) / 2;\r
 \r
-   l = (l * rvb.VolLeft)  >> 14;\r
-   r = (r * rvb.VolRight) >> 14;\r
+   l = (l * rvb.VolLeft)  >> 15; // 15?\r
+   r = (r * rvb.VolRight) >> 15;\r
+\r
+   SSumLR[ns++] += (l + l_old) / 2;\r
+   SSumLR[ns++] += (r + r_old) / 2;\r
+   SSumLR[ns++] += l;\r
+   SSumLR[ns++] += r;\r
+\r
+   l_old = l;\r
+   r_old = r;\r
+\r
+   curr_addr++;\r
+   if (curr_addr >= 0x40000) curr_addr = rvb.StartAddr;\r
+  }\r
+\r
+ rvb.iRVBLeft = l;\r
+ rvb.iRVBRight = r;\r
+ rvb.CurrAddr = curr_addr;\r
+}\r
+\r
+static void MixREVERB_off(int ns_to)\r
+{\r
+ int l_old = rvb.iRVBLeft;\r
+ int r_old = rvb.iRVBRight;\r
+ int curr_addr = rvb.CurrAddr;\r
+ int space = 0x40000 - rvb.StartAddr;\r
+ int l = 0, r = 0, ns;\r
+\r
+ for (ns = 0; ns < ns_to * 2; )\r
+  {\r
+   l = (g_buffer(MIX_DEST_A0) + g_buffer(MIX_DEST_B0)) / 2;\r
+   r = (g_buffer(MIX_DEST_A1) + g_buffer(MIX_DEST_B1)) / 2;\r
+\r
+   l = (l * rvb.VolLeft)  >> 15;\r
+   r = (r * rvb.VolRight) >> 15;\r
 \r
    SSumLR[ns++] += (l + l_old) / 2;\r
    SSumLR[ns++] += (r + r_old) / 2;\r
@@ -225,7 +246,7 @@ static void prepare_offsets(void)
  rvb.dirty = 0;\r
 }\r
 \r
-INLINE void REVERBDo(void)\r
+INLINE void REVERBDo(int ns_to)\r
 {\r
  if (!rvb.StartAddr)                                   // reverb is off\r
  {\r
@@ -235,15 +256,22 @@ INLINE void REVERBDo(void)
 \r
  if (spuCtrl & 0x80)                                   // -> reverb on? oki\r
  {\r
-  if (rvb.dirty)\r
+  if (unlikely(rvb.dirty))\r
+   prepare_offsets();\r
+\r
+  MixREVERB(ns_to);\r
+ }\r
+ else if (rvb.VolLeft || rvb.VolRight)\r
+ {\r
+  if (unlikely(rvb.dirty))\r
    prepare_offsets();\r
 \r
-  MixREVERB();\r
+  MixREVERB_off(ns_to);\r
  }\r
  else                                                  // -> reverb off\r
  {\r
-  // supposedly runs anyway?\r
-  rvb.CurrAddr += NSSIZE/2;\r
+  // reverb runs anyway\r
+  rvb.CurrAddr += ns_to / 2;\r
   while (rvb.CurrAddr >= 0x40000)\r
    rvb.CurrAddr -= 0x40000 - rvb.StartAddr;\r
  }\r