X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=plugins%2Fdfsound%2Fxa.c;h=b3ac01d94359be44677168d97f5d35e2e30576b7;hb=20ed712f92d53fa7d51a4b805af997f5770077ae;hp=c3658af41b862a304f82446f3b1cab09ca6077de;hpb=4197fb21f37842640807bfed0f05eb49df7f350b;p=pcsx_rearmed.git diff --git a/plugins/dfsound/xa.c b/plugins/dfsound/xa.c index c3658af4..b3ac01d9 100644 --- a/plugins/dfsound/xa.c +++ b/plugins/dfsound/xa.c @@ -16,6 +16,7 @@ ***************************************************************************/ #include "stdafx.h" +#include "spu.h" #define _IN_XA #include @@ -38,7 +39,7 @@ static int gauss_window[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // MIX XA & CDDA //////////////////////////////////////////////////////////////////////// -INLINE void MixXA(int *SSumLR, int ns_to, int decode_pos) +INLINE void MixXA(int *SSumLR, int *RVB, int ns_to, int decode_pos) { int cursor = decode_pos; int ns; @@ -50,18 +51,26 @@ INLINE void MixXA(int *SSumLR, int ns_to, int decode_pos) if(spu.XAPlay == spu.XAFeed) spu.XARepeat--; - for(ns = 0; ns < ns_to*2; ) + for(ns = 0; ns < ns_to*2; ns += 2) { if(spu.XAPlay != spu.XAFeed) v=*spu.XAPlay++; if(spu.XAPlay == spu.XAEnd) spu.XAPlay=spu.XAStart; l = ((int)(short)v * spu.iLeftXAVol) >> 15; r = ((int)(short)(v >> 16) * spu.iLeftXAVol) >> 15; - SSumLR[ns++] += l; - SSumLR[ns++] += r; + if (spu.spuCtrl & CTRL_CD) + { + SSumLR[ns+0] += l; + SSumLR[ns+1] += r; + } + if (unlikely(spu.spuCtrl & CTRL_CDREVERB)) + { + RVB[ns+0] += l; + RVB[ns+1] += r; + } - spu.spuMem[cursor] = v; - spu.spuMem[cursor + 0x400/2] = v >> 16; + spu.spuMem[cursor] = HTOLE16(v); + spu.spuMem[cursor + 0x400/2] = HTOLE16(v >> 16); cursor = (cursor + 1) & 0x1ff; } spu.XALastVal = v; @@ -70,18 +79,26 @@ INLINE void MixXA(int *SSumLR, int ns_to, int decode_pos) // hence this 'ns_to < 8' else if(spu.CDDAPlay != spu.CDDAFeed || ns_to < 8) { - for(ns = 0; ns < ns_to*2; ) + for(ns = 0; ns < ns_to*2; ns += 2) { if(spu.CDDAPlay != spu.CDDAFeed) v=*spu.CDDAPlay++; if(spu.CDDAPlay == spu.CDDAEnd) spu.CDDAPlay=spu.CDDAStart; l = ((int)(short)v * spu.iLeftXAVol) >> 15; r = ((int)(short)(v >> 16) * spu.iLeftXAVol) >> 15; - SSumLR[ns++] += l; - SSumLR[ns++] += r; + if (spu.spuCtrl & CTRL_CD) + { + SSumLR[ns+0] += l; + SSumLR[ns+1] += r; + } + if (unlikely(spu.spuCtrl & CTRL_CDREVERB)) + { + RVB[ns+0] += l; + RVB[ns+1] += r; + } - spu.spuMem[cursor] = v; - spu.spuMem[cursor + 0x400/2] = v >> 16; + spu.spuMem[cursor] = HTOLE16(v); + spu.spuMem[cursor + 0x400/2] = HTOLE16(v >> 16); cursor = (cursor + 1) & 0x1ff; } spu.XALastVal = v; @@ -94,6 +111,7 @@ INLINE void MixXA(int *SSumLR, int ns_to, int decode_pos) // small linux time helper... only used for watchdog //////////////////////////////////////////////////////////////////////// +#if 0 static unsigned long timeGetTime_spu() { #if defined(NO_OS) @@ -106,19 +124,19 @@ static unsigned long timeGetTime_spu() return tv.tv_sec * 1000 + tv.tv_usec/1000; // to do that, but at least it works #endif } +#endif //////////////////////////////////////////////////////////////////////// // FEED XA //////////////////////////////////////////////////////////////////////// -INLINE void FeedXA(xa_decode_t *xap) +void FeedXA(const xa_decode_t *xap) { int sinc,spos,i,iSize,iPlace,vl,vr; if(!spu.bSPUIsOpen) return; - spu.xapGlobal = xap; // store info for save states - spu.XARepeat = 100; // set up repeat + spu.XARepeat = 3; // set up repeat #if 0//def XA_HACK iSize=((45500*xap->nsamples)/xap->freq); // get size @@ -133,6 +151,7 @@ INLINE void FeedXA(xa_decode_t *xap) if(iPlace==0) return; // no place at all //----------------------------------------------------// +#if 0 if(spu_config.iXAPitch) // pitch change option? { static DWORD dwLT=0; @@ -169,6 +188,7 @@ INLINE void FeedXA(xa_decode_t *xap) if(iLastSize) iSize=iLastSize; } } +#endif //----------------------------------------------------// spos=0x10000L; @@ -179,6 +199,7 @@ INLINE void FeedXA(xa_decode_t *xap) uint32_t * pS=(uint32_t *)xap->pcm; uint32_t l=0; +#if 0 if(spu_config.iXAPitch) { int32_t l1,l2;short s; @@ -195,16 +216,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 { @@ -238,6 +259,7 @@ INLINE void FeedXA(xa_decode_t *xap) } } else +#endif { for(i=0;i> 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 { @@ -290,6 +312,7 @@ INLINE void FeedXA(xa_decode_t *xap) unsigned short * pS=(unsigned short *)xap->pcm; uint32_t l;short s=0; +#if 0 if(spu_config.iXAPitch) { int32_t l1; @@ -304,11 +327,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 @@ -337,6 +360,7 @@ INLINE void FeedXA(xa_decode_t *xap) } } else +#endif { for(i=0;i> 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 { @@ -385,12 +409,14 @@ INLINE void FeedXA(xa_decode_t *xap) // FEED CDDA //////////////////////////////////////////////////////////////////////// -INLINE int FeedCDDA(unsigned char *pcm, int nBytes) +void FeedCDDA(unsigned char *pcm, int nBytes) { int space; space=(spu.CDDAPlay-spu.CDDAFeed-1)*4 & (CDDA_BUFFER_SIZE - 1); - if(space0) { @@ -406,8 +432,7 @@ INLINE int FeedCDDA(unsigned char *pcm, int nBytes) nBytes-=space; pcm+=space; } - - return 0x676f; // rearmed_go } #endif +// vim:shiftwidth=1:expandtab