aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authornotaz2011-02-09 14:34:15 +0200
committernotaz2011-02-09 14:59:32 +0200
commitb00afb7734d75d4e625db0263548fa15b9aa0af7 (patch)
tree3e73cc8792c9dd21b8d20c206e866a50c76ee4f7 /plugins
parent7384197d8a5fd20a4d94f3517a6462f7fe86dd4c (diff)
downloadpcsx_rearmed-b00afb7734d75d4e625db0263548fa15b9aa0af7.tar.gz
pcsx_rearmed-b00afb7734d75d4e625db0263548fa15b9aa0af7.tar.bz2
pcsx_rearmed-b00afb7734d75d4e625db0263548fa15b9aa0af7.zip
dfsound: backport fixes from pcsxr
shalma: - Align start addresses to 16-bytes - (Hopkat) registers.c - External loop address align to 16 bytes - SoundOff prevents new channel from starting - fixes Jungle Book (buzzing loop hangs)
Diffstat (limited to 'plugins')
-rw-r--r--plugins/dfsound/registers.c17
-rw-r--r--plugins/dfsound/spu.c7
2 files changed, 19 insertions, 5 deletions
diff --git a/plugins/dfsound/registers.c b/plugins/dfsound/registers.c
index b684914..5ab519b 100644
--- a/plugins/dfsound/registers.c
+++ b/plugins/dfsound/registers.c
@@ -70,7 +70,8 @@ void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val)
break;
//------------------------------------------------// start
case 6:
- s_chan[ch].pStart=spuMemC+((unsigned long) val<<3);
+ // Brain Dead 13 - align to 16 boundary
+ s_chan[ch].pStart= spuMemC+(unsigned long)((val<<3)&~0xf);
break;
//------------------------------------------------// level with pre-calcs
case 8:
@@ -162,7 +163,7 @@ void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val)
//------------------------------------------------//
case 14: // loop?
//WaitForSingleObject(s_chan[ch].hMutex,2000); // -> no multithread fuckups
- s_chan[ch].pLoop=spuMemC+((unsigned long) val<<3);
+ s_chan[ch].pLoop=spuMemC+((unsigned long)((val<<3)&~0xf));
s_chan[ch].bIgnoreLoop=1;
//ReleaseMutex(s_chan[ch].hMutex); // -> oki, on with the thread
break;
@@ -424,6 +425,13 @@ void SoundOn(int start,int end,unsigned short val) // SOUND ON PSX COMAND
{
s_chan[ch].bIgnoreLoop=0;
s_chan[ch].bNew=1;
+
+ // do this here, not in StartSound
+ // - fixes fussy timing issues
+ s_chan[ch].bStop=0;
+ s_chan[ch].bOn=1;
+ s_chan[ch].pCurr=s_chan[ch].pStart;
+
dwNewChannel|=(1<<ch); // bitfield for faster testing
}
}
@@ -441,6 +449,11 @@ void SoundOff(int start,int end,unsigned short val) // SOUND OFF PSX COMMAND
if(val&1) // && s_chan[i].bOn) mmm...
{
s_chan[ch].bStop=1;
+
+ // Jungle Book - Rhythm 'n Groove
+ // - turns off buzzing sound (loop hangs)
+ s_chan[ch].bNew=0;
+ dwNewChannel &= ~(1<<ch);
}
}
}
diff --git a/plugins/dfsound/spu.c b/plugins/dfsound/spu.c
index 7e6cfb2..8936e45 100644
--- a/plugins/dfsound/spu.c
+++ b/plugins/dfsound/spu.c
@@ -245,15 +245,16 @@ INLINE void StartSound(int ch)
StartADSR(ch);
StartREVERB(ch);
- s_chan[ch].pCurr=s_chan[ch].pStart; // set sample start
+ // fussy timing issues - do in VoiceOn
+ //s_chan[ch].pCurr=s_chan[ch].pStart; // set sample start
+ //s_chan[ch].bStop=0;
+ //s_chan[ch].bOn=1;
s_chan[ch].s_1=0; // init mixing vars
s_chan[ch].s_2=0;
s_chan[ch].iSBPos=28;
s_chan[ch].bNew=0; // init channel flags
- s_chan[ch].bStop=0;
- s_chan[ch].bOn=1;
s_chan[ch].SB[29]=0; // init our interpolation helpers
s_chan[ch].SB[30]=0;