spu: compact chan structure a bit
[pcsx_rearmed.git] / plugins / dfsound / adsr.c
index 2496e46..1e397af 100644 (file)
@@ -53,8 +53,7 @@ void InitADSR(void)                                    // INIT ADSR
 \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
@@ -86,13 +85,15 @@ INLINE int MixADSR(int ch)                             // MIX ADSR
    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
@@ -116,8 +117,7 @@ INLINE int MixADSR(int ch)                             // MIX ADSR
        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
@@ -140,8 +140,7 @@ INLINE int MixADSR(int ch)                             // MIX ADSR
        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
@@ -191,8 +190,7 @@ INLINE int MixADSR(int ch)                             // MIX ADSR
          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