X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=plugins%2Fdfsound%2Fadsr.c;h=cb366dc4e3207564b9506748eb07bc4d593f0613;hb=0a42e81c36ab5ad2008ece5d9c288291e2f8c6fc;hp=69e55bdb2c07e620f4613b17f57bcd14b7a4c333;hpb=3bd31caf9e9f5ddab2bf4fbdb5a129f4972c45f3;p=pcsx_rearmed.git diff --git a/plugins/dfsound/adsr.c b/plugins/dfsound/adsr.c index 69e55bdb..cb366dc4 100644 --- a/plugins/dfsound/adsr.c +++ b/plugins/dfsound/adsr.c @@ -65,7 +65,7 @@ INLINE void StartADSR(int ch) // MIX ADSR static int MixADSR(ADSRInfoEx *adsr, int ns_to) { - int EnvelopeVol = adsr->EnvelopeVol; + unsigned int EnvelopeVol = adsr->EnvelopeVol; int ns = 0, val, rto, level; if (adsr->State == ADSR_RELEASE) @@ -77,10 +77,10 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to) for (; ns < ns_to; ns++) { EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16); - if (EnvelopeVol <= 0) + if ((signed int)EnvelopeVol <= 0) break; - ChanBuf[ns] *= EnvelopeVol >> 21; + ChanBuf[ns] *= (signed int)EnvelopeVol >> 21; ChanBuf[ns] >>= 10; } } @@ -89,10 +89,10 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to) for (; ns < ns_to; ns++) { EnvelopeVol += val; - if (EnvelopeVol <= 0) + if ((signed int)EnvelopeVol <= 0) break; - ChanBuf[ns] *= EnvelopeVol >> 21; + ChanBuf[ns] *= (signed int)EnvelopeVol >> 21; ChanBuf[ns] >>= 10; } } @@ -111,14 +111,14 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to) for (; ns < ns_to; ns++) { EnvelopeVol += val; - if (EnvelopeVol < 0) + if ((signed int)EnvelopeVol < 0) // overflow break; - ChanBuf[ns] *= EnvelopeVol >> 21; + ChanBuf[ns] *= (signed int)EnvelopeVol >> 21; ChanBuf[ns] >>= 10; } - if (EnvelopeVol < 0) // overflow + if ((signed int)EnvelopeVol < 0) // overflow { EnvelopeVol = 0x7fffffff; adsr->State = ADSR_DECAY; @@ -136,7 +136,7 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to) for (; ns < ns_to; ) { EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16); - if (EnvelopeVol < 0) + if ((signed int)EnvelopeVol < 0) EnvelopeVol = 0; ChanBuf[ns] *= EnvelopeVol >> 21; @@ -170,14 +170,14 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to) for (; ns < ns_to; ns++) { EnvelopeVol += val; - if ((unsigned int)EnvelopeVol >= 0x7fe00000) + if (EnvelopeVol >= 0x7fe00000) { EnvelopeVol = 0x7fffffff; ns = ns_to; break; } - ChanBuf[ns] *= EnvelopeVol >> 21; + ChanBuf[ns] *= (signed int)EnvelopeVol >> 21; ChanBuf[ns] >>= 10; } } @@ -189,10 +189,10 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to) for (; ns < ns_to; ns++) { EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16); - if (EnvelopeVol < 0) + if ((signed int)EnvelopeVol < 0) break; - ChanBuf[ns] *= EnvelopeVol >> 21; + ChanBuf[ns] *= (signed int)EnvelopeVol >> 21; ChanBuf[ns] >>= 10; } } @@ -201,10 +201,10 @@ static int MixADSR(ADSRInfoEx *adsr, int ns_to) for (; ns < ns_to; ns++) { EnvelopeVol += val; - if (EnvelopeVol < 0) + if ((signed int)EnvelopeVol < 0) break; - ChanBuf[ns] *= EnvelopeVol >> 21; + ChanBuf[ns] *= (signed int)EnvelopeVol >> 21; ChanBuf[ns] >>= 10; } } @@ -219,8 +219,9 @@ done: static int SkipADSR(ADSRInfoEx *adsr, int ns_to) { - int EnvelopeVol = adsr->EnvelopeVol; + unsigned int EnvelopeVol = adsr->EnvelopeVol; int ns = 0, val, rto, level; + int64_t v64; if (adsr->State == ADSR_RELEASE) { @@ -230,14 +231,16 @@ static int SkipADSR(ADSRInfoEx *adsr, int ns_to) for (; ns < ns_to; ns++) { EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16); - if (EnvelopeVol <= 0) + if ((signed int)EnvelopeVol <= 0) break; } } else { - EnvelopeVol += val * ns_to; - if (EnvelopeVol > 0) + v64 = EnvelopeVol; + v64 += (int64_t)val * ns_to; + EnvelopeVol = (int)v64; + if (v64 > 0) ns = ns_to; } goto done; @@ -254,10 +257,10 @@ static int SkipADSR(ADSRInfoEx *adsr, int ns_to) for (; ns < ns_to; ns++) { EnvelopeVol += val; - if (EnvelopeVol < 0) + if ((signed int)EnvelopeVol < 0) break; } - if (EnvelopeVol < 0) // overflow + if ((signed int)EnvelopeVol < 0) // overflow { EnvelopeVol = 0x7fffffff; adsr->State = ADSR_DECAY; @@ -275,7 +278,7 @@ static int SkipADSR(ADSRInfoEx *adsr, int ns_to) for (; ns < ns_to; ) { EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16); - if (EnvelopeVol < 0) + if ((signed int)EnvelopeVol < 0) EnvelopeVol = 0; ns++; @@ -293,24 +296,21 @@ static int SkipADSR(ADSRInfoEx *adsr, int ns_to) case ADSR_SUSTAIN: // -> sustain if (adsr->SustainIncrease) { + ns = ns_to; + if (EnvelopeVol >= 0x7fff0000) - { - ns = ns_to; break; - } rto = 0; if (adsr->SustainModeExp && EnvelopeVol >= 0x60000000) rto = 8; val = RateTableAdd[adsr->SustainRate + rto]; - EnvelopeVol += val * (ns_to - ns); - if ((unsigned int)EnvelopeVol >= 0x7fe00000) - { + v64 = EnvelopeVol; + v64 += (int64_t)val * (ns_to - ns); + EnvelopeVol = (int)v64; + if (v64 >= 0x7fe00000ll) EnvelopeVol = 0x7fffffff; - ns = ns_to; - break; - } } else { @@ -320,18 +320,17 @@ static int SkipADSR(ADSRInfoEx *adsr, int ns_to) for (; ns < ns_to; ns++) { EnvelopeVol += ((long long)val * EnvelopeVol) >> (15+16); - if (EnvelopeVol < 0) + if ((signed int)EnvelopeVol < 0) break; } } else { - EnvelopeVol += val * (ns_to - ns); - if (EnvelopeVol > 0) - { + v64 = EnvelopeVol; + v64 += (int64_t)val * (ns_to - ns); + EnvelopeVol = (int)v64; + if (v64 > 0) ns = ns_to; - break; - } } } break;