spu: handle stop better, split main func more
[pcsx_rearmed.git] / plugins / dfsound / adsr.c
index c1e98b3..976315d 100644 (file)
@@ -63,10 +63,10 @@ INLINE void StartADSR(int ch)                          // MIX ADSR
 \r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-static void MixADSR(int ch, int ns, int ns_to)         // MIX ADSR\r
+static int MixADSR(int ch, int ns_to)                  // MIX ADSR\r
 {\r
  int EnvelopeVol = s_chan[ch].ADSRX.EnvelopeVol;\r
- int val, rto, level;\r
+ int ns = 0, val, rto, level;\r
 \r
  if (s_chan[ch].bStop)                                 // should be stopped:\r
  {                                                     // do release\r
@@ -97,9 +97,6 @@ static void MixADSR(int ch, int ns, int ns_to)         // MIX ADSR
      }\r
    }\r
 \r
-   if (EnvelopeVol <= 0)\r
-     goto stop;\r
-\r
    goto done;\r
  }\r
 \r
@@ -160,7 +157,10 @@ static void MixADSR(int ch, int ns, int ns_to)         // MIX ADSR
      if (s_chan[ch].ADSRX.SustainIncrease)\r
      {\r
        if (EnvelopeVol >= 0x7fff0000)\r
+       {\r
+         ns = ns_to;\r
          break;\r
+       }\r
 \r
        rto = 0;\r
        if (s_chan[ch].ADSRX.SustainModeExp && EnvelopeVol >= 0x60000000)\r
@@ -173,6 +173,7 @@ static void MixADSR(int ch, int ns, int ns_to)         // MIX ADSR
          if ((unsigned int)EnvelopeVol >= 0x7fe00000)\r
          {\r
            EnvelopeVol = 0x7fffffff;\r
+           ns = ns_to;\r
            break;\r
          }\r
 \r
@@ -189,7 +190,7 @@ static void MixADSR(int ch, int ns, int ns_to)         // MIX ADSR
          {\r
            EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16);\r
            if (EnvelopeVol < 0) \r
-             goto stop;\r
+             break;\r
 \r
            ChanBuf[ns] *= EnvelopeVol >> 21;\r
            ChanBuf[ns] >>= 10;\r
@@ -201,7 +202,7 @@ static void MixADSR(int ch, int ns, int ns_to)         // MIX ADSR
          {\r
            EnvelopeVol += val;\r
            if (EnvelopeVol < 0) \r
-             goto stop;\r
+             break;\r
 \r
            ChanBuf[ns] *= EnvelopeVol >> 21;\r
            ChanBuf[ns] >>= 10;\r
@@ -213,12 +214,7 @@ static void MixADSR(int ch, int ns, int ns_to)         // MIX ADSR
 \r
 done:\r
  s_chan[ch].ADSRX.EnvelopeVol = EnvelopeVol;\r
- return;\r
-\r
-stop:\r
- memset(&ChanBuf[ns], 0, (ns_to - ns) * sizeof(ChanBuf[0]));\r
- s_chan[ch].ADSRX.EnvelopeVol = 0;\r
- spu.dwChannelOn &= ~(1<<ch);\r
+ return ns;\r
 }\r
 \r
 #endif\r