X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fdfsound%2Fspu.c;h=7c12cdc742ad46926f299be4f6af8b8087d8f9b9;hp=b3bd0579d5e11cdf042b633b21812fa9491c3df2;hb=8048a6d763a5d74c6887ea511ba43e3124cd1bff;hpb=983a7cfdccceaa612267a1b045110b4f831d1495 diff --git a/plugins/dfsound/spu.c b/plugins/dfsound/spu.c index b3bd0579..7c12cdc7 100644 --- a/plugins/dfsound/spu.c +++ b/plugins/dfsound/spu.c @@ -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; @@ -398,9 +399,9 @@ INLINE int iGetInterpolationVal(int ch) static void do_irq(void) { - if(!(spuStat & STAT_IRQ)) + //if(!(spuStat & STAT_IRQ)) { - spuStat |= STAT_IRQ; + spuStat |= STAT_IRQ; // asserted status? if(irqCallback) irqCallback(); } } @@ -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; }