aboutsummaryrefslogtreecommitdiff
path: root/plugins/dfsound/reverb.c
diff options
context:
space:
mode:
authornotaz2012-07-09 00:28:04 +0300
committernotaz2012-07-15 20:30:10 +0300
commitb72f17a1320e9038c8416343ce270b0f676c757c (patch)
treed76c24a36957c1a1491344641f6ab5fa094cc0cb /plugins/dfsound/reverb.c
parente4f075af4e4ba79332c72809d3bb4ba6e2895253 (diff)
downloadpcsx_rearmed-b72f17a1320e9038c8416343ce270b0f676c757c.tar.gz
pcsx_rearmed-b72f17a1320e9038c8416343ce270b0f676c757c.tar.bz2
pcsx_rearmed-b72f17a1320e9038c8416343ce270b0f676c757c.zip
spu: add decode buffer and reverb read handling
Diffstat (limited to 'plugins/dfsound/reverb.c')
-rw-r--r--plugins/dfsound/reverb.c52
1 files changed, 46 insertions, 6 deletions
diff --git a/plugins/dfsound/reverb.c b/plugins/dfsound/reverb.c
index 2d65a69..ebb709b 100644
--- a/plugins/dfsound/reverb.c
+++ b/plugins/dfsound/reverb.c
@@ -157,11 +157,44 @@ static void MixREVERB(void)
s_buffer(MIX_DEST_B0, mix_dest_b0);
s_buffer(MIX_DEST_B1, mix_dest_b1);
- l = (mix_dest_a0 + mix_dest_b0) / 3;
- r = (mix_dest_a1 + mix_dest_b1) / 3;
+ l = (mix_dest_a0 + mix_dest_b0) / 2;
+ r = (mix_dest_a1 + mix_dest_b1) / 2;
- l = (l * rvb.VolLeft) >> 14;
- r = (r * rvb.VolRight) >> 14;
+ l = (l * rvb.VolLeft) >> 15; // 15?
+ r = (r * rvb.VolRight) >> 15;
+
+ SSumLR[ns++] += (l + l_old) / 2;
+ SSumLR[ns++] += (r + r_old) / 2;
+ SSumLR[ns++] += l;
+ SSumLR[ns++] += r;
+
+ l_old = l;
+ r_old = r;
+
+ curr_addr++;
+ if (curr_addr >= 0x40000) curr_addr = rvb.StartAddr;
+ }
+
+ rvb.iRVBLeft = l;
+ rvb.iRVBRight = r;
+ rvb.CurrAddr = curr_addr;
+}
+
+static void MixREVERB_off(void)
+{
+ int l_old = rvb.iRVBLeft;
+ int r_old = rvb.iRVBRight;
+ int curr_addr = rvb.CurrAddr;
+ int space = 0x40000 - rvb.StartAddr;
+ int l, r, ns;
+
+ for (ns = 0; ns < NSSIZE*2; )
+ {
+ l = (g_buffer(MIX_DEST_A0) + g_buffer(MIX_DEST_B0)) / 2;
+ r = (g_buffer(MIX_DEST_A1) + g_buffer(MIX_DEST_B1)) / 2;
+
+ l = (l * rvb.VolLeft) >> 15;
+ r = (r * rvb.VolRight) >> 15;
SSumLR[ns++] += (l + l_old) / 2;
SSumLR[ns++] += (r + r_old) / 2;
@@ -235,14 +268,21 @@ INLINE void REVERBDo(void)
if (spuCtrl & 0x80) // -> reverb on? oki
{
- if (rvb.dirty)
+ if (unlikely(rvb.dirty))
prepare_offsets();
MixREVERB();
}
+ else if (rvb.VolLeft || rvb.VolRight)
+ {
+ if (unlikely(rvb.dirty))
+ prepare_offsets();
+
+ MixREVERB_off();
+ }
else // -> reverb off
{
- // supposedly runs anyway?
+ // reverb runs anyway
rvb.CurrAddr += NSSIZE/2;
while (rvb.CurrAddr >= 0x40000)
rvb.CurrAddr -= 0x40000 - rvb.StartAddr;