X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=plugins%2Fdfsound%2Fxa.c;h=c416d19a72adfc2cb47240a47f10e1381990e533;hb=b9db55a9831ccbe3749abfc97ff49e5fb9379b29;hp=704847b4d9343e93ee4cbe0c7ca10c96bd209854;hpb=7931825ed8ef51dab3e37475d8126103ebc9fb6f;p=pcsx_rearmed.git diff --git a/plugins/dfsound/xa.c b/plugins/dfsound/xa.c index 704847b4..c416d19a 100644 --- a/plugins/dfsound/xa.c +++ b/plugins/dfsound/xa.c @@ -38,19 +38,18 @@ 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; + uint32_t v = spu.XALastVal; if(spu.XAPlay != spu.XAFeed || spu.XARepeat > 0) { if(spu.XAPlay == spu.XAFeed) spu.XARepeat--; - v = spu.XALastVal; for(ns = 0; ns < ns_to*2; ) { if(spu.XAPlay != spu.XAFeed) v=*spu.XAPlay++; @@ -67,21 +66,28 @@ INLINE void MixXA(int ns_to) } spu.XALastVal = v; } + // occasionally CDDAFeed underflows by a few samples due to poor timing, + // hence this 'ns_to < 8' + else if(spu.CDDAPlay != spu.CDDAFeed || ns_to < 8) + { + for(ns = 0; ns < ns_to*2; ) + { + if(spu.CDDAPlay != spu.CDDAFeed) v=*spu.CDDAPlay++; + if(spu.CDDAPlay == spu.CDDAEnd) spu.CDDAPlay=spu.CDDAStart; - for(ns = 0; ns < ns_to * 2 && spu.CDDAPlay!=spu.CDDAFeed && (spu.CDDAPlay!=spu.CDDAEnd-1||spu.CDDAFeed!=spu.CDDAStart);) - { - 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; + l = ((int)(short)v * spu.iLeftXAVol) >> 15; + r = ((int)(short)(v >> 16) * spu.iLeftXAVol) >> 15; + SSumLR[ns++] += l; + SSumLR[ns++] += r; - spu.spuMem[cursor] = v; - spu.spuMem[cursor + 0x400/2] = v >> 16; - cursor = (cursor + 1) & 0x1ff; - } + spu.spuMem[cursor] = v; + spu.spuMem[cursor + 0x400/2] = v >> 16; + cursor = (cursor + 1) & 0x1ff; + } + spu.XALastVal = v; + } + else + spu.XALastVal = 0; } //////////////////////////////////////////////////////////////////////// @@ -90,9 +96,15 @@ INLINE void MixXA(int ns_to) static unsigned long timeGetTime_spu() { +#if defined(NO_OS) + return 0; +#elif defined(_WIN32) + return GetTickCount(); +#else struct timeval tv; gettimeofday(&tv, 0); // well, maybe there are better ways return tv.tv_sec * 1000 + tv.tv_usec/1000; // to do that, but at least it works +#endif } //////////////////////////////////////////////////////////////////////// @@ -183,16 +195,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 { @@ -240,16 +252,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 { @@ -292,11 +304,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,11 +349,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 {