s_chan->iSBPos=27;
s_chan->spos=0;
+ s_chan->pCurr = spu.spuMemC+((regAreaGet(ch,6)&~1)<<3);
+
spu.dwNewChannel&=~(1<<ch); // clear new channel bit
spu.dwChannelOn|=1<<ch;
spu.dwChannelDead&=~(1<<ch);
int vl, vr;int gpos;
vl = (spos >> 6) & ~3;
gpos = SB[28];
- vr=(gauss[vl]*(int)gval0)&~2047;
- vr+=(gauss[vl+1]*gval(1))&~2047;
- vr+=(gauss[vl+2]*gval(2))&~2047;
- vr+=(gauss[vl+3]*gval(3))&~2047;
- fa = vr>>11;
+ vr=(gauss[vl]*(int)gval0) >> 15;
+ vr+=(gauss[vl+1]*gval(1)) >> 15;
+ vr+=(gauss[vl+2]*gval(2)) >> 15;
+ vr+=(gauss[vl+3]*gval(3)) >> 15;
+ fa = vr;
} break;
//--------------------------------------------------//
case 1: // simple interpolation
decode_block_data(SB, start + 2, predict_nr, shift_factor);
flags = start[1];
- if (flags & 4)
+ if (flags & 4 && (!s_chan->bIgnoreLoop))
s_chan->pLoop = start; // loop adress
start += 16;
spu.s_chan[i].ADSRX.SustainIncrease = 1;
spu.s_chan[i].pLoop = spu.spuMemC;
spu.s_chan[i].pCurr = spu.spuMemC;
+ spu.s_chan[i].bIgnoreLoop = 0;
}
spu.bSpuInit=1; // flag: we are inited