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(void)\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
+\r
+ for (ns = 0; ns < NSSIZE*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
\r
if (spuCtrl & 0x80) // -> reverb on? oki\r
{\r
- if (rvb.dirty)\r
+ if (unlikely(rvb.dirty))\r
prepare_offsets();\r
\r
MixREVERB();\r
}\r
+ else if (rvb.VolLeft || rvb.VolRight)\r
+ {\r
+ if (unlikely(rvb.dirty))\r
+ prepare_offsets();\r
+\r
+ MixREVERB_off();\r
+ }\r
else // -> reverb off\r
{\r
- // supposedly runs anyway?\r
+ // reverb runs anyway\r
rvb.CurrAddr += NSSIZE/2;\r
while (rvb.CurrAddr >= 0x40000)\r
rvb.CurrAddr -= 0x40000 - rvb.StartAddr;\r