- if(dwNewChannel&(1<<ch)) StartSound(ch); // start new sound
- if(!(dwChannelOn&(1<<ch))) continue; // channel not playing? next
-
- if(s_chan[ch].iActFreq!=s_chan[ch].iUsedFreq) // new psx frequency?
- VoiceChangeFrequency(ch);
-
- if(s_chan[ch].bNoise)
- d=do_samples_noise(ch, ns_from, ns_to);
- else if(s_chan[ch].bFMod==2 || (s_chan[ch].bFMod==0 && iUseInterpolation==0))
- d=do_samples_noint(ch, ns_from, ns_to);
- else if(s_chan[ch].bFMod==0 && iUseInterpolation==1)
- d=do_samples_simple(ch, ns_from, ns_to);
- else
- d=do_samples_default(ch, ns_from, ns_to);
- if(d>=0)
- {
- bIRQReturn=1;
- lastch=ch;
- lastns=ns_to=d;
- }
-
- MixADSR(ch, ns_from, ns_to);
-
- if(s_chan[ch].bFMod==2) // fmod freq channel
- memcpy(iFMod, ChanBuf, sizeof(iFMod));
- else
- {
- int lv=s_chan[ch].iLeftVolume;
- int rv=s_chan[ch].iRightVolume;
-
- for(ns=ns_from;ns<ns_to;ns++)
- {
- int sval = ChanBuf[ns];
- int l, r;
-
- //////////////////////////////////////////////
- // ok, left/right sound volume (psx volume goes from 0 ... 0x3fff)
-
- l=(sval*lv)>>14;
- r=(sval*rv)>>14;
- SSumLR[ns*2] +=l;
- SSumLR[ns*2+1]+=r;
-
- //////////////////////////////////////////////
- // now let us store sound data for reverb
-
- if(s_chan[ch].bRVBActive) StoreREVERB(ch,ns,l,r);
- }
- }