spu: add asm mixing code for ARMv5 too
[pcsx_rearmed.git] / plugins / dfsound / spu.c
index d7dc1b6..d26fa96 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;
@@ -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
@@ -904,12 +904,14 @@ static void *MAINThread(void *arg)
 // SPU ASYNC... even newer epsxe func
 //  1 time every 'cycle' cycles... harhar
 
+// rearmed: called every 2ms now
+
 void CALLBACK SPUasync(unsigned long cycle)
 {
  if(iSpuAsyncWait)
   {
    iSpuAsyncWait++;
-   if(iSpuAsyncWait<=16/FRAG_MSECS) return;
+   if(iSpuAsyncWait<=16/2) return;
    iSpuAsyncWait=0;
   }