spu: save/restore decode_pos
[pcsx_rearmed.git] / plugins / dfsound / freeze.c
index 5b4267b..3bdbab1 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
@@ -231,6 +232,8 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode, SPUFreeze_t * pF,
 \r
  if(!pF) return 0;                                     // first check\r
 \r
+ do_samples(cycles, 1);\r
+\r
  if(ulFreezeMode)                                      // info or save?\r
   {//--------------------------------------------------//\r
    if(ulFreezeMode==1)                                 \r
@@ -242,8 +245,6 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode, SPUFreeze_t * pF,
 \r
    if(ulFreezeMode==2) return 1;                       // info mode? ok, bye\r
                                                        // save mode:\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
@@ -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,6 +331,7 @@ 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