\r
\r
// Mednafen's table (PSX) 99-100%\r
-const int gauss[]={\r
- 0x12c7, 0x59b3, 0x1307, 0xffffffff, \r
- 0x1288, 0x59b2, 0x1347, 0xffffffff, \r
- 0x1249, 0x59b0, 0x1388, 0xffffffff, \r
- 0x120b, 0x59ad, 0x13c9, 0xffffffff, \r
- 0x11cd, 0x59a9, 0x140b, 0xffffffff, \r
- 0x118f, 0x59a4, 0x144d, 0xffffffff, \r
- 0x1153, 0x599e, 0x1490, 0xffffffff, \r
- 0x1116, 0x5997, 0x14d4, 0xffffffff, \r
- 0x10db, 0x598f, 0x1517, 0xffffffff, \r
- 0x109f, 0x5986, 0x155c, 0xffffffff, \r
- 0x1065, 0x597c, 0x15a0, 0xffffffff, \r
- 0x102a, 0x5971, 0x15e6, 0xffffffff, \r
- 0x0ff1, 0x5965, 0x162c, 0xffffffff, \r
- 0x0fb7, 0x5958, 0x1672, 0xffffffff, \r
- 0x0f7f, 0x5949, 0x16b9, 0xffffffff, \r
- 0x0f46, 0x593a, 0x1700, 0xffffffff, \r
+static const signed short gauss[] =\r
+{\r
+ 0x12c7, 0x59b3, 0x1307, 0xffff,\r
+ 0x1288, 0x59b2, 0x1347, 0xffff,\r
+ 0x1249, 0x59b0, 0x1388, 0xffff,\r
+ 0x120b, 0x59ad, 0x13c9, 0xffff,\r
+ 0x11cd, 0x59a9, 0x140b, 0xffff,\r
+ 0x118f, 0x59a4, 0x144d, 0xffff,\r
+ 0x1153, 0x599e, 0x1490, 0xffff,\r
+ 0x1116, 0x5997, 0x14d4, 0xffff,\r
+ 0x10db, 0x598f, 0x1517, 0xffff,\r
+ 0x109f, 0x5986, 0x155c, 0xffff,\r
+ 0x1065, 0x597c, 0x15a0, 0xffff,\r
+ 0x102a, 0x5971, 0x15e6, 0xffff,\r
+ 0x0ff1, 0x5965, 0x162c, 0xffff,\r
+ 0x0fb7, 0x5958, 0x1672, 0xffff,\r
+ 0x0f7f, 0x5949, 0x16b9, 0xffff,\r
+ 0x0f46, 0x593a, 0x1700, 0xffff,\r
0x0f0f, 0x592a, 0x1747, 0x0000, \r
0x0ed7, 0x5919, 0x1790, 0x0000, \r
0x0ea1, 0x5907, 0x17d8, 0x0000, \r
0x0000, 0x17d8, 0x5907, 0x0ea1, \r
0x0000, 0x1790, 0x5919, 0x0ed7, \r
0x0000, 0x1747, 0x592a, 0x0f0f, \r
- 0xffffffff, 0x1700, 0x593a, 0x0f46, \r
- 0xffffffff, 0x16b9, 0x5949, 0x0f7f, \r
- 0xffffffff, 0x1672, 0x5958, 0x0fb7, \r
- 0xffffffff, 0x162c, 0x5965, 0x0ff1, \r
- 0xffffffff, 0x15e6, 0x5971, 0x102a, \r
- 0xffffffff, 0x15a0, 0x597c, 0x1065, \r
- 0xffffffff, 0x155c, 0x5986, 0x109f, \r
- 0xffffffff, 0x1517, 0x598f, 0x10db, \r
- 0xffffffff, 0x14d4, 0x5997, 0x1116, \r
- 0xffffffff, 0x1490, 0x599e, 0x1153, \r
- 0xffffffff, 0x144d, 0x59a4, 0x118f, \r
- 0xffffffff, 0x140b, 0x59a9, 0x11cd, \r
- 0xffffffff, 0x13c9, 0x59ad, 0x120b, \r
- 0xffffffff, 0x1388, 0x59b0, 0x1249, \r
- 0xffffffff, 0x1347, 0x59b2, 0x1288, \r
- 0xffffffff, 0x1307, 0x59b3, 0x12c7, \r
+ 0xffff, 0x1700, 0x593a, 0x0f46,\r
+ 0xffff, 0x16b9, 0x5949, 0x0f7f,\r
+ 0xffff, 0x1672, 0x5958, 0x0fb7,\r
+ 0xffff, 0x162c, 0x5965, 0x0ff1,\r
+ 0xffff, 0x15e6, 0x5971, 0x102a,\r
+ 0xffff, 0x15a0, 0x597c, 0x1065,\r
+ 0xffff, 0x155c, 0x5986, 0x109f,\r
+ 0xffff, 0x1517, 0x598f, 0x10db,\r
+ 0xffff, 0x14d4, 0x5997, 0x1116,\r
+ 0xffff, 0x1490, 0x599e, 0x1153,\r
+ 0xffff, 0x144d, 0x59a4, 0x118f,\r
+ 0xffff, 0x140b, 0x59a9, 0x11cd,\r
+ 0xffff, 0x13c9, 0x59ad, 0x120b,\r
+ 0xffff, 0x1388, 0x59b0, 0x1249,\r
+ 0xffff, 0x1347, 0x59b2, 0x1288,\r
+ 0xffff, 0x1307, 0x59b3, 0x12c7,\r
};\r
\r
#endif\r
\r
////////////////////////////////////////////////////////////////////////\r
\r
-// from nocash psx-spx\r
-static void MixREVERB(int *SSumLR, int *RVB, int ns_to, int curr_addr)\r
+static void reverb_interpolate(REVERBInfo *rvb, int curr_addr,\r
+ int out0[2], int out1[2])\r
+{\r
+ int spos = (curr_addr - 3) & 3;\r
+ int dpos = curr_addr & 3;\r
+ int i;\r
+\r
+ for (i = 0; i < 2; i++)\r
+ rvb->SB[i][dpos] = rvb->SB[i][4 | dpos] = out0[i];\r
+\r
+ // mednafen uses some 20 coefs here, we just reuse gauss [0] and [128]\r
+ for (i = 0; i < 2; i++)\r
+ {\r
+ const int *s;\r
+ s = &rvb->SB[i][spos];\r
+ out0[i] = (s[0] * 0x12c7 + s[1] * 0x59b3 + s[2] * 0x1307) >> 15;\r
+ out1[i] = (s[0] * 0x019c + s[1] * 0x3def + s[2] * 0x3e4c + s[3] * 0x01a8) >> 15;\r
+ }\r
+}\r
+\r
+static void MixREVERB(int *SSumLR, int *RVB, int ns_to, int curr_addr,\r
+ int do_filter)\r
{\r
unsigned short *spuMem = spu.spuMem;\r
- const REVERBInfo *rvb = spu.rvb;\r
+ REVERBInfo *rvb = spu.rvb;\r
int space = 0x40000 - rvb->StartAddr;\r
int mlsame_m2o = rvb->mLSAME + space - 1;\r
int mrsame_m2o = rvb->mRSAME + space - 1;\r
int mrsame_m2 = g_buffer(mrsame_m2o) << 15;\r
int mldiff_m2 = g_buffer(mldiff_m2o) << 15;\r
int mrdiff_m2 = g_buffer(mrdiff_m2o) << 15;\r
- int Lout, Rout;\r
+ int Lout, Rout, out0[2], out1[2];\r
\r
+ // from nocash psx-spx\r
mlsame_m2 += ((Lin + g_buffer(rvb->dLSAME) * vWALL - mlsame_m2) >> 15) * vIIR;\r
mrsame_m2 += ((Rin + g_buffer(rvb->dRSAME) * vWALL - mrsame_m2) >> 15) * vIIR;\r
mldiff_m2 += ((Lin + g_buffer(rvb->dLDIFF) * vWALL - mldiff_m2) >> 15) * vIIR;\r
Lout = Lout * vAPF2 + (g_buffer(rvb->mLAPF2_dAPF2) << 15);\r
Rout = Rout * vAPF2 + (g_buffer(rvb->mRAPF2_dAPF2) << 15);\r
\r
- Lout = ((Lout >> 15) * rvb->VolLeft) >> 15;\r
- Rout = ((Rout >> 15) * rvb->VolRight) >> 15;\r
+ out0[0] = out1[0] = (Lout >> 15) * rvb->VolLeft >> 15;\r
+ out0[1] = out1[1] = (Rout >> 15) * rvb->VolRight >> 15;\r
+ if (do_filter)\r
+ reverb_interpolate(rvb, curr_addr, out0, out1);\r
\r
- SSumLR[ns++] += Lout;\r
- SSumLR[ns++] += Rout;\r
- SSumLR[ns++] += Lout;\r
- SSumLR[ns++] += Rout;\r
+ SSumLR[ns++] += out0[0];\r
+ SSumLR[ns++] += out0[1];\r
+ SSumLR[ns++] += out1[0];\r
+ SSumLR[ns++] += out1[1];\r
\r
curr_addr++;\r
curr_addr = rvb_wrap(curr_addr, space);\r
{\r
if (spu.spuCtrl & 0x80) // -> reverb on? oki\r
{\r
- MixREVERB(SSumLR, RVB, ns_to, curr_addr);\r
+ MixREVERB(SSumLR, RVB, ns_to, curr_addr, spu.interpolation > 1);\r
}\r
else if (spu.rvb->VolLeft || spu.rvb->VolRight)\r
{\r