spu: keep generating irqs while they are pending
[pcsx_rearmed.git] / plugins / dfsound / spu.c
index df95f35..7c12cdc 100644 (file)
@@ -339,7 +339,7 @@ INLINE void StoreInterpolationVal(int ch,int fa)
 
 ////////////////////////////////////////////////////////////////////////
 
-INLINE int iGetInterpolationVal(int ch)
+INLINE int iGetInterpolationVal(int ch, int spos)
 {
  int fa;
 
@@ -351,7 +351,7 @@ INLINE int iGetInterpolationVal(int ch)
    case 3:                                             // cubic interpolation
     {
      long xd;int gpos;
-     xd = ((s_chan[ch].spos) >> 1)+1;
+     xd = (spos >> 1)+1;
      gpos = s_chan[ch].SB[28];
 
      fa  = gval(3) - 3*gval(2) + 3*gval(1) - gval0;
@@ -370,7 +370,7 @@ INLINE int iGetInterpolationVal(int ch)
    case 2:                                             // gauss interpolation
     {
      int vl, vr;int gpos;
-     vl = (s_chan[ch].spos >> 6) & ~3;
+     vl = (spos >> 6) & ~3;
      gpos = s_chan[ch].SB[28];
      vr=(gauss[vl]*gval0)&~2047;
      vr+=(gauss[vl+1]*gval(1))&~2047;
@@ -399,9 +399,9 @@ INLINE int iGetInterpolationVal(int ch)
 
 static void do_irq(void)
 {
- if(!(spuStat & STAT_IRQ))
//if(!(spuStat & STAT_IRQ))
  {
-  spuStat |= STAT_IRQ;
+  spuStat |= STAT_IRQ;                                 // asserted status?
   if(irqCallback) irqCallback();
  }
 }
@@ -570,7 +570,7 @@ out:                                         \
 
 make_do_samples(default, fmod_recv_check, ,
   StoreInterpolationVal(ch, fa),
-  ChanBuf[ns] = iGetInterpolationVal(ch), )
+  ChanBuf[ns] = iGetInterpolationVal(ch, spos), )
 make_do_samples(noint, , fa = s_chan[ch].SB[29], , ChanBuf[ns] = fa, s_chan[ch].SB[29] = fa)
 
 #define simple_interp_store \
@@ -623,8 +623,8 @@ static int do_samples_noise(int ch, int ns, int ns_to)
  return -1;
 }
 
-#ifdef __ARM_ARCH_7A__
-// asm code
+#ifdef __arm__
+// asm code; lv and rv must be 0-3fff
 extern void mix_chan(int start, int count, int lv, int rv);
 extern void mix_chan_rvb(int start, int count, int lv, int rv);
 #else