updated gaussian interpolation filter
[pcsx_rearmed.git] / plugins / dfsound / xa.c
index 9b7ed5a..bfebe3e 100644 (file)
@@ -38,12 +38,12 @@ static int gauss_window[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 // MIX XA & CDDA
 ////////////////////////////////////////////////////////////////////////
 
-INLINE void MixXA(int ns_to)
+INLINE void MixXA(int *SSumLR, int ns_to, int decode_pos)
 {
+ int cursor = decode_pos;
  int ns;
  short l, r;
  uint32_t v;
- int cursor = spu.decode_pos;
 
  if(spu.XAPlay != spu.XAFeed || spu.XARepeat > 0)
  {
@@ -90,7 +90,9 @@ INLINE void MixXA(int ns_to)
 
 static unsigned long timeGetTime_spu()
 {
-#ifdef _WIN32
+#if defined(NO_OS)
+ return 0;
+#elif defined(_WIN32)
  return GetTickCount();
 #else
  struct timeval tv;
@@ -187,16 +189,16 @@ INLINE void FeedXA(xa_decode_t *xap)
            spos -= 0x10000L;
           }
          vl = (spos >> 6) & ~3;
-         vr=(gauss[vl]*gvall0)&~2047;
-         vr+=(gauss[vl+1]*gvall(1))&~2047;
-         vr+=(gauss[vl+2]*gvall(2))&~2047;
-         vr+=(gauss[vl+3]*gvall(3))&~2047;
-         l= (vr >> 11) & 0xffff;
-         vr=(gauss[vl]*gvalr0)&~2047;
-         vr+=(gauss[vl+1]*gvalr(1))&~2047;
-         vr+=(gauss[vl+2]*gvalr(2))&~2047;
-         vr+=(gauss[vl+3]*gvalr(3))&~2047;
-         l |= vr << 5;
+         vr=(gauss[vl]*gvall0) >> 15;
+         vr+=(gauss[vl+1]*gvall(1)) >> 15;
+         vr+=(gauss[vl+2]*gvall(2)) >> 15;
+         vr+=(gauss[vl+3]*gvall(3)) >> 15;
+         l= vr & 0xffff;
+         vr=(gauss[vl]*gvalr0) >> 15;
+         vr+=(gauss[vl+1]*gvalr(1)) >> 15;
+         vr+=(gauss[vl+2]*gvalr(2)) >> 15;
+         vr+=(gauss[vl+3]*gvalr(3)) >> 15;
+         l |= vr << 16;
         }
        else
         {
@@ -244,16 +246,16 @@ INLINE void FeedXA(xa_decode_t *xap)
            spos -= 0x10000L;
           }
          vl = (spos >> 6) & ~3;
-         vr=(gauss[vl]*gvall0)&~2047;
-         vr+=(gauss[vl+1]*gvall(1))&~2047;
-         vr+=(gauss[vl+2]*gvall(2))&~2047;
-         vr+=(gauss[vl+3]*gvall(3))&~2047;
-         l= (vr >> 11) & 0xffff;
-         vr=(gauss[vl]*gvalr0)&~2047;
-         vr+=(gauss[vl+1]*gvalr(1))&~2047;
-         vr+=(gauss[vl+2]*gvalr(2))&~2047;
-         vr+=(gauss[vl+3]*gvalr(3))&~2047;
-         l |= vr << 5;
+         vr=(gauss[vl]*gvall0) >> 15;
+         vr+=(gauss[vl+1]*gvall(1)) >> 15;
+         vr+=(gauss[vl+2]*gvall(2)) >> 15;
+         vr+=(gauss[vl+3]*gvall(3)) >> 15;
+         l= vr & 0xffff;
+         vr=(gauss[vl]*gvalr0) >> 15;
+         vr+=(gauss[vl+1]*gvalr(1)) >> 15;
+         vr+=(gauss[vl+2]*gvalr(2)) >> 15;
+         vr+=(gauss[vl+3]*gvalr(3)) >> 15;
+         l |= vr << 16;
         }
        else
         {
@@ -296,11 +298,11 @@ INLINE void FeedXA(xa_decode_t *xap)
            spos -= 0x10000L;
           }
          vl = (spos >> 6) & ~3;
-         vr=(gauss[vl]*gvall0)&~2047;
-         vr+=(gauss[vl+1]*gvall(1))&~2047;
-         vr+=(gauss[vl+2]*gvall(2))&~2047;
-         vr+=(gauss[vl+3]*gvall(3))&~2047;
-         l1=s= vr >> 11;
+         vr=(gauss[vl]*gvall0) >> 15;
+         vr+=(gauss[vl+1]*gvall(1)) >> 15;
+         vr+=(gauss[vl+2]*gvall(2)) >> 15;
+         vr+=(gauss[vl+3]*gvall(3)) >> 15;
+         l1=s= vr;
          l1 &= 0xffff;
         }
        else
@@ -341,11 +343,11 @@ INLINE void FeedXA(xa_decode_t *xap)
            spos -= 0x10000L;
           }
          vl = (spos >> 6) & ~3;
-         vr=(gauss[vl]*gvall0)&~2047;
-         vr+=(gauss[vl+1]*gvall(1))&~2047;
-         vr+=(gauss[vl+2]*gvall(2))&~2047;
-         vr+=(gauss[vl+3]*gvall(3))&~2047;
-         l=s= vr >> 11;
+         vr=(gauss[vl]*gvall0) >> 15;
+         vr+=(gauss[vl+1]*gvall(1)) >> 15;
+         vr+=(gauss[vl+2]*gvall(2)) >> 15;
+         vr+=(gauss[vl+3]*gvall(3)) >> 15;
+         l=s= vr;
         }
        else
         {