spu: put reverb on the thread too
[pcsx_rearmed.git] / plugins / dfsound / reverb.c
index 7e32b8e..2ff6edc 100644 (file)
@@ -50,41 +50,40 @@ INLINE int rvb2ram_offs(int curr, int space, int iOff)
 \r
 // get_buffer content helper: takes care about wraps\r
 #define g_buffer(var) \\r
- ((int)(signed short)spu.spuMem[rvb2ram_offs(curr_addr, space, rvb.n##var)])\r
+ ((int)(signed short)spu.spuMem[rvb2ram_offs(curr_addr, space, rvb->n##var)])\r
 \r
 // saturate iVal and store it as var\r
 #define s_buffer(var, iVal) \\r
  ssat32_to_16(iVal); \\r
- spu.spuMem[rvb2ram_offs(curr_addr, space, rvb.n##var)] = iVal\r
+ spu.spuMem[rvb2ram_offs(curr_addr, space, rvb->n##var)] = iVal\r
 \r
 #define s_buffer1(var, iVal) \\r
  ssat32_to_16(iVal); \\r
- spu.spuMem[rvb2ram_offs(curr_addr, space, rvb.n##var + 1)] = iVal\r
+ spu.spuMem[rvb2ram_offs(curr_addr, space, rvb->n##var + 1)] = iVal\r
 \r
 ////////////////////////////////////////////////////////////////////////\r
 \r
 // portions based on spu2-x from PCSX2\r
-static void MixREVERB(int *SSumLR, int *RVB, int ns_to)\r
+static void MixREVERB(int *SSumLR, int *RVB, int ns_to, int curr_addr)\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
const REVERBInfo *rvb = spu.rvb;\r
+ int IIR_ALPHA = rvb->IIR_ALPHA;\r
+ int IIR_COEF = rvb->IIR_COEF;\r
+ int space = 0x40000 - rvb->StartAddr;\r
+ int l, r, ns;\r
 \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
    int mix_dest_a0, mix_dest_a1, mix_dest_b0, mix_dest_b1;\r
 \r
-   int input_L = RVB[ns]   * rvb.IN_COEF_L;\r
-   int input_R = RVB[ns+1] * rvb.IN_COEF_R;\r
+   int input_L = RVB[ns]   * rvb->IN_COEF_L;\r
+   int input_R = RVB[ns+1] * rvb->IN_COEF_R;\r
 \r
-   int IIR_INPUT_A0 = ((g_buffer(IIR_SRC_A0) * rvb.IIR_COEF) + input_L) >> 15;\r
-   int IIR_INPUT_A1 = ((g_buffer(IIR_SRC_A1) * rvb.IIR_COEF) + input_R) >> 15;\r
-   int IIR_INPUT_B0 = ((g_buffer(IIR_SRC_B0) * rvb.IIR_COEF) + input_L) >> 15;\r
-   int IIR_INPUT_B1 = ((g_buffer(IIR_SRC_B1) * rvb.IIR_COEF) + input_R) >> 15;\r
+   int IIR_INPUT_A0 = ((g_buffer(IIR_SRC_A0) * IIR_COEF) + input_L) >> 15;\r
+   int IIR_INPUT_A1 = ((g_buffer(IIR_SRC_A1) * IIR_COEF) + input_R) >> 15;\r
+   int IIR_INPUT_B0 = ((g_buffer(IIR_SRC_B0) * IIR_COEF) + input_L) >> 15;\r
+   int IIR_INPUT_B1 = ((g_buffer(IIR_SRC_B1) * IIR_COEF) + input_R) >> 15;\r
 \r
    int iir_dest_a0 = g_buffer(IIR_DEST_A0);\r
    int iir_dest_a1 = g_buffer(IIR_DEST_A1);\r
@@ -96,30 +95,34 @@ static void MixREVERB(int *SSumLR, int *RVB, int ns_to)
    int IIR_B0 = iir_dest_b0 + ((IIR_INPUT_B0 - iir_dest_b0) * IIR_ALPHA >> 15);\r
    int IIR_B1 = iir_dest_b1 + ((IIR_INPUT_B1 - iir_dest_b1) * IIR_ALPHA >> 15);\r
 \r
+   preload(SSumLR + ns + 64*2/4 - 4);\r
+\r
    s_buffer1(IIR_DEST_A0, IIR_A0);\r
    s_buffer1(IIR_DEST_A1, IIR_A1);\r
    s_buffer1(IIR_DEST_B0, IIR_B0);\r
    s_buffer1(IIR_DEST_B1, IIR_B1);\r
 \r
-   ACC0 = (g_buffer(ACC_SRC_A0) * rvb.ACC_COEF_A +\r
-           g_buffer(ACC_SRC_B0) * rvb.ACC_COEF_B +\r
-           g_buffer(ACC_SRC_C0) * rvb.ACC_COEF_C +\r
-           g_buffer(ACC_SRC_D0) * rvb.ACC_COEF_D) >> 15;\r
-   ACC1 = (g_buffer(ACC_SRC_A1) * rvb.ACC_COEF_A +\r
-           g_buffer(ACC_SRC_B1) * rvb.ACC_COEF_B +\r
-           g_buffer(ACC_SRC_C1) * rvb.ACC_COEF_C +\r
-           g_buffer(ACC_SRC_D1) * rvb.ACC_COEF_D) >> 15;\r
+   preload(RVB + ns + 64*2/4 - 4);\r
+\r
+   ACC0 = (g_buffer(ACC_SRC_A0) * rvb->ACC_COEF_A +\r
+           g_buffer(ACC_SRC_B0) * rvb->ACC_COEF_B +\r
+           g_buffer(ACC_SRC_C0) * rvb->ACC_COEF_C +\r
+           g_buffer(ACC_SRC_D0) * rvb->ACC_COEF_D) >> 15;\r
+   ACC1 = (g_buffer(ACC_SRC_A1) * rvb->ACC_COEF_A +\r
+           g_buffer(ACC_SRC_B1) * rvb->ACC_COEF_B +\r
+           g_buffer(ACC_SRC_C1) * rvb->ACC_COEF_C +\r
+           g_buffer(ACC_SRC_D1) * rvb->ACC_COEF_D) >> 15;\r
 \r
    FB_A0 = g_buffer(FB_SRC_A0);\r
    FB_A1 = g_buffer(FB_SRC_A1);\r
    FB_B0 = g_buffer(FB_SRC_B0);\r
    FB_B1 = g_buffer(FB_SRC_B1);\r
 \r
-   mix_dest_a0 = ACC0 - ((FB_A0 * rvb.FB_ALPHA) >> 15);\r
-   mix_dest_a1 = ACC1 - ((FB_A1 * rvb.FB_ALPHA) >> 15);\r
+   mix_dest_a0 = ACC0 - ((FB_A0 * rvb->FB_ALPHA) >> 15);\r
+   mix_dest_a1 = ACC1 - ((FB_A1 * rvb->FB_ALPHA) >> 15);\r
 \r
-   mix_dest_b0 = FB_A0 + (((ACC0 - FB_A0) * rvb.FB_ALPHA - FB_B0 * rvb.FB_X) >> 15);\r
-   mix_dest_b1 = FB_A1 + (((ACC1 - FB_A1) * rvb.FB_ALPHA - FB_B1 * rvb.FB_X) >> 15);\r
+   mix_dest_b0 = FB_A0 + (((ACC0 - FB_A0) * rvb->FB_ALPHA - FB_B0 * rvb->FB_X) >> 15);\r
+   mix_dest_b1 = FB_A1 + (((ACC1 - FB_A1) * rvb->FB_ALPHA - FB_B1 * rvb->FB_X) >> 15);\r
 \r
    s_buffer(MIX_DEST_A0, mix_dest_a0);\r
    s_buffer(MIX_DEST_A1, mix_dest_a1);\r
@@ -129,73 +132,60 @@ static void MixREVERB(int *SSumLR, int *RVB, int ns_to)
    l = (mix_dest_a0 + mix_dest_b0) / 2;\r
    r = (mix_dest_a1 + mix_dest_b1) / 2;\r
 \r
-   l = (l * rvb.VolLeft)  >> 15; // 15?\r
-   r = (r * rvb.VolRight) >> 15;\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
+   SSumLR[ns++] += l;\r
+   SSumLR[ns++] += r;\r
 \r
    curr_addr++;\r
-   if (curr_addr >= 0x40000) curr_addr = rvb.StartAddr;\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 *SSumLR, int ns_to)\r
+static void MixREVERB_off(int *SSumLR, int ns_to, int curr_addr)\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
+ const REVERBInfo *rvb = spu.rvb;\r
+ int space = 0x40000 - rvb->StartAddr;\r
+ int l, r, ns;\r
 \r
  for (ns = 0; ns < ns_to * 2; )\r
   {\r
+   preload(SSumLR + ns + 64*2/4 - 4);\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
+   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
    SSumLR[ns++] += l;\r
    SSumLR[ns++] += r;\r
-\r
-   l_old = l;\r
-   r_old = r;\r
+   SSumLR[ns++] += l;\r
+   SSumLR[ns++] += r;\r
 \r
    curr_addr++;\r
-   if (curr_addr >= 0x40000) curr_addr = rvb.StartAddr;\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 prepare_offsets(void)\r
+static void REVERBPrep(void)\r
 {\r
- int space = 0x40000 - rvb.StartAddr;\r
+ REVERBInfo *rvb = spu.rvb;\r
+ int space = 0x40000 - rvb->StartAddr;\r
  int t;\r
  #define prep_offs(v) \\r
-   t = rvb.v; \\r
+   t = rvb->v; \\r
    while (t >= space) \\r
      t -= space; \\r
-   rvb.n##v = t\r
+   rvb->n##v = t\r
  #define prep_offs2(d, v1, v2) \\r
-   t = rvb.v1 - rvb.v2; \\r
+   t = rvb->v1 - rvb->v2; \\r
    while (t >= space) \\r
      t -= space; \\r
-   rvb.n##d = t\r
+   rvb->n##d = t\r
 \r
  prep_offs(IIR_SRC_A0);\r
  prep_offs(IIR_SRC_A1);\r
@@ -224,37 +214,18 @@ static void prepare_offsets(void)
 \r
 #undef prep_offs\r
 #undef prep_offs2\r
- rvb.dirty = 0;\r
+ rvb->dirty = 0;\r
 }\r
 \r
-INLINE void REVERBDo(int *SSumLR, int *RVB, int ns_to)\r
+INLINE void REVERBDo(int *SSumLR, int *RVB, int ns_to, int curr_addr)\r
 {\r
- if (!rvb.StartAddr)                                   // reverb is off\r
- {\r
-  rvb.iRVBLeft = rvb.iRVBRight = 0;\r
-  return;\r
- }\r
-\r
  if (spu.spuCtrl & 0x80)                               // -> reverb on? oki\r
  {\r
-  if (unlikely(rvb.dirty))\r
-   prepare_offsets();\r
-\r
-  MixREVERB(SSumLR, RVB, ns_to);\r
- }\r
- else if (rvb.VolLeft || rvb.VolRight)\r
- {\r
-  if (unlikely(rvb.dirty))\r
-   prepare_offsets();\r
-\r
-  MixREVERB_off(SSumLR, ns_to);\r
+  MixREVERB(SSumLR, RVB, ns_to, curr_addr);\r
  }\r
- else                                                  // -> reverb off\r
+ else if (spu.rvb->VolLeft || spu.rvb->VolRight)\r
  {\r
-  // reverb runs anyway\r
-  rvb.CurrAddr += ns_to / 2;\r
-  while (rvb.CurrAddr >= 0x40000)\r
-   rvb.CurrAddr -= 0x40000 - rvb.StartAddr;\r
+  MixREVERB_off(SSumLR, ns_to, curr_addr);\r
  }\r
 }\r
 \r