\r
INLINE void StartADSR(int ch) // MIX ADSR\r
{\r
- s_chan[ch].ADSRX.lVolume=1; // and init some adsr vars\r
- s_chan[ch].ADSRX.State=0;\r
+ s_chan[ch].ADSRX.State=0; // and init some adsr vars\r
s_chan[ch].ADSRX.EnvelopeVol=0;\r
}\r
\r
if(s_chan[ch].ADSRX.EnvelopeVol<0) \r
{\r
s_chan[ch].ADSRX.EnvelopeVol=0;\r
- s_chan[ch].bOn=0;\r
+ // don't stop if this chan can still cause irqs\r
+ if(!(spuCtrl&0x40) || (s_chan[ch].pCurr > pSpuIrq && s_chan[ch].pLoop > pSpuIrq))\r
+ //s_chan[ch].bOn=0;\r
+ s_chan[ch].pCurr=(unsigned char *)-1;\r
//s_chan[ch].bReverb=0;\r
//s_chan[ch].bNoise=0;\r
}\r
\r
- s_chan[ch].ADSRX.lVolume=s_chan[ch].ADSRX.EnvelopeVol>>21;\r
- return s_chan[ch].ADSRX.lVolume;\r
+ return s_chan[ch].ADSRX.EnvelopeVol>>21;\r
}\r
else // not stopped yet?\r
{\r
s_chan[ch].ADSRX.State=1;\r
}\r
\r
- s_chan[ch].ADSRX.lVolume=s_chan[ch].ADSRX.EnvelopeVol>>21;\r
- return s_chan[ch].ADSRX.lVolume;\r
+ return s_chan[ch].ADSRX.EnvelopeVol>>21;\r
}\r
//--------------------------------------------------//\r
if(s_chan[ch].ADSRX.State==1) // -> decay\r
s_chan[ch].ADSRX.State=2;\r
}\r
\r
- s_chan[ch].ADSRX.lVolume=s_chan[ch].ADSRX.EnvelopeVol>>21;\r
- return s_chan[ch].ADSRX.lVolume;\r
+ return s_chan[ch].ADSRX.EnvelopeVol>>21;\r
}\r
//--------------------------------------------------//\r
if(s_chan[ch].ADSRX.State==2) // -> sustain\r
s_chan[ch].ADSRX.EnvelopeVol=0;\r
}\r
}\r
- s_chan[ch].ADSRX.lVolume=s_chan[ch].ADSRX.EnvelopeVol>>21;\r
- return s_chan[ch].ADSRX.lVolume;\r
+ return s_chan[ch].ADSRX.EnvelopeVol>>21;\r
}\r
}\r
return 0;\r