X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fdfsound%2Fadsr.c;h=9e328620a0ca52201c9ec1193ce43b6d5820becc;hp=69e55bdb2c07e620f4613b17f57bcd14b7a4c333;hb=HEAD;hpb=3bd31caf9e9f5ddab2bf4fbdb5a129f4972c45f3 diff --git a/plugins/dfsound/adsr.c b/plugins/dfsound/adsr.c index 69e55bdb..23ff3df6 100644 --- a/plugins/dfsound/adsr.c +++ b/plugins/dfsound/adsr.c @@ -63,9 +63,9 @@ INLINE void StartADSR(int ch) // MIX ADSR //////////////////////////////////////////////////////////////////////// -static int MixADSR(ADSRInfoEx *adsr, int ns_to) +static int MixADSR(int *samples, 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,11 +77,11 @@ 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] >>= 10; + samples[ns] *= (signed int)EnvelopeVol >> 21; + samples[ns] >>= 10; } } else @@ -89,11 +89,11 @@ 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] >>= 10; + samples[ns] *= (signed int)EnvelopeVol >> 21; + samples[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] >>= 10; + samples[ns] *= (signed int)EnvelopeVol >> 21; + samples[ns] >>= 10; } - if (EnvelopeVol < 0) // overflow + if ((signed int)EnvelopeVol < 0) // overflow { EnvelopeVol = 0x7fffffff; adsr->State = ADSR_DECAY; @@ -136,11 +136,11 @@ 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; - ChanBuf[ns] >>= 10; + samples[ns] *= EnvelopeVol >> 21; + samples[ns] >>= 10; ns++; if (((EnvelopeVol >> 27) & 0xf) <= level) @@ -170,15 +170,15 @@ 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] >>= 10; + samples[ns] *= (signed int)EnvelopeVol >> 21; + samples[ns] >>= 10; } } else @@ -189,11 +189,11 @@ 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] >>= 10; + samples[ns] *= (signed int)EnvelopeVol >> 21; + samples[ns] >>= 10; } } else @@ -201,11 +201,11 @@ 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] >>= 10; + samples[ns] *= (signed int)EnvelopeVol >> 21; + samples[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;