spu: stop at 0 volume
authornotaz <notasas@gmail.com>
Thu, 15 Nov 2012 22:30:32 +0000 (00:30 +0200)
committernotaz <notasas@gmail.com>
Sat, 17 Nov 2012 23:40:00 +0000 (01:40 +0200)
plugins/dfsound/adsr.c

index e4873df..79f593c 100644 (file)
@@ -46,6 +46,10 @@ void InitADSR(void)                                    // INIT ADSR
 \r
   RateTableAdd[lcv] = ((7 - (lcv&3)) << 16) / denom;\r
   RateTableSub[lcv] = ((-8 + (lcv&3)) << 16) / denom;\r
+\r
+  // XXX: this is wrong, we need more bits..\r
+  if (RateTableAdd[lcv] == 0)\r
+    RateTableAdd[lcv] = 1;\r
  }\r
 }\r
 \r
@@ -67,12 +71,13 @@ static void MixADSR(int ch, int ns, int ns_to)         // MIX ADSR
  if (s_chan[ch].bStop)                                 // should be stopped:\r
  {                                                     // do release\r
    val = RateTableSub[s_chan[ch].ADSRX.ReleaseRate * 4];\r
+\r
    if (s_chan[ch].ADSRX.ReleaseModeExp)\r
    {\r
      for (; ns < ns_to; ns++)\r
      {\r
        EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16);\r
-       if (EnvelopeVol < 0)\r
+       if (EnvelopeVol <= 0)\r
          break;\r
 \r
        ChanBuf[ns] *= EnvelopeVol >> 21;\r
@@ -84,7 +89,7 @@ static void MixADSR(int ch, int ns, int ns_to)         // MIX ADSR
      for (; ns < ns_to; ns++)\r
      {\r
        EnvelopeVol += val;\r
-       if (EnvelopeVol < 0)\r
+       if (EnvelopeVol <= 0)\r
          break;\r
 \r
        ChanBuf[ns] *= EnvelopeVol >> 21;\r
@@ -92,7 +97,7 @@ static void MixADSR(int ch, int ns, int ns_to)         // MIX ADSR
      }\r
    }\r
 \r
-   if (EnvelopeVol < 0)\r
+   if (EnvelopeVol <= 0)\r
      goto stop;\r
 \r
    goto done;\r