d->iCurr = 0; // set by the caller\r
d->iLoop = 0; // set by the caller\r
d->bOn = !!(spu.dwChannelOn & (1<<ch));\r
- d->bStop = s->bStop;\r
+ d->bStop = s->ADSRX.State == ADSR_RELEASE;\r
d->bReverb = s->bReverb;\r
d->iActFreq = 1;\r
d->iUsedFreq = 2;\r
memcpy(d->SB, s->SB, sizeof(d->SB));\r
d->pCurr = (void *)((long)s->iCurr & 0x7fff0);\r
d->pLoop = (void *)((long)s->iLoop & 0x7fff0);\r
- d->bStop = s->bStop;\r
d->bReverb = s->bReverb;\r
d->iLeftVolume = s->iLeftVolume;\r
d->iRightVolume = s->iRightVolume;\r
d->bFMod = s->bFMod;\r
d->prevflags = (s->bIgnoreLoop >> 1) ^ 2;\r
d->ADSRX.State = s->ADSRX.State;\r
+ if (s->bStop) d->ADSRX.State = ADSR_RELEASE;\r
d->ADSRX.AttackModeExp = s->ADSRX.AttackModeExp;\r
d->ADSRX.AttackRate = s->ADSRX.AttackRate;\r
d->ADSRX.DecayRate = s->ADSRX.DecayRate;\r
\r
if(ulFreezeMode==2) return 1; // info mode? ok, bye\r
// save mode:\r
- do_samples(cycles);\r
+ do_samples(cycles, 1);\r
\r
memcpy(pF->cSPURam,spu.spuMem,0x80000); // copy common infos\r
memcpy(pF->cSPUPort,spu.regArea,0x200);\r
\r
for(i=0;i<MAXCHAN;i++)\r
{\r
- save_channel(&pFO->s_chan[i],&s_chan[i],i);\r
- if(s_chan[i].pCurr)\r
- pFO->s_chan[i].iCurr=s_chan[i].pCurr-spu.spuMemC;\r
- if(s_chan[i].pLoop)\r
- pFO->s_chan[i].iLoop=s_chan[i].pLoop-spu.spuMemC;\r
+ save_channel(&pFO->s_chan[i],&spu.s_chan[i],i);\r
+ if(spu.s_chan[i].pCurr)\r
+ pFO->s_chan[i].iCurr=spu.s_chan[i].pCurr-spu.spuMemC;\r
+ if(spu.s_chan[i].pLoop)\r
+ pFO->s_chan[i].iLoop=spu.s_chan[i].pLoop-spu.spuMemC;\r
}\r
\r
return 1;\r
load_register(H_CDRight, cycles);\r
\r
// fix to prevent new interpolations from crashing\r
- for(i=0;i<MAXCHAN;i++) s_chan[i].SB[28]=0;\r
+ for(i=0;i<MAXCHAN;i++) spu.s_chan[i].SB[28]=0;\r
\r
ClearWorkingState();\r
spu.cycles_played = cycles;\r
\r
+ if (spu.spuCtrl & CTRL_IRQ)\r
+ schedule_next_irq();\r
+\r
return 1;\r
}\r
\r
\r
pFO=(SPUOSSFreeze_t *)(pF+1);\r
\r
- if(pFO->pSpuIrq) spu.pSpuIrq = spu.spuMemC+((long)pFO->pSpuIrq&0x7fff0); else spu.pSpuIrq=NULL;\r
+ spu.pSpuIrq = spu.spuMemC + ((spu.regArea[(H_SPUirqAddr - 0x0c00) / 2] << 3) & ~0xf);\r
\r
if(pFO->spuAddr)\r
{\r
- spu.spuAddr = pFO->spuAddr;\r
- if (spu.spuAddr == 0xbaadf00d) spu.spuAddr = 0;\r
+ if (pFO->spuAddr == 0xbaadf00d) spu.spuAddr = 0;\r
+ else spu.spuAddr = pFO->spuAddr & 0x7fffe;\r
}\r
\r
spu.dwNewChannel=0;\r
spu.dwChannelDead=0;\r
for(i=0;i<MAXCHAN;i++)\r
{\r
- load_channel(&s_chan[i],&pFO->s_chan[i],i);\r
+ load_channel(&spu.s_chan[i],&pFO->s_chan[i],i);\r
\r
- s_chan[i].pCurr+=(unsigned long)spu.spuMemC;\r
- s_chan[i].pLoop+=(unsigned long)spu.spuMemC;\r
+ spu.s_chan[i].pCurr+=(unsigned long)spu.spuMemC;\r
+ spu.s_chan[i].pLoop+=(unsigned long)spu.spuMemC;\r
}\r
}\r
\r
\r
for(i=0;i<MAXCHAN;i++)\r
{\r
- s_chan[i].bStop=0;\r
- s_chan[i].pLoop=spu.spuMemC;\r
+ spu.s_chan[i].pLoop=spu.spuMemC;\r
}\r
\r
spu.dwNewChannel=0;\r
spu.dwChannelOn=0;\r
spu.dwChannelDead=0;\r
- spu.pSpuIrq=0;\r
+ spu.pSpuIrq=spu.spuMemC;\r
\r
for(i=0;i<0xc0;i++)\r
{\r