gpu_neon: do list resubmit detection
[pcsx_rearmed.git] / plugins / dfsound / xa.c
index fdae4f9..b45aef2 100644 (file)
@@ -22,6 +22,8 @@
 // will be included from spu.c
 #ifdef _IN_SPU
 
+#define XA_HACK
+
 ////////////////////////////////////////////////////////////////////////
 // XA GLOBALS
 ////////////////////////////////////////////////////////////////////////
@@ -61,40 +63,40 @@ INLINE void MixXA(void)
  int ns;
  uint32_t l;
 
- for(ns=0;ns<NSSIZE && XAPlay!=XAFeed;ns++)
+ for(ns=0;ns<NSSIZE*2 && XAPlay!=XAFeed;)
   {
    XALastVal=*XAPlay++;
    if(XAPlay==XAEnd) XAPlay=XAStart;
 #ifdef XA_HACK
-   SSumL[ns]+=(((short)(XALastVal&0xffff))       * iLeftXAVol)/32768;
-   SSumR[ns]+=(((short)((XALastVal>>16)&0xffff)) * iRightXAVol)/32768;
+   SSumLR[ns++]+=(((short)(XALastVal&0xffff))       * iLeftXAVol)/32768;
+   SSumLR[ns++]+=(((short)((XALastVal>>16)&0xffff)) * iRightXAVol)/32768;
 #else
-   SSumL[ns]+=(((short)(XALastVal&0xffff))       * iLeftXAVol)/32767;
-   SSumR[ns]+=(((short)((XALastVal>>16)&0xffff)) * iRightXAVol)/32767;
+   SSumLR[ns++]+=(((short)(XALastVal&0xffff))       * iLeftXAVol)/32767;
+   SSumLR[ns++]+=(((short)((XALastVal>>16)&0xffff)) * iRightXAVol)/32767;
 #endif
   }
 
  if(XAPlay==XAFeed && XARepeat)
   {
    XARepeat--;
-   for(;ns<NSSIZE;ns++)
+   for(;ns<NSSIZE*2;)
     {
 #ifdef XA_HACK
-     SSumL[ns]+=(((short)(XALastVal&0xffff))       * iLeftXAVol)/32768;
-     SSumR[ns]+=(((short)((XALastVal>>16)&0xffff)) * iRightXAVol)/32768;
+     SSumLR[ns++]+=(((short)(XALastVal&0xffff))       * iLeftXAVol)/32768;
+     SSumLR[ns++]+=(((short)((XALastVal>>16)&0xffff)) * iRightXAVol)/32768;
 #else
-     SSumL[ns]+=(((short)(XALastVal&0xffff))       * iLeftXAVol)/32767;
-     SSumR[ns]+=(((short)((XALastVal>>16)&0xffff)) * iRightXAVol)/32767;
+     SSumLR[ns++]+=(((short)(XALastVal&0xffff))       * iLeftXAVol)/32767;
+     SSumLR[ns++]+=(((short)((XALastVal>>16)&0xffff)) * iRightXAVol)/32767;
 #endif
     }
   }
 
- for(ns=0;ns<NSSIZE && CDDAPlay!=CDDAFeed && (CDDAPlay!=CDDAEnd-1||CDDAFeed!=CDDAStart);ns++)
+ for(ns=0;ns<NSSIZE*2 && CDDAPlay!=CDDAFeed && (CDDAPlay!=CDDAEnd-1||CDDAFeed!=CDDAStart);)
   {
    l=*CDDAPlay++;
    if(CDDAPlay==CDDAEnd) CDDAPlay=CDDAStart;
-   SSumL[ns]+=(((short)(l&0xffff))       * iLeftXAVol)/32767;
-   SSumR[ns]+=(((short)((l>>16)&0xffff)) * iRightXAVol)/32767;
+   SSumLR[ns++]+=(((short)(l&0xffff))       * iLeftXAVol) >> 15;
+   SSumLR[ns++]+=(((short)((l>>16)&0xffff)) * iRightXAVol) >> 15;
   }
 }
 
@@ -122,7 +124,7 @@ INLINE void FeedXA(xa_decode_t *xap)
  xapGlobal = xap;                                      // store info for save states
  XARepeat  = 100;                                      // set up repeat
 
-#ifdef XA_HACK
+#if 0//def XA_HACK
  iSize=((45500*xap->nsamples)/xap->freq);              // get size
 #else
  iSize=((44100*xap->nsamples)/xap->freq);              // get size
@@ -220,13 +222,11 @@ INLINE void FeedXA(xa_decode_t *xap)
        s=(short)LOWORD(l);
        l1=s;
        l1=(l1*iPlace)/iSize;
-       if(l1<-32767) l1=-32767;
-       if(l1> 32767) l1=32767;
+       ssat32_to_16(l1);
        s=(short)HIWORD(l);
        l2=s;
        l2=(l2*iPlace)/iSize;
-       if(l2<-32767) l2=-32767;
-       if(l2> 32767) l2=32767;
+       ssat32_to_16(l2);
        l=(l1&0xffff)|(l2<<16);
 
        *XAFeed++=l;
@@ -326,8 +326,7 @@ INLINE void FeedXA(xa_decode_t *xap)
         }
 
        l1=(l1*iPlace)/iSize;
-       if(l1<-32767) l1=-32767;
-       if(l1> 32767) l1=32767;
+       ssat32_to_16(l1);
        l=(l1&0xffff)|(l1<<16);
        *XAFeed++=l;
 
@@ -359,7 +358,6 @@ INLINE void FeedXA(xa_decode_t *xap)
          vr+=(gauss[vl+2]*gvall(2))&~2047;
          vr+=(gauss[vl+3]*gvall(3))&~2047;
          l=s= vr >> 11;
-         l &= 0xffff;
         }
        else
         {
@@ -371,6 +369,7 @@ INLINE void FeedXA(xa_decode_t *xap)
          l=s;
         }
 
+       l &= 0xffff;
        *XAFeed++=(l|(l<<16));
 
        if(XAFeed==XAEnd) XAFeed=XAStart;