diff options
author | notaz | 2012-07-07 21:45:00 +0300 |
---|---|---|
committer | notaz | 2012-07-15 20:29:48 +0300 |
commit | e4f075af4e4ba79332c72809d3bb4ba6e2895253 (patch) | |
tree | cb9851e519f749f3f3a998055824d6755d2d4f1c /plugins/dfsound/freeze.c | |
parent | f2aec10aa8e3befe7e89070e8559d070835cc23e (diff) | |
download | pcsx_rearmed-e4f075af4e4ba79332c72809d3bb4ba6e2895253.tar.gz pcsx_rearmed-e4f075af4e4ba79332c72809d3bb4ba6e2895253.tar.bz2 pcsx_rearmed-e4f075af4e4ba79332c72809d3bb4ba6e2895253.zip |
spu: rework irq handling and loop reloading
irq might be too early, but this seems to be better than was before.
Special thanks to Ryphecha for some ideas again.
Diffstat (limited to 'plugins/dfsound/freeze.c')
-rw-r--r-- | plugins/dfsound/freeze.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/plugins/dfsound/freeze.c b/plugins/dfsound/freeze.c index d7e45b1..ec097c5 100644 --- a/plugins/dfsound/freeze.c +++ b/plugins/dfsound/freeze.c @@ -134,11 +134,11 @@ static void save_channel(SPUCHAN_orig *d, const SPUCHAN *s, int ch) d->bOn = !!(dwChannelOn & (1<<ch));
d->bStop = s->bStop;
d->bReverb = s->bReverb;
- d->bIgnoreLoop = s->bJump;
d->iActFreq = 1;
d->iUsedFreq = 2;
d->iLeftVolume = s->iLeftVolume;
- d->bIgnoreLoop = 0;
+ // this one is nasty but safe, save compat is important
+ d->bIgnoreLoop = (s->prevflags ^ 2) << 1;
d->iRightVolume = s->iRightVolume;
d->iRawPitch = s->iRawPitch;
d->s_1 = s->SB[27]; // yes it's reversed
@@ -179,7 +179,7 @@ static void load_channel(SPUCHAN *d, const SPUCHAN_orig *s, int ch) d->bRVBActive = s->bRVBActive;
d->bNoise = s->bNoise;
d->bFMod = s->bFMod;
- d->bJump = s->bIgnoreLoop;
+ d->prevflags = (s->bIgnoreLoop >> 1) ^ 2;
d->ADSRX.State = s->ADSRX.State;
d->ADSRX.AttackModeExp = s->ADSRX.AttackModeExp;
d->ADSRX.AttackRate = s->ADSRX.AttackRate;
@@ -232,11 +232,11 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode,SPUFreeze_t * pF) pFO->spuAddr=spuAddr;
if(pFO->spuAddr==0) pFO->spuAddr=0xbaadf00d;
- dwChannelOn&=~dwPendingChanOff;
- dwPendingChanOff=0;
-
for(i=0;i<MAXCHAN;i++)
{
+ if(!(s_chan[i].prevflags&2))
+ dwChannelOn&=~(1<<i);
+
save_channel(&pFO->s_chan[i],&s_chan[i],i);
if(pFO->s_chan[i].pCurr)
pFO->s_chan[i].pCurr-=(unsigned long)spuMemC;
@@ -257,7 +257,6 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode,SPUFreeze_t * pF) SPUplayADPCMchannel(&pF->xaS);
xapGlobal=0;
- dwPendingChanOff=0;
if(!strcmp(pF->szSPUName,"PBOSS") && pF->ulFreezeVersion==5)
LoadStateV5(pF);
|