spu: add asm mixing code for ARMv5 too
[pcsx_rearmed.git] / plugins / dfsound / spu.c
index b3bd057..d26fa96 100644 (file)
@@ -222,9 +222,10 @@ INLINE void InterpolateUp(int ch)
    s_chan[ch].SB[32]=0;
 
    s_chan[ch].SB[28]=(s_chan[ch].SB[28]*s_chan[ch].sinc)/0x20000L;
-   if(s_chan[ch].sinc<=0x8000)
-        s_chan[ch].SB[29]=s_chan[ch].SB[30]-(s_chan[ch].SB[28]*((0x10000/s_chan[ch].sinc)-1));
-   else s_chan[ch].SB[29]+=s_chan[ch].SB[28];
+   //if(s_chan[ch].sinc<=0x8000)
+   //     s_chan[ch].SB[29]=s_chan[ch].SB[30]-(s_chan[ch].SB[28]*((0x10000/s_chan[ch].sinc)-1));
+   //else
+   s_chan[ch].SB[29]+=s_chan[ch].SB[28];
   }
  else                                                  // no flags? add bigger val (if possible), calc smaller step, set flag1
   s_chan[ch].SB[29]+=s_chan[ch].SB[28];
@@ -338,7 +339,7 @@ INLINE void StoreInterpolationVal(int ch,int fa)
 
 ////////////////////////////////////////////////////////////////////////
 
-INLINE int iGetInterpolationVal(int ch)
+INLINE int iGetInterpolationVal(int ch, int spos)
 {
  int fa;
 
@@ -350,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;
@@ -369,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;
@@ -569,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 \
@@ -622,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
@@ -903,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;
   }