spu: support master volume
[pcsx_rearmed.git] / plugins / dfsound / freeze.c
index 72c9d22..4866df8 100644 (file)
@@ -119,6 +119,7 @@ typedef struct
 typedef struct\r
 {\r
  unsigned short  spuIrq;\r
+ unsigned short  decode_pos;\r
  uint32_t   pSpuIrq;\r
  uint32_t   spuAddr;\r
  uint32_t   dummy1;\r
@@ -144,10 +145,10 @@ static void save_channel(SPUCHAN_orig *d, const SPUCHAN *s, int ch)
  d->spos = s->spos;\r
  d->sinc = s->sinc;\r
  memcpy(d->SB, spu.SB + ch * SB_SIZE, sizeof(d->SB[0]) * SB_SIZE);\r
- d->iStart = (regAreaGet(ch,6)&~1)<<3;\r
+ d->iStart = (regAreaGetCh(ch, 6) & ~1) << 3;\r
  d->iCurr = 0; // set by the caller\r
  d->iLoop = 0; // set by the caller\r
- d->bOn = !!(spu.dwChannelOn & (1<<ch));\r
+ d->bOn = !!(spu.dwChannelsAudible & (1<<ch));\r
  d->bStop = s->ADSRX.State == ADSR_RELEASE;\r
  d->bReverb = s->bReverb;\r
  d->iActFreq = 1;\r
@@ -208,7 +209,7 @@ static void load_channel(SPUCHAN *d, const SPUCHAN_orig *s, int ch)
  d->ADSRX.ReleaseModeExp = s->ADSRX.ReleaseModeExp;\r
  d->ADSRX.ReleaseRate = s->ADSRX.ReleaseRate;\r
  d->ADSRX.EnvelopeVol = s->ADSRX.EnvelopeVol;\r
- if (s->bOn) spu.dwChannelOn |= 1<<ch;\r
+ if (s->bOn) spu.dwChannelsAudible |= 1<<ch;\r
  else d->ADSRX.EnvelopeVol = 0;\r
 }\r
 \r
@@ -261,6 +262,7 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode, SPUFreeze_t * pF,
 \r
    pFO->spuAddr=spu.spuAddr;\r
    if(pFO->spuAddr==0) pFO->spuAddr=0xbaadf00d;\r
+   pFO->decode_pos = spu.decode_pos;\r
 \r
    for(i=0;i<MAXCHAN;i++)\r
     {\r
@@ -279,6 +281,7 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode, SPUFreeze_t * pF,
 \r
  memcpy(spu.spuMem,pF->cSPURam,0x80000);               // get ram\r
  memcpy(spu.regArea,pF->cSPUPort,0x200);\r
+ spu.bMemDirty = 1;\r
 \r
  if(pF->xaS.nsamples<=4032)                            // start xa again\r
   SPUplayADPCMchannel(&pF->xaS);\r
@@ -328,9 +331,10 @@ void LoadStateV5(SPUFreeze_t * pF)
    if (pFO->spuAddr == 0xbaadf00d) spu.spuAddr = 0;\r
    else spu.spuAddr = pFO->spuAddr & 0x7fffe;\r
   }\r
+ spu.decode_pos = pFO->decode_pos & 0x1ff;\r
 \r
  spu.dwNewChannel=0;\r
- spu.dwChannelOn=0;\r
+ spu.dwChannelsAudible=0;\r
  spu.dwChannelDead=0;\r
  for(i=0;i<MAXCHAN;i++)\r
   {\r
@@ -353,7 +357,7 @@ void LoadStateUnknown(SPUFreeze_t * pF, uint32_t cycles)
   }\r
 \r
  spu.dwNewChannel=0;\r
- spu.dwChannelOn=0;\r
+ spu.dwChannelsAudible=0;\r
  spu.dwChannelDead=0;\r
  spu.pSpuIrq=spu.spuMemC;\r
 \r