spu: avoid relying on signed overflow undefined behavior
authornotaz <notasas@gmail.com>
Tue, 26 Sep 2023 22:20:27 +0000 (01:20 +0300)
committernotaz <notasas@gmail.com>
Wed, 27 Sep 2023 22:11:34 +0000 (01:11 +0300)
didn't seem to cause any issue in practice, but who knows with
all the different compilers

plugins/dfsound/adsr.c

index 9e32862..cb366dc 100644 (file)
@@ -65,7 +65,7 @@ INLINE void StartADSR(int ch)                          // MIX ADSR
 \r
 static int MixADSR(ADSRInfoEx *adsr, int ns_to)\r
 {\r
- int EnvelopeVol = adsr->EnvelopeVol;\r
unsigned int EnvelopeVol = adsr->EnvelopeVol;\r
  int ns = 0, val, rto, level;\r
 \r
  if (adsr->State == ADSR_RELEASE)\r
@@ -77,10 +77,10 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to)
      for (; ns < ns_to; ns++)\r
      {\r
        EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16);\r
-       if (EnvelopeVol <= 0)\r
+       if ((signed int)EnvelopeVol <= 0)\r
          break;\r
 \r
-       ChanBuf[ns] *= EnvelopeVol >> 21;\r
+       ChanBuf[ns] *= (signed int)EnvelopeVol >> 21;\r
        ChanBuf[ns] >>= 10;\r
      }\r
    }\r
@@ -89,10 +89,10 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to)
      for (; ns < ns_to; ns++)\r
      {\r
        EnvelopeVol += val;\r
-       if (EnvelopeVol <= 0)\r
+       if ((signed int)EnvelopeVol <= 0)\r
          break;\r
 \r
-       ChanBuf[ns] *= EnvelopeVol >> 21;\r
+       ChanBuf[ns] *= (signed int)EnvelopeVol >> 21;\r
        ChanBuf[ns] >>= 10;\r
      }\r
    }\r
@@ -111,14 +111,14 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to)
      for (; ns < ns_to; ns++)\r
      {\r
        EnvelopeVol += val;\r
-       if (EnvelopeVol < 0)\r
+       if ((signed int)EnvelopeVol < 0) // overflow\r
         break;\r
 \r
-       ChanBuf[ns] *= EnvelopeVol >> 21;\r
+       ChanBuf[ns] *= (signed int)EnvelopeVol >> 21;\r
        ChanBuf[ns] >>= 10;\r
      }\r
 \r
-     if (EnvelopeVol < 0) // overflow\r
+     if ((signed int)EnvelopeVol < 0) // overflow\r
      {\r
        EnvelopeVol = 0x7fffffff;\r
        adsr->State = ADSR_DECAY;\r
@@ -136,7 +136,7 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to)
      for (; ns < ns_to; )\r
      {\r
        EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16);\r
-       if (EnvelopeVol < 0)\r
+       if ((signed int)EnvelopeVol < 0)\r
          EnvelopeVol = 0;\r
 \r
        ChanBuf[ns] *= EnvelopeVol >> 21;\r
@@ -170,14 +170,14 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to)
        for (; ns < ns_to; ns++)\r
        {\r
          EnvelopeVol += val;\r
-         if ((unsigned int)EnvelopeVol >= 0x7fe00000)\r
+         if (EnvelopeVol >= 0x7fe00000)\r
          {\r
            EnvelopeVol = 0x7fffffff;\r
            ns = ns_to;\r
            break;\r
          }\r
 \r
-         ChanBuf[ns] *= EnvelopeVol >> 21;\r
+         ChanBuf[ns] *= (signed int)EnvelopeVol >> 21;\r
          ChanBuf[ns] >>= 10;\r
        }\r
      }\r
@@ -189,10 +189,10 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to)
          for (; ns < ns_to; ns++)\r
          {\r
            EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16);\r
-           if (EnvelopeVol < 0) \r
+           if ((signed int)EnvelopeVol < 0)\r
              break;\r
 \r
-           ChanBuf[ns] *= EnvelopeVol >> 21;\r
+           ChanBuf[ns] *= (signed int)EnvelopeVol >> 21;\r
            ChanBuf[ns] >>= 10;\r
          }\r
        }\r
@@ -201,10 +201,10 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to)
          for (; ns < ns_to; ns++)\r
          {\r
            EnvelopeVol += val;\r
-           if (EnvelopeVol < 0) \r
+           if ((signed int)EnvelopeVol < 0)\r
              break;\r
 \r
-           ChanBuf[ns] *= EnvelopeVol >> 21;\r
+           ChanBuf[ns] *= (signed int)EnvelopeVol >> 21;\r
            ChanBuf[ns] >>= 10;\r
          }\r
        }\r
@@ -219,7 +219,7 @@ done:
 \r
 static int SkipADSR(ADSRInfoEx *adsr, int ns_to)\r
 {\r
- int EnvelopeVol = adsr->EnvelopeVol;\r
unsigned int EnvelopeVol = adsr->EnvelopeVol;\r
  int ns = 0, val, rto, level;\r
  int64_t v64;\r
 \r
@@ -231,7 +231,7 @@ static int SkipADSR(ADSRInfoEx *adsr, int ns_to)
      for (; ns < ns_to; ns++)\r
      {\r
        EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16);\r
-       if (EnvelopeVol <= 0)\r
+       if ((signed int)EnvelopeVol <= 0)\r
          break;\r
      }\r
    }\r
@@ -257,10 +257,10 @@ static int SkipADSR(ADSRInfoEx *adsr, int ns_to)
      for (; ns < ns_to; ns++)\r
      {\r
        EnvelopeVol += val;\r
-       if (EnvelopeVol < 0)\r
+       if ((signed int)EnvelopeVol < 0)\r
         break;\r
      }\r
-     if (EnvelopeVol < 0) // overflow\r
+     if ((signed int)EnvelopeVol < 0) // overflow\r
      {\r
        EnvelopeVol = 0x7fffffff;\r
        adsr->State = ADSR_DECAY;\r
@@ -278,7 +278,7 @@ static int SkipADSR(ADSRInfoEx *adsr, int ns_to)
      for (; ns < ns_to; )\r
      {\r
        EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16);\r
-       if (EnvelopeVol < 0)\r
+       if ((signed int)EnvelopeVol < 0)\r
          EnvelopeVol = 0;\r
 \r
        ns++;\r
@@ -320,7 +320,7 @@ static int SkipADSR(ADSRInfoEx *adsr, int ns_to)
          for (; ns < ns_to; ns++)\r
          {\r
            EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16);\r
-           if (EnvelopeVol < 0)\r
+           if ((signed int)EnvelopeVol < 0)\r
              break;\r
          }\r
        }\r
@@ -330,10 +330,7 @@ static int SkipADSR(ADSRInfoEx *adsr, int ns_to)
          v64 += (int64_t)val * (ns_to - ns);\r
          EnvelopeVol = (int)v64;\r
          if (v64 > 0)\r
-         {\r
            ns = ns_to;\r
-           break;\r
-         }\r
        }\r
      }\r
      break;\r