- d = worker->ch[ch].ns_to;
- spos = worker->ch[ch].spos;
- sbpos = worker->ch[ch].sbpos;
- sinc = worker->ch[ch].sinc;
-
- s_chan = &spu.s_chan[ch];
- SB = s_chan->SB;
-
- if (s_chan->bNoise)
- do_lsfr_samples(d, worker->ctrl, &spu.dwNoiseCount, &spu.dwNoiseVal);
- else if (s_chan->bFMod == 2
- || (s_chan->bFMod == 0 && spu_config.iUseInterpolation == 0))
- do_samples_noint(decode_block_work, ch, d, SB, sinc, &spos, &sbpos);
- else if (s_chan->bFMod == 0 && spu_config.iUseInterpolation == 1)
- do_samples_simple(decode_block_work, ch, d, SB, sinc, &spos, &sbpos);
+ d = work->ch[ch].ns_to;
+ spos = work->ch[ch].spos;
+ sbpos = work->ch[ch].sbpos;
+ sinc = work->ch[ch].sinc;
+
+ SB = spu.SB + ch * SB_SIZE;
+ if (work->ch[ch].bNewPitch)
+ SB[32] = 1; // reset interpolation
+
+ if (work->ch[ch].bNoise)
+ do_lsfr_samples(d, work->ctrl, &spu.dwNoiseCount, &spu.dwNoiseVal);
+ else if (work->ch[ch].bFMod == 2
+ || (work->ch[ch].bFMod == 0 && spu_config.iUseInterpolation == 0))
+ do_samples_noint(decode_block_work, work, ch, d, SB, sinc, &spos, &sbpos);
+ else if (work->ch[ch].bFMod == 0 && spu_config.iUseInterpolation == 1)
+ do_samples_simple(decode_block_work, work, ch, d, SB, sinc, &spos, &sbpos);