- 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 for(ns=ns_from;ns<ns_to;ns++)
- {
- int sval = ChanBuf[ns];
-
- {
- //////////////////////////////////////////////
- // ok, left/right sound volume (psx volume goes from 0 ... 0x3fff)
-
- SSumLR[ns*2] +=(sval*s_chan[ch].iLeftVolume)/0x4000L;
- SSumLR[ns*2+1]+=(sval*s_chan[ch].iRightVolume)/0x4000L;
-
- //////////////////////////////////////////////
- // now let us store sound data for reverb
-
- if(s_chan[ch].bRVBActive) StoreREVERB(ch,ns,sval);
- }
- }