- worker->ch[ch].spos = s_chan[ch].spos;
- worker->ch[ch].sbpos = s_chan[ch].iSBPos;
- worker->ch[ch].sinc = s_chan[ch].sinc;
- worker->ch[ch].adsr = s_chan[ch].ADSRX;
- worker->ch[ch].start = s_chan[ch].pCurr - spu.spuMemC;
- worker->ch[ch].loop = s_chan[ch].pLoop - spu.spuMemC;
- if (s_chan[ch].prevflags & 1)
- worker->ch[ch].start = worker->ch[ch].loop;
-
- worker->ch[ch].ns_to = do_samples_skip(ch, ns_to);
+ s_chan = &spu.s_chan[ch];
+ work->ch[ch].spos = s_chan->spos;
+ work->ch[ch].sbpos = s_chan->iSBPos;
+ work->ch[ch].sinc = s_chan->sinc;
+ work->ch[ch].adsr = s_chan->ADSRX;
+ work->ch[ch].vol_l = s_chan->iLeftVolume;
+ work->ch[ch].vol_r = s_chan->iRightVolume;
+ work->ch[ch].start = s_chan->pCurr - spu.spuMemC;
+ work->ch[ch].loop = s_chan->pLoop - spu.spuMemC;
+ work->ch[ch].bNoise = s_chan->bNoise;
+ work->ch[ch].bFMod = s_chan->bFMod;
+ work->ch[ch].bRVBActive = s_chan->bRVBActive;
+ work->ch[ch].bNewPitch = s_chan->bNewPitch;
+ if (s_chan->prevflags & 1)
+ work->ch[ch].start = work->ch[ch].loop;
+
+ d = do_samples_skip(ch, ns_to);
+ work->ch[ch].ns_to = d;
+
+ // note: d is not accurate on skip
+ d = SkipADSR(&s_chan->ADSRX, d);
+ if (d < ns_to) {
+ spu.dwChannelsAudible &= ~(1 << ch);
+ s_chan->ADSRX.State = ADSR_RELEASE;
+ s_chan->ADSRX.EnvelopeVol = 0;
+ }
+ s_chan->bNewPitch = 0;