spu: get rid of bStop, clean up
[pcsx_rearmed.git] / plugins / dfsound / freeze.c
index b865b84..be344ce 100644 (file)
@@ -148,7 +148,7 @@ static void save_channel(SPUCHAN_orig *d, const SPUCHAN *s, int ch)
  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
@@ -188,7 +188,6 @@ static void load_channel(SPUCHAN *d, const SPUCHAN_orig *s, int ch)
  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
@@ -198,6 +197,7 @@ static void load_channel(SPUCHAN *d, const SPUCHAN_orig *s, int ch)
  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
@@ -307,6 +307,9 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode, SPUFreeze_t * pF,
  ClearWorkingState();\r
  spu.cycles_played = cycles;\r
 \r
+ if (spu.spuCtrl & CTRL_IRQ)\r
+  schedule_next_irq();\r
+\r
  return 1;\r
 }\r
 \r
@@ -318,7 +321,7 @@ void LoadStateV5(SPUFreeze_t * pF)
 \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
@@ -346,14 +349,13 @@ void LoadStateUnknown(SPUFreeze_t * pF, uint32_t cycles)
 \r
  for(i=0;i<MAXCHAN;i++)\r
   {\r
-   s_chan[i].bStop=0;\r
    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