spu: avoid NULL pSpuIrq
authornotaz <notasas@gmail.com>
Sat, 20 Dec 2014 22:36:00 +0000 (00:36 +0200)
committernotaz <notasas@gmail.com>
Sun, 21 Dec 2014 00:31:24 +0000 (02:31 +0200)
CTR sets 0 irq address, and savestates mess up

plugins/dfsound/freeze.c
plugins/dfsound/spu.c

index b865b84..d38faa6 100644 (file)
@@ -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
@@ -353,7 +356,7 @@ void LoadStateUnknown(SPUFreeze_t * pF, uint32_t cycles)
  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
index ca362b7..2c13ca1 100644 (file)
@@ -738,7 +738,7 @@ void do_samples(unsigned int cycles_to)
   // an IRQ.
 
   if (unlikely((spu.spuCtrl & CTRL_IRQ)
-      && spu.pSpuIrq && spu.pSpuIrq < spu.spuMemC+0x1000))
+       && spu.pSpuIrq < spu.spuMemC+0x1000))
    {
     int irq_pos = (spu.pSpuIrq - spu.spuMemC) / 2 & 0x1ff;
     int left = (irq_pos - spu.decode_pos) & 0x1ff;
@@ -1027,7 +1027,7 @@ long CALLBACK SPUinit(void)
  spu.spuAddr = 0xffffffff;
  spu.decode_pos = 0;
  memset((void *)s_chan, 0, sizeof(s_chan));
- spu.pSpuIrq = 0;
+ spu.pSpuIrq = spu.spuMemC;
 
  SetupStreams();                                       // prepare streaming